@Test public void testChangeEventUpdatesStoredText() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<to uri=\"\" xmlns=\"http://camel.apache.org/schema/blueprint\"></to>\n"); DidChangeTextDocumentParams changeEvent = new DidChangeTextDocumentParams(); VersionedTextDocumentIdentifier textDocument = new VersionedTextDocumentIdentifier(); textDocument.setUri(DUMMY_URI); changeEvent.setTextDocument(textDocument); TextDocumentContentChangeEvent contentChange = new TextDocumentContentChangeEvent("<to xmlns=\"http://camel.apache.org/schema/blueprint\" uri=\"\"></to>\n"); changeEvent.setContentChanges(Collections.singletonList(contentChange)); camelLanguageServer.getTextDocumentService().didChange(changeEvent); //check old position doesn't provide completion CompletableFuture<Either<List<CompletionItem>, CompletionList>> completionsAtOldPosition = getCompletionFor(camelLanguageServer, new Position(0, 11)); assertThat(completionsAtOldPosition.get().getLeft()).isEmpty(); //check new position provides completion CompletableFuture<Either<List<CompletionItem>, CompletionList>> completionsAtNewPosition = getCompletionFor(camelLanguageServer, new Position(0, 58)); assertThat(completionsAtNewPosition.get().getLeft()).isNotEmpty(); }
Either<List<CompletionItem>, CompletionList> completion(TextDocumentPositionParams position, IProgressMonitor monitor) { List<CompletionItem> completionItems = null; try { ICompilationUnit unit = JDTUtils.resolveCompilationUnit(position.getTextDocument().getUri()); completionItems = this.computeContentAssist(unit, position.getPosition().getLine(), position.getPosition().getCharacter(), monitor); } catch (OperationCanceledException ignorable) { // No need to pollute logs when query is cancelled monitor.setCanceled(true); } catch (Exception e) { JavaLanguageServerPlugin.logException("Problem with codeComplete for " + position.getTextDocument().getUri(), e); monitor.setCanceled(true); } CompletionList $ = new CompletionList(); if (monitor.isCanceled()) { $.setIsIncomplete(true); completionItems = null; JavaLanguageServerPlugin.logInfo("Completion request cancelled"); } else { JavaLanguageServerPlugin.logInfo("Completion request completed"); } $.setItems(completionItems == null ? Collections.emptyList() : completionItems); return Either.forRight($); }
@Override public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion(TextDocumentPositionParams position) { logInfo(">> document/completion"); CompletionHandler handler = new CompletionHandler(); final IProgressMonitor[] monitors = new IProgressMonitor[1]; CompletableFuture<Either<List<CompletionItem>, CompletionList>> result = computeAsync((cc) -> { monitors[0] = toMonitor(cc); if (Boolean.getBoolean(JAVA_LSP_JOIN_ON_COMPLETION)) { try { Job.getJobManager().join(DocumentLifeCycleHandler.DOCUMENT_LIFE_CYCLE_JOBS, monitors[0]); } catch (OperationCanceledException ignorable) { // No need to pollute logs when query is cancelled } catch (InterruptedException e) { JavaLanguageServerPlugin.logException(e.getMessage(), e); } } return handler.completion(position, monitors[0]); }); result.join(); if (monitors[0].isCanceled()) { result.cancel(true); } return result; }
@Test public void testCompletion_import_package() throws JavaModelException{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "import java.sq \n" + "public class Foo {\n"+ " void foo() {\n"+ " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "java.sq"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertEquals(1, list.getItems().size()); CompletionItem item = list.getItems().get(0); // Check completion item assertNull(item.getInsertText()); assertEquals("java.sql",item.getLabel()); assertEquals(CompletionItemKind.Module, item.getKind() ); assertEquals("999999215", item.getSortText()); assertNull(item.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(item).join(); assertNotNull(resolvedItem); TextEdit te = item.getTextEdit(); assertNotNull(te); assertEquals("java.sql.*;",te.getNewText()); assertNotNull(te.getRange()); Range range = te.getRange(); assertEquals(0, range.getStart().getLine()); assertEquals(7, range.getStart().getCharacter()); assertEquals(0, range.getEnd().getLine()); //Not checking the range end character }
public void testCompletion_plainTextDoc() throws Exception{ ICompilationUnit unit = getWorkingCopy( //@formatter:off "src/java/Foo.java", "import java.sq \n" + "public class Foo {\n"+ " void foo() {\n"+ " zz\n"+ " }\n\" }\\n\"+"+ "\n"+ "/** This should be <bold>plain</bold>.*/\n" + " void zzz() {}\n"+ "}\n"); //@formatter:off int[] loc = findCompletionLocation(unit, " zz"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertFalse("No proposals were found", list.getItems().isEmpty()); CompletionItem item = list.getItems().get(0); assertEquals("zzz() : void", item.getLabel()); CompletionItem resolvedItem = server.resolveCompletionItem(item).join(); assertEquals("This should be plain.", resolvedItem.getDocumentation()); }
protected Either<List<CompletionItem>, CompletionList> completion(final CancelIndicator origialCancelIndicator, final TextDocumentPositionParams params) { final LanguageServerImpl.BufferedCancelIndicator cancelIndicator = new LanguageServerImpl.BufferedCancelIndicator(origialCancelIndicator); final URI uri = this._uriExtensions.toUri(params.getTextDocument().getUri()); final IResourceServiceProvider resourceServiceProvider = this.languagesRegistry.getResourceServiceProvider(uri); ContentAssistService _get = null; if (resourceServiceProvider!=null) { _get=resourceServiceProvider.<ContentAssistService>get(ContentAssistService.class); } final ContentAssistService contentAssistService = _get; if ((contentAssistService == null)) { CompletionList _completionList = new CompletionList(); return Either.<List<CompletionItem>, CompletionList>forRight(_completionList); } final Function2<Document, XtextResource, CompletionList> _function = (Document document, XtextResource resource) -> { return contentAssistService.createCompletionList(document, resource, params, cancelIndicator); }; final CompletionList completionList = this.workspaceManager.<CompletionList>doRead(uri, _function); return Either.<List<CompletionItem>, CompletionList>forRight(completionList); }
@Test public void testRequest() throws Exception { TextDocumentPositionParams p = new TextDocumentPositionParams(); p.setPosition(new Position(1,1)); p.setTextDocument(new TextDocumentIdentifier("test/foo.txt")); CompletionList result = new CompletionList(); result.setIsIncomplete(true); result.setItems(new ArrayList<>()); CompletionItem item = new CompletionItem(); item.setDetail("test"); item.setDocumentation("doc"); item.setFilterText("filter"); item.setInsertText("insert"); item.setKind(CompletionItemKind.Field); result.getItems().add(item); server.expectedRequests.put("textDocument/completion", new Pair<>(p, result)); CompletableFuture<Either<List<CompletionItem>, CompletionList>> future = clientLauncher.getRemoteProxy().getTextDocumentService().completion(p); Assert.assertEquals(Either.forRight(result).toString(), future.get(TIMEOUT, TimeUnit.MILLISECONDS).toString()); client.joinOnEmpty(); }
@Test public void testProvideCompletionForCamelBlueprintNamespace() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<from uri=\"\" xmlns=\"http://camel.apache.org/schema/blueprint\"></from>\n"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(0, 11)); assertThat(completions.get().getLeft()).contains(expectedAhcCompletioncompletionItem); }
@Test public void testProvideCompletionForToCamelBlueprintNamespace() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<to uri=\"\" xmlns=\"http://camel.apache.org/schema/blueprint\"></to>\n"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(0, 9)); assertThat(completions.get().getLeft()).contains(expectedAhcCompletioncompletionItem); }
@Test public void testProvideCompletionForCamelSpringNamespace() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<from uri=\"\" xmlns=\"http://camel.apache.org/schema/spring\"></from>\n"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(0, 11)); assertThat(completions.get().getLeft()).contains(expectedAhcCompletioncompletionItem); }
@Test public void testProvideCompletionforMultiline() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer( "<camelContext xmlns=\"http://camel.apache.org/schema/spring\">\n" + "<to uri=\"\" ></to>\n" + "</camelContext>"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(1, 9)); assertThat(completions.get().getLeft()).contains(expectedAhcCompletioncompletionItem); }
@Test public void testDONTProvideCompletionForNotCamelnamespace() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<from uri=\"\"></from>\n"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(0, 11)); assertThat(completions.get().getLeft()).isEmpty(); assertThat(completions.get().getRight()).isNull(); }
@Test public void testDONTProvideCompletionWhenNotAfterURIEqualQuote() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer("<from uri=\"\" xmlns=\"http://camel.apache.org/schema/spring\"></from>\n"); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(0, 6)); assertThat(completions.get().getLeft()).isEmpty(); assertThat(completions.get().getRight()).isNull(); }
private void testProvideCamelOptions(String textTotest, int line, int character) throws URISyntaxException, InterruptedException, ExecutionException { CamelLanguageServer camelLanguageServer = initializeLanguageServer(textTotest); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(line, character)); assertThat(completions.get().getLeft()).contains( new CompletionItem("true"), new CompletionItem("false")); }
@Test public void testProvideCompletionForCamelBlueprintNamespace() throws Exception { CamelLanguageServer camelLanguageServer = initializeLanguageServer(textToTest); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(line, character)); if(shouldHaveCompletion) { assertThat(completions.get().getLeft()).contains(expectedAhcCompletioncompletionItem); } else { assertThat(completions.get().getLeft()).doesNotContain(expectedAhcCompletioncompletionItem); assertThat(completions.get().getRight()).isNull(); } }
private void testProvideCamelOptions(String textTotest, int line, int character) throws URISyntaxException, InterruptedException, ExecutionException { CamelLanguageServer camelLanguageServer = initializeLanguageServer(textTotest); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = getCompletionFor(camelLanguageServer, new Position(line, character)); assertThat(completions.get().getLeft()).contains( new CompletionItem("InOnly"), new CompletionItem("RobustInOnly"), new CompletionItem("InOut"), new CompletionItem("InOptionalOut"), new CompletionItem("OutOnly"), new CompletionItem("RobustOutOnly"), new CompletionItem("OutIn"), new CompletionItem("OutOptionalIn")); }
protected CompletableFuture<Either<List<CompletionItem>, CompletionList>> getCompletionFor(CamelLanguageServer camelLanguageServer, Position position) { TextDocumentService textDocumentService = camelLanguageServer.getTextDocumentService(); TextDocumentPositionParams dummyCompletionPositionRequest = new TextDocumentPositionParams(new TextDocumentIdentifier(DUMMY_URI), position); CompletableFuture<Either<List<CompletionItem>, CompletionList>> completions = textDocumentService.completion(dummyCompletionPositionRequest); return completions; }
@Override public CompletableFuture<Either<List<CompletionItem>, CompletionList>> completion( final TextDocumentPositionParams position) { CompletionList result = som.getCompletions( position.getTextDocument().getUri(), position.getPosition().getLine(), position.getPosition().getCharacter()); return CompletableFuture.completedFuture(Either.forRight(result)); }
public CompletionList getCompletions(final String docUri, final int line, final int character) { CompletionList result = new CompletionList(); result.setIsIncomplete(true); SomStructures probe = getProbe(docUri); if (probe == null) { return result; } // TODO: this expects that this can be parsed without issues... // +1 to get to one based index, - 1 to get back into the element ExpressionNode node = probe.getElementAt(line + 1, Math.max(character - 1, 0)); if (node == null) { return result; } SSymbol sym = null; if (node instanceof Send) { sym = ((Send) node).getSelector(); } else { if (ServerLauncher.DEBUG) { reportError("GET COMPLETIONS, unsupported node: " + node.getClass().getSimpleName()); } } if (sym != null) { Set<CompletionItem> completion = new HashSet<>(); Collection<SomStructures> probes = getProbes(); for (SomStructures s : probes) { s.getCompletions(sym, completion); } result.setItems(new ArrayList<>(completion)); } return result; }
@Test public void testCompletion_javadoc() throws Exception { IJavaProject javaProject = JavaCore.create(project); ICompilationUnit unit = (ICompilationUnit) javaProject.findElement(new Path("org/sample/TestJavadoc.java")); unit.becomeWorkingCopy(null); String joinOnCompletion = System.getProperty(JDTLanguageServer.JAVA_LSP_JOIN_ON_COMPLETION); try { System.setProperty(JDTLanguageServer.JAVA_LSP_JOIN_ON_COMPLETION, "true"); int[] loc = findCompletionLocation(unit, "inner."); TextDocumentPositionParams position = JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1])); String source = unit.getSource(); changeDocument(unit, source, 3); Job.getJobManager().join(DocumentLifeCycleHandler.DOCUMENT_LIFE_CYCLE_JOBS, new NullProgressMonitor()); changeDocument(unit, source, 4); CompletionList list = server.completion(position).join().getRight(); for (CompletionItem item : list.getItems()) { server.resolveCompletionItem(item); } CompletionItem resolved = list.getItems().get(0); assertEquals("Test ", resolved.getDocumentation()); } finally { unit.discardWorkingCopy(); if (joinOnCompletion == null) { System.clearProperty(JDTLanguageServer.JAVA_LSP_JOIN_ON_COMPLETION); } else { System.setProperty(JDTLanguageServer.JAVA_LSP_JOIN_ON_COMPLETION, joinOnCompletion); } } }
@Test public void testCompletion_object() throws Exception{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " void foo() {\n"+ " Objec\n"+ " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "Objec"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertFalse("No proposals were found",list.getItems().isEmpty()); List<CompletionItem> items = list.getItems(); for ( CompletionItem item : items) { assertTrue(isNotBlank(item.getLabel())); assertNotNull(item.getKind() ); assertTrue(isNotBlank(item.getSortText())); //text edits are not set during calls to "completion" assertNull(item.getTextEdit()); assertTrue(isNotBlank(item.getInsertText())); assertNotNull(item.getFilterText()); assertFalse(item.getFilterText().contains(" ")); assertTrue(item.getLabel().startsWith(item.getFilterText())); //Check contains data used for completionItem resolution @SuppressWarnings("unchecked") Map<String,String> data = (Map<String, String>) item.getData(); assertNotNull(data); assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_URI))); assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID))); assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_REQUEST_ID))); } }
@Test public void testCompletion_constructor() throws Exception{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " void foo() {\n"+ " Object o = new O\n"+ " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "new O"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertFalse("No proposals were found",list.getItems().isEmpty()); List<CompletionItem> items = new ArrayList<>(list.getItems()); Comparator<CompletionItem> comparator = (CompletionItem a, CompletionItem b) -> a.getSortText().compareTo(b.getSortText()); Collections.sort(items, comparator); CompletionItem ctor = items.get(0); assertEquals("Object()", ctor.getLabel()); assertEquals("Object", ctor.getInsertText()); CompletionItem resolvedItem = server.resolveCompletionItem(ctor).join(); assertNotNull(resolvedItem); TextEdit te = resolvedItem.getTextEdit(); assertNotNull(te); assertEquals("Object()",te.getNewText()); assertNotNull(te.getRange()); Range range = te.getRange(); assertEquals(2, range.getStart().getLine()); assertEquals(17, range.getStart().getCharacter()); assertEquals(2, range.getEnd().getLine()); assertEquals(18, range.getEnd().getCharacter()); }
@Test public void testCompletion_method_withLSPV2() throws JavaModelException{ mockLSP2Client(); ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " void foo() {\n"+ "System.out.print(\"Hello\");\n" + "System.out.println(\" World!\");\n"+ "HashMap<String, String> map = new HashMap<>();\n"+ "map.pu\n" + " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "map.pu"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter( item-> item.getLabel().matches("put\\(String \\w+, String \\w+\\) : String")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("put", ci.getInsertText()); assertEquals(CompletionItemKind.Function, ci.getKind()); assertEquals("999999019", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(5, 4, 6, "put", resolvedItem.getTextEdit()); assertNotNull(resolvedItem.getAdditionalTextEdits()); List<TextEdit> edits = resolvedItem.getAdditionalTextEdits(); assertEquals(3, edits.size()); }
@Test public void testCompletion_method_withLSPV3() throws JavaModelException{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " void foo() {\n"+ "System.out.print(\"Hello\");\n" + "System.out.println(\" World!\");\n"+ "HashMap<String, String> map = new HashMap<>();\n"+ "map.pu\n" + " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "map.pu"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter( item-> item.getLabel().matches("put\\(String \\w+, String \\w+\\) : String")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("put", ci.getInsertText()); assertEquals(CompletionItemKind.Function, ci.getKind()); assertEquals("999999019", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); try { assertTextEdit(5, 4, 6, "put(${1:key}, ${2:value})", resolvedItem.getTextEdit()); } catch (ComparisonFailure e) { //In case the JDK has no sources assertTextEdit(5, 4, 6, "put(${1:arg0}, ${2:arg1})", resolvedItem.getTextEdit()); } assertNotNull(resolvedItem.getAdditionalTextEdits()); List<TextEdit> edits = resolvedItem.getAdditionalTextEdits(); assertEquals(3, edits.size()); }
@Test public void testCompletion_field() throws JavaModelException{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "import java.sq \n" + "public class Foo {\n"+ "private String myTestString;\n"+ " void foo() {\n"+ " this.myTestS\n"+ " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "this.myTestS"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertEquals(1, list.getItems().size()); CompletionItem item = list.getItems().get(0); assertEquals(CompletionItemKind.Field, item.getKind()); assertEquals("myTestString", item.getInsertText()); assertNull(item.getAdditionalTextEdits()); assertNull(item.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(item).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(4,8,15,"myTestString",resolvedItem.getTextEdit()); //Not checking the range end character }
@Test public void testCompletion_import_type() throws JavaModelException{ ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "import java.sq \n" + "public class Foo {\n"+ " void foo() {\n"+ " java.util.Ma\n"+ " }\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "java.util.Ma"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertEquals(1, list.getItems().size()); CompletionItem item = list.getItems().get(0); assertEquals(CompletionItemKind.Class, item.getKind()); assertEquals("Map", item.getInsertText()); assertNull(item.getAdditionalTextEdits()); assertNull(item.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(item).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(3,3,15,"java.util.Map",resolvedItem.getTextEdit()); //Not checking the range end character }
@Test public void testCompletion_noPackage() throws Exception{ ICompilationUnit unit = getWorkingCopy( "src/NoPackage.java", "public class NoPackage {\n" + " NoP" +"}\n"); int[] loc = findCompletionLocation(unit, " NoP"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); assertFalse("No proposals were found", list.getItems().isEmpty()); assertEquals("NoPackage", list.getItems().get(0).getLabel()); }
@Test public void testCompletion_package() throws JavaModelException{ ClientPreferences mockCapabilies = Mockito.mock(ClientPreferences.class); Mockito.when(preferenceManager.getClientPreferences()).thenReturn(mockCapabilies); ICompilationUnit unit = getWorkingCopy( "src/org/sample/Baz.java", "package o"+ "public class Baz {\n"+ "}\n"); int[] loc = findCompletionLocation(unit, "package o"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); List<CompletionItem> items = new ArrayList<>(list.getItems()); assertTrue(items.size() > 1); items.sort((i1, i2) -> i1.getSortText().compareTo(i2.getSortText())); CompletionItem item = items.get(0); // current package should appear 1st assertEquals("org.sample",item.getLabel()); CompletionItem resolvedItem = server.resolveCompletionItem(item).join(); assertNotNull(resolvedItem); TextEdit te = item.getTextEdit(); assertNotNull(te); assertEquals("org.sample", te.getNewText()); assertNotNull(te.getRange()); Range range = te.getRange(); assertEquals(0, range.getStart().getLine()); assertEquals(8, range.getStart().getCharacter()); assertEquals(0, range.getEnd().getLine()); assertEquals(15, range.getEnd().getCharacter()); }
@Test public void testCompletion_methodOverrideWithParams() throws Exception { ICompilationUnit unit = getWorkingCopy( //@formatter:off "src/org/sample/Test.java", "package org.sample;\n\n"+ "public class Test extends Baz {\n"+ " getP" + "}\n"); //@formatter:on int[] loc = findCompletionLocation(unit, " getP"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); List<CompletionItem> filtered = list.getItems().stream().filter((item)->{ return item.getDetail() != null && item.getDetail().startsWith("Override method in"); }).collect(Collectors.toList()); assertEquals("No override proposals", filtered.size(), 1); CompletionItem oride = filtered.get(0); assertEquals("getParent", oride.getInsertText()); assertNull(oride.getTextEdit()); oride = server.resolveCompletionItem(oride).join(); assertNotNull(oride.getTextEdit()); String text = oride.getTextEdit().getNewText(); String expectedText = "@Override\n"+ "protected File getParent(File file, int depth) {\n" + "\t${0:return super.getParent(file, depth);}\n"+ "}"; assertEquals(expectedText, text); assertEquals("Missing required imports", 4, oride.getAdditionalTextEdits().size()); assertTextEdit(0, 19, 19, "\n\n", oride.getAdditionalTextEdits().get(0)); assertTextEdit(0, 19, 19, "import java.io.File;", oride.getAdditionalTextEdits().get(1)); assertTextEdit(0, 19, 19, "\n\n", oride.getAdditionalTextEdits().get(2)); }
@Test public void testCompletion_methodOverrideWithException() throws Exception { ICompilationUnit unit = getWorkingCopy( //@formatter:off "src/org/sample/Test.java", "package org.sample;\n\n"+ "public class Test extends Baz {\n"+ " dele"+ "}\n"); //@formatter:on int[] loc = findCompletionLocation(unit, " dele"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); List<CompletionItem> filtered = list.getItems().stream().filter((item)->{ return item.getDetail() != null && item.getDetail().startsWith("Override method in"); }).collect(Collectors.toList()); assertEquals("No override proposals", filtered.size(), 1); CompletionItem oride = filtered.get(0); assertEquals("deleteSomething", oride.getInsertText()); assertNull(oride.getTextEdit()); oride = server.resolveCompletionItem(oride).join(); assertNotNull(oride.getTextEdit()); String text = oride.getTextEdit().getNewText(); String expectedText = "@Override\n"+ "protected void deleteSomething() throws IOException {\n" + "\t${0:super.deleteSomething();}\n"+ "}"; assertEquals(expectedText, text); assertEquals("Missing required imports", 4, oride.getAdditionalTextEdits().size()); assertTextEdit(0, 19, 19, "\n\n", oride.getAdditionalTextEdits().get(0)); assertTextEdit(0, 19, 19, "import java.io.IOException;", oride.getAdditionalTextEdits().get(1)); assertTextEdit(0, 19, 19, "\n\n", oride.getAdditionalTextEdits().get(2)); }
@Test public void testCompletion_getter() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " private String strField;\n" + " get" + "}\n"); int[] loc = findCompletionLocation(unit, "get"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("getStrField() : String")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("getStrField", ci.getInsertText()); assertEquals(CompletionItemKind.Function, ci.getKind()); assertEquals("999999979", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 4, 7, "/**\n" + " * @return the strField\n" + " */\n" + "public String getStrField() {\n" + " return strField;\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_booleangetter() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " private boolean boolField;\n" + " is\n" + "}\n"); int[] loc = findCompletionLocation(unit, "is"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("isBoolField() : boolean")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("isBoolField", ci.getInsertText()); assertEquals(CompletionItemKind.Function, ci.getKind()); assertEquals("999999979", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 4, 6, "/**\n" + " * @return the boolField\n" + " */\n" + "public boolean isBoolField() {\n" + " return boolField;\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_setter() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " private String strField;\n" + " set" + "}\n"); int[] loc = findCompletionLocation(unit, "set"); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("setStrField(String strField) : void")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("setStrField", ci.getInsertText()); assertEquals(CompletionItemKind.Function, ci.getKind()); assertEquals("999999979", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 4, 7, "/**\n" + " * @param strField the strField to set\n" + " */\n" + "public void setStrField(String strField) {\n" + " this.strField = strField;\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousType() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " IFoo foo = new \n" + " } \n" + " interface IFoo {\n"+ " String getName();\n"+ " }\n"+ "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "new "); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Foo.IFoo() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Foo.IFoo", ci.getInsertText()); assertEquals(CompletionItemKind.Constructor, ci.getKind()); assertEquals("999998684", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 23, 23, "IFoo(){\n" + "\n" + " @Override\n" + " public String getName() {\n" + " ${0:return null;}\n" + " }\n" + "};", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousTypeMoreMethods() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " IFoo foo = new \n" + " } \n" + " interface IFoo {\n"+ " String getName();\n"+ " void setName(String name);\n"+ " }\n"+ "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "new "); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Foo.IFoo() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Foo.IFoo", ci.getInsertText()); assertEquals(CompletionItemKind.Constructor, ci.getKind()); assertEquals("999998684", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 23, 23, "IFoo(){\n" + "\n @Override\n" + " public void setName(String name) {\n" + " ${0}\n" + " }\n" + "\n @Override\n" + " public String getName() {\n" + " return null;\n" + " }\n" + "};", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousDeclarationType() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " new Runnable()\n" + " }\n" + "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "Runnable("); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Runnable() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Runnable", ci.getInsertText()); assertEquals(CompletionItemKind.Class, ci.getKind()); assertEquals("999999372", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 20, 22, "(){\n" + "\n" + " @Override\n" + " public void run() {\n" + " ${0}\n" + " }\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousDeclarationType2() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " new Runnable( )\n" + " }\n" + "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "Runnable( "); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Runnable() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Runnable", ci.getInsertText()); assertEquals(CompletionItemKind.Class, ci.getKind()); assertEquals("999999372", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 20, 24, "(){\n" + "\n" + " @Override\n" + " public void run() {\n" + " ${0}\n" + " }\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousDeclarationType3() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " run(\"name\", new Runnable(, 1);\n" + " }\n" + " void run(String name, Runnable runnable, int i) {\n" + " }\n" + "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "Runnable("); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Runnable() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Runnable", ci.getInsertText()); assertEquals(CompletionItemKind.Class, ci.getKind()); assertEquals("999999372", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 32, 33, "(){\n" + "\n" + " @Override\n" + " public void run() {\n" + " ${0}\n" + " }\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousDeclarationType4() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " run(\"name\", new Runnable(\n" + " , 1);\n" + " }\n" + " void run(String name, Runnable runnable, int i) {\n" + " }\n" + "}\n"); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "Runnable("); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Runnable() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Runnable", ci.getInsertText()); assertEquals(CompletionItemKind.Class, ci.getKind()); assertEquals("999999372", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 32, 33, "(){\n" + "\n" + " @Override\n" + " public void run() {\n" + " ${0}\n" + " }\n" + "}", resolvedItem.getTextEdit()); }
@Test public void testCompletion_AnonymousDeclarationType5() throws Exception { ICompilationUnit unit = getWorkingCopy( "src/java/Foo.java", "public class Foo {\n"+ " public static void main(String[] args) {\n" + " run(\"name\", new Runnable("); waitForBackgroundJobs(); int[] loc = findCompletionLocation(unit, "Runnable("); CompletionList list = server.completion(JsonMessageHelper.getParams(createCompletionRequest(unit, loc[0], loc[1]))).join().getRight(); assertNotNull(list); CompletionItem ci = list.getItems().stream() .filter(item -> item.getLabel().startsWith("Runnable() Anonymous Inner Type")) .findFirst().orElse(null); assertNotNull(ci); assertEquals("Runnable", ci.getInsertText()); assertEquals(CompletionItemKind.Class, ci.getKind()); assertEquals("999999372", ci.getSortText()); assertNull(ci.getTextEdit()); CompletionItem resolvedItem = server.resolveCompletionItem(ci).join(); assertNotNull(resolvedItem.getTextEdit()); assertTextEdit(2, 33, 33, "(){\n" + "\n" + " @Override\n" + " public void run() {\n" + " ${0}\n" + " }\n" + "}", resolvedItem.getTextEdit()); }