From 0f081b93eaaf258feb8e0a6fc8e6ab3282993408 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Wed, 26 Feb 2025 15:33:16 +0100 Subject: [PATCH] add systme property to switch between document symbols from old or new index --- .../vscode/boot/app/SpringSymbolIndex.java | 135 ++++++++++-------- 1 file changed, 76 insertions(+), 59 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java index 70e857107..9afdd0858 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java @@ -102,6 +102,9 @@ import com.google.common.collect.ImmutableList; @Component public class SpringSymbolIndex implements InitializingBean, SpringIndex { + private static final String QUERY_PARAM_LOCATION_PREFIX = "locationPrefix:"; + private static final String OUTLINE_SYMBOLS_FROM_INDEX_PROPERTY = "outlineSymbolsFromIndex"; + @Autowired SimpleLanguageServer server; @Autowired BootJavaConfig config; @Autowired BootLanguageServerParams params; @@ -112,8 +115,6 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { @Autowired JdtReconciler jdtReconciler; @Autowired CompilationUnitCache cuCache; - private static final String QUERY_PARAM_LOCATION_PREFIX = "locationPrefix:"; - private final List symbols = new ArrayList<>(); private final ConcurrentMap> symbolsByDoc = new ConcurrentHashMap<>(); @@ -698,70 +699,28 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { } public List getSymbols(String docURI) { - try { - TextDocument doc = server.getTextDocumentService().getLatestSnapshot(docURI); - URI uri = URI.create(docURI); - CompletableFuture projectInitialized = futureProjectFinder.findFuture(uri).thenCompose(project -> projectInitializedFuture(project)); - IJavaProject project = projectInitialized.get(15, TimeUnit.SECONDS); - ImmutableList.Builder builder = ImmutableList.builder(); - if (project != null && doc != null) { - // Collect symbols from the opened document - synchronized(this) { - for (SpringIndexer indexer : this.indexers) { - if (indexer.isInterestedIn(docURI)) { - try { - for (WorkspaceSymbol enhanced : indexer.computeSymbols(project, docURI, - doc.get())) { - builder.add(enhanced); - } - } catch (Exception e) { - log.error("{}", e); - } - } - } - } - } else { - // Take symbols from the index if there is no opened document. - List docSymbols = this.symbolsByDoc.get(uri.toASCIIString()); - if (docSymbols != null) { - synchronized (docSymbols) { - for (WorkspaceSymbol symbol : docSymbols) { - builder.add(symbol); - } - } - } - } - return builder.build(); - } catch (Exception e) { - log.warn("", e); - return Collections.emptyList(); + if (System.getProperty(OUTLINE_SYMBOLS_FROM_INDEX_PROPERTY) != null) { + return getWorkspaceSymbolsFromMetamodelIndex(docURI); + } + else { + return getWorkspaceSymbolsFromSymbolIndex(docURI); } } public List getDocumentSymbols(String docURI) { - List result = new ArrayList<>(); - - List symbols = getSymbols(docURI); - for (WorkspaceSymbol symbol : symbols) { - DocumentSymbol docSymbol = new DocumentSymbol(); - docSymbol.setName(symbol.getName()); - docSymbol.setKind(symbol.getKind()); - docSymbol.setRange(symbol.getLocation().getLeft().getRange()); - docSymbol.setSelectionRange(symbol.getLocation().getLeft().getRange()); - docSymbol.setTags(symbol.getTags()); - - result.add(docSymbol); + if (System.getProperty(OUTLINE_SYMBOLS_FROM_INDEX_PROPERTY) != null) { + return getDocumentSymbolsFromMetamodelIndex(docURI); + } + else { + return getDocumentSymbolsFromSymbolsIndex(docURI); } - - return result; } - -/* - public List getSymbols(String docURI) { + + public List getWorkspaceSymbolsFromMetamodelIndex(String docURI) { List result = new ArrayList<>(); Deque remainingSymbols = new ArrayDeque<>(); - List documentSymbols = getDocumentSymbols(docURI); + List documentSymbols = getDocumentSymbolsFromMetamodelIndex(docURI); remainingSymbols.addAll(documentSymbols); @@ -786,7 +745,25 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { return result; } - public List getDocumentSymbols(String docURI) { + public List getDocumentSymbolsFromSymbolsIndex(String docURI) { + List result = new ArrayList<>(); + + List symbols = getWorkspaceSymbolsFromSymbolIndex(docURI); + for (WorkspaceSymbol symbol : symbols) { + DocumentSymbol docSymbol = new DocumentSymbol(); + docSymbol.setName(symbol.getName()); + docSymbol.setKind(symbol.getKind()); + docSymbol.setRange(symbol.getLocation().getLeft().getRange()); + docSymbol.setSelectionRange(symbol.getLocation().getLeft().getRange()); + docSymbol.setTags(symbol.getTags()); + + result.add(docSymbol); + } + + return result; + } + + public List getDocumentSymbolsFromMetamodelIndex(String docURI) { try { TextDocument doc = server.getTextDocumentService().getLatestSnapshot(docURI); URI uri = URI.create(docURI); @@ -828,7 +805,47 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { return Collections.emptyList(); } } -*/ + + public List getWorkspaceSymbolsFromSymbolIndex(String docURI) { + try { + TextDocument doc = server.getTextDocumentService().getLatestSnapshot(docURI); + URI uri = URI.create(docURI); + CompletableFuture projectInitialized = futureProjectFinder.findFuture(uri).thenCompose(project -> projectInitializedFuture(project)); + IJavaProject project = projectInitialized.get(15, TimeUnit.SECONDS); + ImmutableList.Builder builder = ImmutableList.builder(); + if (project != null && doc != null) { + // Collect symbols from the opened document + synchronized(this) { + for (SpringIndexer indexer : this.indexers) { + if (indexer.isInterestedIn(docURI)) { + try { + for (WorkspaceSymbol enhanced : indexer.computeSymbols(project, docURI, + doc.get())) { + builder.add(enhanced); + } + } catch (Exception e) { + log.error("{}", e); + } + } + } + } + } else { + // Take symbols from the index if there is no opened document. + List docSymbols = this.symbolsByDoc.get(uri.toASCIIString()); + if (docSymbols != null) { + synchronized (docSymbols) { + for (WorkspaceSymbol symbol : docSymbols) { + builder.add(symbol); + } + } + } + } + return builder.build(); + } catch (Exception e) { + log.warn("", e); + return Collections.emptyList(); + } + } @Override public CompletableFuture> beans(BeansParams params) {