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