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

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


The following commit(s) were added to refs/heads/master by this push:
     new 97aca5b13b LSP: Command to get document symbols added.
     new 2ed7f55088 Merge pull request #6331 from 
dbalek/dbalek/lsp-get-document-symbols
97aca5b13b is described below

commit 97aca5b13b1b62f29898b3638027968954da44ba
Author: Dusan Balek <[email protected]>
AuthorDate: Fri Aug 11 16:37:19 2023 +0200

    LSP: Command to get document symbols added.
---
 .../symbol/MicronautStructureProvider.java         | 69 ++++++++++++++++++++++
 .../micronaut/symbol/MicronautSymbolFinder.java    | 16 ++++-
 .../modules/editor/java/JavaStructureProvider.java |  2 +-
 .../modules/java/lsp/server/protocol/Server.java   |  8 ++-
 .../server/protocol/TextDocumentServiceImpl.java   |  2 +-
 .../lsp/server/protocol/WorkspaceServiceImpl.java  | 39 ++++++++++++
 6 files changed, 131 insertions(+), 5 deletions(-)

diff --git 
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautStructureProvider.java
 
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautStructureProvider.java
new file mode 100644
index 0000000000..22cf9bb7b3
--- /dev/null
+++ 
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautStructureProvider.java
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.netbeans.modules.micronaut.symbol;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.swing.text.Document;
+import org.netbeans.api.editor.mimelookup.MimeRegistration;
+import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.api.java.source.ClasspathInfo;
+import org.netbeans.api.java.source.JavaSource;
+import org.netbeans.api.lsp.StructureElement;
+import org.netbeans.spi.lsp.StructureProvider;
+import org.openide.util.Exceptions;
+
+/**
+ *
+ * @author Dusan Balek
+ */
+@MimeRegistration(mimeType = "text/x-java", service = StructureProvider.class, 
position = 1000)
+public class MicronautStructureProvider implements StructureProvider {
+
+    @Override
+    public List<StructureElement> getStructure(Document doc) {
+        JavaSource js = JavaSource.forDocument(doc);
+        if (js != null) {
+            ClassPath cp = 
js.getClasspathInfo().getClassPath(ClasspathInfo.PathKind.COMPILE);
+            if 
(cp.findResource("io/micronaut/http/annotation/HttpMethodMapping.class") != 
null) {
+                try {
+                    List<StructureElement> elements = new ArrayList<>();
+                    js.runUserActionTask(cc -> {
+                        cc.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
+                        for (MicronautSymbolFinder.SymbolLocation 
symbolLocation : MicronautSymbolFinder.scan(cc)) {
+                            
elements.add(StructureProvider.newBuilder(symbolLocation.getName(), 
StructureElement.Kind.Interface)
+                                    .file(cc.getFileObject())
+                                    
.expandedStartOffset(symbolLocation.getStart())
+                                    .expandedEndOffset(symbolLocation.getEnd())
+                                    
.selectionStartOffset(symbolLocation.getStart())
+                                    
.selectionEndOffset(symbolLocation.getEnd())
+                                    .build());
+                        }
+                    }, true);
+                    return elements;
+                } catch (IOException ex) {
+                    Exceptions.printStackTrace(ex);
+                }
+            }
+        }
+        return Collections.emptyList();
+    }
+}
diff --git 
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
 
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
index 1d4934755d..c47d8b7d9d 100644
--- 
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
+++ 
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/symbol/MicronautSymbolFinder.java
@@ -120,7 +120,7 @@ public final class MicronautSymbolFinder extends 
EmbeddingIndexer implements Pro
         return ret;
     }
 
-    private List<SymbolLocation> scan(CompilationController cc) {
+    public static List<SymbolLocation> scan(CompilationController cc) {
         final List<SymbolLocation> ret = new ArrayList<>();
         TreePathScanner<Void, String> scanner = new TreePathScanner<Void, 
String>() {
             @Override
@@ -279,7 +279,7 @@ public final class MicronautSymbolFinder extends 
EmbeddingIndexer implements Pro
         }
     }
 
-    private static class SymbolLocation {
+    public static class SymbolLocation {
         private String name;
         private int start;
         private int end;
@@ -289,6 +289,18 @@ public final class MicronautSymbolFinder extends 
EmbeddingIndexer implements Pro
             this.start = start;
             this.end = end;
         }
+
+        public String getName() {
+            return name;
+        }
+
+        public int getStart() {
+            return start;
+        }
+
+        public int getEnd() {
+            return end;
+        }
     }
 
     private static class MthIterator implements Iterator<ExecutableElement> {
diff --git 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaStructureProvider.java
 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaStructureProvider.java
index d958eaee16..61d08c6671 100644
--- 
a/java/java.editor/src/org/netbeans/modules/editor/java/JavaStructureProvider.java
+++ 
b/java/java.editor/src/org/netbeans/modules/editor/java/JavaStructureProvider.java
@@ -45,7 +45,7 @@ import org.netbeans.spi.lsp.StructureProvider;
  *
  * @author Petr Pisl
  */
-@MimeRegistration(mimeType = "text/x-java", service = StructureProvider.class)
+@MimeRegistration(mimeType = "text/x-java", service = StructureProvider.class, 
position = 100)
 public class JavaStructureProvider implements StructureProvider {
 
     private static final Logger LOGGER = 
Logger.getLogger(JavaStructureProvider.class.getName());
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
index 5a74cde65f..f0d6b26c72 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java
@@ -810,7 +810,8 @@ public final class Server {
                         JAVA_CLEAR_PROJECT_CACHES,
                         NATIVE_IMAGE_FIND_DEBUG_PROCESS_TO_ATTACH,
                         JAVA_PROJECT_INFO,
-                        JAVA_ENABLE_PREVIEW
+                        JAVA_ENABLE_PREVIEW,
+                        NBLS_DOCUMENT_SYMBOLS
                 ));
                 for (CodeActionsProvider codeActionsProvider : 
Lookup.getDefault().lookupAll(CodeActionsProvider.class)) {
                     commands.addAll(codeActionsProvider.getCommands());
@@ -1035,6 +1036,11 @@ public final class Server {
      */
     public static final String JAVA_ENABLE_PREVIEW = 
"java.project.enable.preview";
 
+    /**
+     * Provides symbols for the given document
+     */
+    public static final String NBLS_DOCUMENT_SYMBOLS =  
"nbls.document.symbols";
+
     static final String INDEXING_COMPLETED = "Indexing completed.";
     static final String NO_JAVA_SUPPORT = "Cannot initialize Java support on 
JDK ";
 
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 882301a733..bbc0de64b0 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
@@ -863,7 +863,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
         return resultFuture;
     }
 
-    private static DocumentSymbol structureElement2DocumentSymbol 
(StyledDocument doc, StructureElement el) {
+    static DocumentSymbol structureElement2DocumentSymbol (StyledDocument doc, 
StructureElement el) {
         Position selectionStartPos = Utils.createPosition(doc, 
el.getSelectionStartOffset());
         Position selectionEndPos = Utils.createPosition(doc, 
el.getSelectionEndOffset());
         Range selectionRange = new Range(selectionStartPos, selectionEndPos);
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
index 5e119a9230..0c42c372a8 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
@@ -67,11 +67,14 @@ import java.util.stream.Collectors;
 import javax.lang.model.element.Element;
 import javax.lang.model.element.ElementKind;
 import javax.lang.model.element.TypeElement;
+import javax.swing.text.Document;
+import javax.swing.text.StyledDocument;
 import org.apache.commons.lang3.StringUtils;
 import org.eclipse.lsp4j.CompletionItem;
 import org.eclipse.lsp4j.DidChangeConfigurationParams;
 import org.eclipse.lsp4j.DidChangeWatchedFilesParams;
 import org.eclipse.lsp4j.DidChangeWorkspaceFoldersParams;
+import org.eclipse.lsp4j.DocumentSymbol;
 import org.eclipse.lsp4j.ExecuteCommandParams;
 import org.eclipse.lsp4j.Location;
 import org.eclipse.lsp4j.Position;
@@ -90,6 +93,7 @@ import org.netbeans.api.annotations.common.NonNull;
 import org.netbeans.api.annotations.common.NullAllowed;
 import org.netbeans.api.debugger.ActionsManager;
 import org.netbeans.api.debugger.DebuggerManager;
+import org.netbeans.api.editor.mimelookup.MimeLookup;
 import org.netbeans.api.java.classpath.ClassPath;
 import org.netbeans.api.java.project.JavaProjectConstants;
 import org.netbeans.api.java.queries.SourceForBinaryQuery;
@@ -102,6 +106,7 @@ import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.JavaSource.Phase;
 import org.netbeans.api.java.source.SourceUtils;
 import org.netbeans.api.java.source.ui.ElementOpen;
+import org.netbeans.api.lsp.StructureElement;
 import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectInformation;
@@ -109,6 +114,7 @@ import org.netbeans.api.project.ProjectManager;
 import org.netbeans.api.project.ProjectUtils;
 import org.netbeans.api.project.SourceGroup;
 import org.netbeans.api.project.ui.OpenProjects;
+import org.netbeans.lib.editor.util.swing.DocumentUtilities;
 import org.netbeans.modules.csl.api.IndexSearcher;
 import org.netbeans.modules.editor.indent.spi.CodeStylePreferences;
 import org.netbeans.modules.gsf.testrunner.ui.api.TestMethodController;
@@ -132,6 +138,7 @@ import org.netbeans.modules.parsing.lucene.support.Queries;
 import org.netbeans.modules.parsing.spi.ParseException;
 import org.netbeans.spi.java.classpath.support.ClassPathSupport;
 import org.netbeans.spi.jumpto.type.SearchType;
+import org.netbeans.spi.lsp.StructureProvider;
 import org.netbeans.spi.project.ActionProgress;
 import org.netbeans.spi.project.ActionProvider;
 import org.netbeans.spi.project.ProjectConfiguration;
@@ -686,6 +693,38 @@ public final class WorkspaceServiceImpl implements 
WorkspaceService, LanguageCli
                 }
                 return CompletableFuture.completedFuture(true);
             }
+            case Server.NBLS_DOCUMENT_SYMBOLS: {
+                List<DocumentSymbol> result = new ArrayList<>();
+                try {
+                    List<Object> arguments = params.getArguments();
+                    String source = ((JsonPrimitive) 
arguments.get(0)).getAsString();
+                    String query = arguments.size() > 1 ? 
((JsonPrimitive)arguments.get(1)).getAsString() : "";
+                    FileObject file = Utils.fromUri(source);
+                    Document rawDoc = 
server.getOpenedDocuments().getDocument(source);
+                    if (file != null && rawDoc instanceof StyledDocument) {
+                        StyledDocument doc = (StyledDocument)rawDoc;
+                        for (StructureProvider structureProvider : 
MimeLookup.getLookup(DocumentUtilities.getMimeType(doc)).lookupAll(StructureProvider.class))
 {
+                            if (structureProvider != null) {
+                                List<StructureElement> structureElements = 
structureProvider.getStructure(doc);
+                                if (!structureElements.isEmpty()) {
+                                    for (StructureElement structureElement : 
structureElements) {
+                                        if 
(structureElement.getName().startsWith(query)) {
+                                            DocumentSymbol ds = 
TextDocumentServiceImpl.structureElement2DocumentSymbol(doc, structureElement);
+                                            if (ds != null) {
+                                                result.add(ds);
+                                            }
+                                        }
+                                    }
+                                };
+                            }
+                        }
+                    }
+                } catch (Exception ex) {
+                    Exceptions.printStackTrace(ex);
+                    return 
CompletableFuture.completedFuture(Collections.emptyList());
+                }
+                return CompletableFuture.completedFuture(result);
+            }
             default:
                 for (CodeActionsProvider codeActionsProvider : 
Lookup.getDefault().lookupAll(CodeActionsProvider.class)) {
                     if (codeActionsProvider.getCommands().contains(command)) {


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

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

Reply via email to