diff --git a/clients/eclipse/feature/feature.xml b/clients/eclipse/feature/feature.xml index bc946e5802f4..a7d93cc17569 100644 --- a/clients/eclipse/feature/feature.xml +++ b/clients/eclipse/feature/feature.xml @@ -2,7 +2,7 @@ @@ -19,6 +19,6 @@ + version="0.0.2.25"/> diff --git a/clients/eclipse/plugin/META-INF/MANIFEST.MF b/clients/eclipse/plugin/META-INF/MANIFEST.MF index 35026e30e7bd..606601c995ec 100644 --- a/clients/eclipse/plugin/META-INF/MANIFEST.MF +++ b/clients/eclipse/plugin/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Tabby Plugin for Eclipse Bundle-SymbolicName: com.tabbyml.tabby4eclipse;singleton:=true -Bundle-Version: 0.0.2.24 +Bundle-Version: 0.0.2.25 Bundle-Activator: com.tabbyml.tabby4eclipse.Activator Bundle-Vendor: com.tabbyml Require-Bundle: org.eclipse.ui, diff --git a/clients/eclipse/plugin/plugin.xml b/clients/eclipse/plugin/plugin.xml index 43b88aaef881..eb2061be7bb2 100644 --- a/clients/eclipse/plugin/plugin.xml +++ b/clients/eclipse/plugin/plugin.xml @@ -102,27 +102,42 @@ + name="Tabby Code Completion"> + + + + + + + name="Tabby Chat"> @@ -172,6 +187,18 @@ class="com.tabbyml.tabby4eclipse.commands.OpenPreferences" commandId="com.tabbyml.tabby4eclipse.commands.openPreferences"> + + + + + + @@ -221,6 +248,24 @@ schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" sequence="M1+M3+L"> + + + + + + job = LanguageServerService + .getInstance().getServer().execute((server) -> { + ITextDocumentServiceExt textDocumentService = ((ILanguageServer) server) + .getTextDocumentServiceExt(); + return textDocumentService.inlineCompletion(params); + }); + job.thenAccept((completionList) -> { + if (completionList == null || request != current.request) { + return; + } + try { + InlineCompletionList list = request.convertInlineCompletionList(completionList); + int cycleIndex = calcCycleIndex(index, list.getItems().size(), step); + current.response = new InlineCompletionContext.Response(list, cycleIndex); + renderer.show(textViewer, current.response.getActiveCompletionItem()); + EventParams eventParams = buildTelemetryEventParams(EventParams.Type.VIEW); + postTelemetryEvent(eventParams); + } catch (BadLocationException e) { + logger.error("Failed to show inline completion.", e); + } + }); + InlineCompletionContext context = new InlineCompletionContext(request, job, current.response); + current = context; + } else { + int cycleIndex = calcCycleIndex(current.response.getItemIndex(), + current.response.completionList.getItems().size(), step); + current.response.setItemIndex(cycleIndex); + renderer.show(textViewer, current.response.getActiveCompletionItem()); + EventParams eventParams = buildTelemetryEventParams(EventParams.Type.VIEW); + postTelemetryEvent(eventParams); + } + } + + private int calcCycleIndex(int index, int listSize, int step) { + if (listSize <= 1) { + return index; + } + int cycleIndex = index + step; + while (cycleIndex >= listSize) { + cycleIndex -= listSize; + } + if (cycleIndex < 0) { + cycleIndex += listSize; + } + return cycleIndex; + } + @Override public void accept() { ITextEditor textEditor = EditorUtils.getActiveTextEditor(); @@ -258,12 +335,25 @@ public Response(InlineCompletionList completionList) { this.itemIndex = 0; } + public Response(InlineCompletionList completionList, int itemIndex) { + this.completionList = completionList; + this.itemIndex = itemIndex; + } + public InlineCompletionItem getActiveCompletionItem() { if (itemIndex >= 0 && itemIndex < completionList.getItems().size()) { return completionList.getItems().get(itemIndex); } return null; } + + public int getItemIndex() { + return itemIndex; + } + + public void setItemIndex(int itemIndex) { + this.itemIndex = itemIndex; + } } private Request request;