diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/META-INF/MANIFEST.MF b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/META-INF/MANIFEST.MF index 610e87f43..192572c7b 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/META-INF/MANIFEST.MF +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/META-INF/MANIFEST.MF @@ -6,7 +6,8 @@ Bundle-Version: 4.0.0.qualifier Require-Bundle: org.eclipse.ui, org.eclipse.ui.workbench.texteditor, org.eclipse.lsp4e;bundle-version="0.5.0", - org.eclipse.lsp4j;bundle-version="0.4.0", + org.eclipse.lsp4j;bundle-version="0.5.0", + org.eclipse.lsp4j.jsonrpc;bundle-version="0.5.0", org.eclipse.jface.text;bundle-version="3.12.0", org.eclipse.core.resources;bundle-version="3.12.0", org.eclipse.core.filebuffers, diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialog.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialog.java index 3261f1f74..1b34aa788 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialog.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialog.java @@ -39,6 +39,7 @@ import org.eclipse.jface.viewers.ViewerCell; import org.eclipse.lsp4e.LSPEclipseUtils; import org.eclipse.lsp4e.outline.SymbolsLabelProvider; import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.swt.SWT; import org.eclipse.swt.events.KeyAdapter; @@ -106,7 +107,7 @@ public class GotoSymbolDialog extends PopupDialog { boolean showKindInformation = false; symbolsLabelProvider = new SymbolsLabelProvider(showSymbolsLabelProviderLocation , showKindInformation) { @Override - protected int getMaxSeverity(IResource resource, SymbolInformation symbolInformation) + protected int getMaxSeverity(IResource resource, Range range) throws CoreException, BadLocationException { int maxSeverity = -1; for (IMarker marker : resource.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO)) { diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java index 86dce9e91..52d296ded 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/GotoSymbolDialogModel.java @@ -18,7 +18,9 @@ import java.util.List; import java.util.stream.Collectors; import org.eclipse.core.runtime.Assert; +import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.springframework.tooling.ls.eclipse.gotosymbol.GotoSymbolPlugin; import org.springsource.ide.eclipse.commons.core.util.FuzzyMatcher; import org.springsource.ide.eclipse.commons.core.util.StringUtil; @@ -46,10 +48,14 @@ public class GotoSymbolDialogModel { } - public static Comparator> MATCH_COMPARATOR = (m1, m2) -> { + public static Comparator>> MATCH_COMPARATOR = (m1, m2) -> { int comp = Double.compare(m2.score, m1.score); if (comp!=0) return comp; - return m1.value.getName().compareTo(m2.value.getName()); + + String m1Name = m1.value.isLeft() ? m1.value.getLeft().getName() : m1.value.getRight().getName(); + String m2Name = m2.value.isLeft() ? m2.value.getLeft().getName() : m2.value.getRight().getName(); + + return m1Name.compareTo(m2Name); }; private static final String SEARCH_BOX_HINT_MESSAGE = "@/ -> request mappings, @+ -> beans, @> -> functions, @ -> all spring elements"; @@ -76,7 +82,7 @@ public class GotoSymbolDialogModel { private int currentSymbolsProviderIndex; private final LiveVariable currentSymbolsProvider = new LiveVariable<>(null); private final LiveVariable searchBox = new LiveVariable<>(""); - private final ObservableSet unfilteredSymbols = new ObservableSet(ImmutableSet.of(), AsyncMode.ASYNC, AsyncMode.SYNC) { + private final ObservableSet> unfilteredSymbols = new ObservableSet>(ImmutableSet.of(), AsyncMode.ASYNC, AsyncMode.SYNC) { //Note: fetching is 'slow' so is done asynchronously { setRefreshDelay(100); @@ -85,7 +91,7 @@ public class GotoSymbolDialogModel { } @Override - protected ImmutableSet compute() { + protected ImmutableSet> compute() { status.setValue("Fetching symbols..."); try { SymbolsProvider sp = currentSymbolsProvider.getValue(); @@ -93,7 +99,7 @@ public class GotoSymbolDialogModel { debug("Fetching "+sp.getName()); String query = searchBox.getValue(); debug("Fetching symbols... from symbol provider, for '"+query+"'"); - Collection fetched = sp.fetchFor(query); + Collection> fetched = sp.fetchFor(query); if (keyBindings==null) { status.setValue(sp.getName()); } else { @@ -116,7 +122,7 @@ public class GotoSymbolDialogModel { } }; - private LiveExpression>> filteredSymbols = new LiveExpression>>() { + private LiveExpression>>> filteredSymbols = new LiveExpression>>>() { //Note: filtering is 'fast' so is done synchronously { dependsOn(searchBox); @@ -124,18 +130,25 @@ public class GotoSymbolDialogModel { } @Override - protected Collection> compute() { + protected Collection>> compute() { String query = searchBox.getValue(); if (!StringUtil.hasText(query)) { query = ""; } query = query.toLowerCase(); - List> matches = new ArrayList<>(); - for (SymbolInformation symbol : unfilteredSymbols.getValues()) { - String name = symbol.getName().toLowerCase(); + List>> matches = new ArrayList<>(); + for (Either symbol : unfilteredSymbols.getValues()) { + String name = null; + if (symbol.isLeft()) { + name = symbol.getLeft().getName().toLowerCase(); + } + else if (symbol.isRight()) { + name = symbol.getRight().getName().toLowerCase(); + } + double score = FuzzyMatcher.matchScore(query, name); if (score!=0.0) { - matches.add(new Match(score, query, symbol)); + matches.add(new Match>(score, query, symbol)); } } Collections.sort(matches, MATCH_COMPARATOR); @@ -161,11 +174,11 @@ public class GotoSymbolDialogModel { } } - private List summary(Collection> collection) { - return collection.stream().map(match -> match.value.getName()).collect(Collectors.toList()); + private List summary(Collection>> collection) { + return collection.stream().map(match -> match.value.isLeft() ? match.value.getLeft().getName() : match.value.getRight().getName()).collect(Collectors.toList()); } - public LiveExpression>> getSymbols() { + public LiveExpression>>> getSymbols() { return filteredSymbols; } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InFileSymbolsProvider.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InFileSymbolsProvider.java index 47f185f80..9312c4c8d 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InFileSymbolsProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InFileSymbolsProvider.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -17,9 +17,11 @@ import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4e.LSPEclipseUtils; import org.eclipse.lsp4e.LanguageServiceAccessor; import org.eclipse.lsp4e.LanguageServiceAccessor.LSPDocumentInfo; +import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.ui.texteditor.ITextEditor; import com.google.common.collect.ImmutableList; @@ -40,12 +42,12 @@ public class InFileSymbolsProvider implements SymbolsProvider { } @Override - public Collection fetchFor(String query) throws Exception { + public List> fetchFor(String query) throws Exception { DocumentSymbolParams params = new DocumentSymbolParams( new TextDocumentIdentifier(info.getFileUri().toString())); - CompletableFuture> symbolsFuture = info.getLanguageClient() + CompletableFuture>> symbolsFuture = info.getLanguageClient() .getTextDocumentService().documentSymbol(params); - List symbols = symbolsFuture.get(); + List> symbols = symbolsFuture.get(); return symbols == null ? ImmutableList.of() : ImmutableList.copyOf(symbols); } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InWorkspaceSymbolsProvider.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InWorkspaceSymbolsProvider.java index 3dd28f924..a5f15adc3 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InWorkspaceSymbolsProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/InWorkspaceSymbolsProvider.java @@ -21,8 +21,10 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.lsp4e.LanguageServiceAccessor; +import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.WorkspaceSymbolParams; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.handlers.HandlerUtil; @@ -52,7 +54,7 @@ public class InWorkspaceSymbolsProvider implements SymbolsProvider { } @Override - public Collection fetchFor(String query) throws Exception { + public List> fetchFor(String query) throws Exception { //TODO: if we want decent support for multiple language servers... // consider changing SymbolsProvider api and turning the stuff in here into something producing a // Flux> @@ -64,12 +66,13 @@ public class InWorkspaceSymbolsProvider implements SymbolsProvider { // really use this with a single language server anyways. WorkspaceSymbolParams params = new WorkspaceSymbolParams(query); - Flux symbols = Flux.fromIterable(this.languageServers) - .flatMap(server -> Mono.fromFuture(server.getWorkspaceService().symbol(params)) + Flux> symbols = Flux.fromIterable(this.languageServers) + .flatMap(server -> Mono.fromFuture(server.getWorkspaceService().symbol(params)) .timeout(TIMEOUT) .doOnError(e -> log(e)) .onErrorReturn(ImmutableList.of()) .flatMapMany(Flux::fromIterable) + .map(symbol -> Either.forLeft(symbol)) ); //Consider letting the Flux go out from here instead of blocking and collecting elements. return symbols.take(MAX_RESULTS).collect(Collectors.toList()).block(); diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/SymbolsProvider.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/SymbolsProvider.java index 432f331d3..ca47a7529 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/SymbolsProvider.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.gotosymbol/src/org/springframework/tooling/ls/eclipse/gotosymbol/dialogs/SymbolsProvider.java @@ -10,9 +10,11 @@ *******************************************************************************/ package org.springframework.tooling.ls.eclipse.gotosymbol.dialogs; -import java.util.Collection; +import java.util.List; +import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.jsonrpc.messages.Either; /** * An SymbolsProvider can fetch symbols from a service (typically, a language server @@ -21,7 +23,8 @@ import org.eclipse.lsp4j.SymbolInformation; */ public interface SymbolsProvider { String getName(); - Collection fetchFor(String query) throws Exception; + + List> fetchFor(String query) throws Exception; /** * True if the symbol information is provided from a file provider (a file is the provider of the symbols). False otherwise * @param symbol