This is an automated email from the ASF dual-hosted git repository.

geertjan pushed a commit to branch delivery
in repository https://gitbox.apache.org/repos/asf/netbeans.git


The following commit(s) were added to refs/heads/delivery by this push:
     new 0f36a3f  Showing completions returned by annotation Processors in VS 
Code.
     new 3a750f5  Merge pull request #2736 from jlahoda/java-lsp-annotations
0f36a3f is described below

commit 0f36a3f205e6f9e7d1df5b09b9427fdc9bf3b67c
Author: Jan Lahoda <jlah...@netbeans.org>
AuthorDate: Fri Feb 5 23:17:34 2021 +0100

    Showing completions returned by annotation Processors in VS Code.
---
 .../server/protocol/TextDocumentServiceImpl.java   | 22 +++++--
 .../java/lsp/server/protocol/ServerTest.java       | 71 +++++++++++++++++++++-
 2 files changed, 87 insertions(+), 6 deletions(-)

diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index d7ef2eb..317b499 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -24,7 +24,6 @@ import com.sun.source.tree.ClassTree;
 import com.sun.source.tree.CompilationUnitTree;
 import com.sun.source.tree.LineMap;
 import com.sun.source.tree.MethodTree;
-import com.sun.source.tree.PrimitiveTypeTree;
 import com.sun.source.tree.Scope;
 import com.sun.source.tree.Tree;
 import com.sun.source.tree.Tree.Kind;
@@ -61,14 +60,12 @@ import java.util.stream.Collectors;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.ExecutableElement;
-import javax.lang.model.element.Modifier;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.TypeParameterElement;
 import javax.lang.model.element.VariableElement;
 import javax.lang.model.type.ArrayType;
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.type.ExecutableType;
-import javax.lang.model.type.TypeKind;
 import javax.lang.model.type.TypeMirror;
 import javax.lang.model.util.Elements;
 import javax.swing.text.BadLocationException;
@@ -339,6 +336,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
 
     private static class ItemFactoryImpl implements 
JavaCompletionTask.ItemFactory<CompletionItem> {
 
+        private static final int DEPRECATED = 10;
         private final LanguageClient client;
         private final String uri;
         private final int offset;
@@ -561,12 +559,26 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
 
         @Override
         public CompletionItem createAttributeItem(CompilationInfo info, 
ExecutableElement elem, ExecutableType type, int substitutionOffset, boolean 
isDeprecated) {
-            return null; //TODO: fill
+            CompletionItem item = new 
CompletionItem(elem.getSimpleName().toString());
+            item.setKind(CompletionItemKind.Property);
+            StringBuilder insertText = new StringBuilder();
+            insertText.append(elem.getSimpleName());
+            insertText.append("=");
+            item.setInsertText(insertText.toString());
+            item.setInsertTextFormat(InsertTextFormat.PlainText);
+            int priority = isDeprecated ? 100 + DEPRECATED : 100;
+            item.setSortText(String.format("%4d%s", priority, 
elem.getSimpleName().toString()));
+            setCompletionData(item, elem);
+            return item;
         }
 
         @Override
         public CompletionItem createAttributeValueItem(CompilationInfo info, 
String value, String documentation, TypeElement element, int 
substitutionOffset, ReferencesCount referencesCount) {
-            return null; //TODO: fill
+            CompletionItem item = new CompletionItem(value);
+            item.setKind(CompletionItemKind.Text);
+            item.setSortText(value);
+            item.setDocumentation(documentation);
+            return item;
         }
 
         private static final Object KEY_IMPORT_TEXT_EDITS = new Object();
diff --git 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
index 14f51d7..5acde78 100644
--- 
a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
+++ 
b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java
@@ -35,6 +35,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -48,6 +49,7 @@ import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import javax.swing.event.ChangeListener;
 import javax.swing.text.Document;
 import javax.swing.text.StyledDocument;
 import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
@@ -112,6 +114,8 @@ import org.eclipse.lsp4j.services.LanguageClient;
 import org.eclipse.lsp4j.services.LanguageServer;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.classpath.GlobalPathRegistry;
+import org.netbeans.api.java.queries.AnnotationProcessingQuery.Result;
+import org.netbeans.api.java.queries.AnnotationProcessingQuery.Trigger;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ui.OpenProjects;
@@ -121,6 +125,7 @@ import org.netbeans.modules.java.source.BootClassPathUtil;
 import org.netbeans.modules.parsing.impl.indexing.implspi.CacheFolderProvider;
 import org.netbeans.spi.java.classpath.ClassPathProvider;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
+import org.netbeans.spi.java.queries.AnnotationProcessingQueryImplementation;
 import org.netbeans.spi.project.ProjectFactory;
 import org.netbeans.spi.project.ProjectState;
 import org.netbeans.spi.project.ui.ProjectOpenedHook;
@@ -3234,7 +3239,7 @@ public class ServerTest extends NbTestCase {
         
assertTrue(result.getCapabilities().getFoldingRangeProvider().isRight());
         server.getTextDocumentService().didOpen(new 
DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code)));
         List<FoldingRange> folds = 
server.getTextDocumentService().foldingRange(new FoldingRangeRequestParams(new 
TextDocumentIdentifier(toURI(src)))).get();
-        System.err.println("folds=" + folds);
+
         assertEquals(5, folds.size());
 
         assertEquals(0, folds.get(0).getStartLine());
@@ -3268,6 +3273,34 @@ public class ServerTest extends NbTestCase {
         assertEquals("region", folds.get(4).getKind());
     }
 
+    public void testAnnotationCompletion() throws Exception {
+        File src = new File(getWorkDir(), "Test.java");
+        src.getParentFile().mkdirs();
+        String code = "@java.lang.Supp public class Test { }";
+        try (Writer w = new FileWriter(src)) {
+            w.write(code);
+        }
+        Launcher<LanguageServer> serverLauncher = 
LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), 
client.getOutputStream());
+        serverLauncher.startListening();
+        LanguageServer server = serverLauncher.getRemoteProxy();
+        InitializeResult result = server.initialize(new 
InitializeParams()).get();
+        server.getTextDocumentService().didOpen(new 
DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code)));
+        Either<List<CompletionItem>, CompletionList> completion = 
server.getTextDocumentService().completion(new CompletionParams(new 
TextDocumentIdentifier(toURI(src)), new Position(0, 15))).get();
+        assertTrue(completion.isRight());
+        List<String> actualItems = 
completion.getRight().getItems().stream().map(ci -> ci.getKind() + ":" + 
ci.getLabel()).collect(Collectors.toList());
+        assertEquals(Arrays.asList("Interface:SuppressWarnings"), actualItems);
+        VersionedTextDocumentIdentifier id = new 
VersionedTextDocumentIdentifier(1);
+        id.setUri(toURI(src));
+        server.getTextDocumentService().didChange(new 
DidChangeTextDocumentParams(id, Arrays.asList(new 
TextDocumentContentChangeEvent(new Range(new Position(0, 1), new Position(0, 
15)), 14, "SuppressWarnings(v"))));
+        completion = server.getTextDocumentService().completion(new 
CompletionParams(new TextDocumentIdentifier(toURI(src)), new Position(0, 
19))).get();
+        actualItems = completion.getRight().getItems().stream().map(ci -> 
ci.getKind() + ":" + ci.getLabel()).collect(Collectors.toList());
+        assertTrue(actualItems.contains("Property:value"));
+        server.getTextDocumentService().didChange(new 
DidChangeTextDocumentParams(id, Arrays.asList(new 
TextDocumentContentChangeEvent(new Range(new Position(0, 19), new Position(0, 
19)), 0, "alue=\"\""))));
+        completion = server.getTextDocumentService().completion(new 
CompletionParams(new TextDocumentIdentifier(toURI(src)), new Position(0, 
25))).get();
+        actualItems = completion.getRight().getItems().stream().map(ci -> 
ci.getKind() + ":" + ci.getLabel()).collect(Collectors.toList());
+        assertTrue(actualItems.contains("Text:\"empty-statement\""));
+    }
+
     interface Validator<T> {
         public void validate(T t) throws Exception;
     }
@@ -3353,6 +3386,42 @@ public class ServerTest extends NbTestCase {
 
     }
 
+    @ServiceProvider(service=AnnotationProcessingQueryImplementation.class, 
position=100)
+    public static final class AnnotationProcessingQueryImpl implements 
AnnotationProcessingQueryImplementation {
+
+        private final Result result = new Result() {
+            @Override
+            public Set<? extends Trigger> annotationProcessingEnabled() {
+                return EnumSet.allOf(Trigger.class);
+            }
+
+            @Override
+            public Iterable<? extends String> annotationProcessorsToRun() {
+                return Collections.emptyList();
+            }
+            @Override
+            public URL sourceOutputDirectory() {
+                return null;
+            }
+            @Override
+            public Map<? extends String, ? extends String> processorOptions() {
+                return Collections.emptyMap();
+            }
+            @Override
+            public void addChangeListener(ChangeListener l) {
+            }
+            @Override
+            public void removeChangeListener(ChangeListener l) {
+            }
+        };
+
+        @Override
+        public Result getAnnotationProcessingOptions(FileObject file) {
+            return result;
+        }
+
+    }
+
     //tests may run as a project, so that indexing works properly:
     @ServiceProvider(service=ProjectFactory.class)
     public static class TestProjectFactory implements ProjectFactory {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to