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 fe150eb806 LSP: Fix broken source for workspace symbol resolution. new 72b63fdba3 Merge pull request #6374 from dbalek/dbalek/lsp-open-source-for-symbol fe150eb806 is described below commit fe150eb80611be2b025087a56592eba42281337f Author: Dusan Balek <dusan.ba...@oracle.com> AuthorDate: Thu Aug 24 10:59:54 2023 +0200 LSP: Fix broken source for workspace symbol resolution. --- .../lsp/server/protocol/WorkspaceServiceImpl.java | 72 ++++++++++------------ .../java/lsp/server/TestCodeLanguageClient.java | 1 - .../java/lsp/server/protocol/ServerTest.java | 58 ++++++----------- 3 files changed, 50 insertions(+), 81 deletions(-) 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 0c42c372a8..afa8ed4782 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 @@ -32,9 +32,6 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -950,10 +947,6 @@ public final class WorkspaceServiceImpl implements WorkspaceService, LanguageCli return UnitTestForSourceQuery.findSources(sg.getRootFolder()).length > 0; } - private static final Position NO_POS = new Position(0, 0); - private static final Range NO_RANGE = new Range(NO_POS, NO_POS); - private static final String SOURCE_FOR = "sourceFor:"; - @Override public CompletableFuture<Either<List<? extends SymbolInformation>, List<? extends WorkspaceSymbol>>> symbol(WorkspaceSymbolParams params) { String query = params.getQuery(); @@ -1132,8 +1125,8 @@ public final class WorkspaceServiceImpl implements WorkspaceService, LanguageCli int idx = fqn.lastIndexOf('.'); String simpleName = idx < 0 ? fqn : fqn.substring(idx + 1); String contextName = idx < 0 ? null : fqn.substring(0, idx); - String uri = URLEncoder.encode(pair.second().toURI().toString() + '?' + handle.getKind().name() + '#' + handle.getBinaryName(), StandardCharsets.UTF_8.toString()); - WorkspaceSymbol symbol = new WorkspaceSymbol(simpleName, Utils.elementKind2SymbolKind(handle.getKind()), Either.forRight(new WorkspaceSymbolLocation(SOURCE_FOR + uri)), contextName); + String uri = (pair.second().toURI().toString()) + '?' + handle.getKind().name() + '#' + handle.getBinaryName(); + WorkspaceSymbol symbol = new WorkspaceSymbol(simpleName, Utils.elementKind2SymbolKind(handle.getKind()), Either.forRight(new WorkspaceSymbolLocation(uri)), contextName); symbols.add(symbol); } } @@ -1157,44 +1150,41 @@ public final class WorkspaceServiceImpl implements WorkspaceService, LanguageCli @Override public CompletableFuture<WorkspaceSymbol> resolveWorkspaceSymbol(WorkspaceSymbol workspaceSymbol) { String sourceUri = workspaceSymbol.getLocation().isLeft() ? workspaceSymbol.getLocation().getLeft().getUri() : workspaceSymbol.getLocation().getRight().getUri(); - if (!sourceUri.startsWith(SOURCE_FOR)) { - return CompletableFuture.completedFuture(workspaceSymbol); - } CompletableFuture<WorkspaceSymbol> result = new CompletableFuture<>(); try { - sourceUri = URLDecoder.decode(sourceUri.substring(SOURCE_FOR.length()), StandardCharsets.UTF_8.toString()); int qIdx = sourceUri.lastIndexOf('?'); int hIdx = sourceUri.lastIndexOf('#'); if (qIdx < 0 || hIdx < 0 || hIdx <= qIdx) { - throw new IllegalArgumentException("Invalid uri: " + sourceUri); - } - String rootUri = sourceUri.substring(0, qIdx); - FileObject root = URLMapper.findFileObject(URI.create(rootUri).toURL()); - if (root == null) { - throw new IllegalStateException("Unable to find root: " + rootUri); - } - ElementHandle typeHandle = ElementHandleAccessor.getInstance().create(ElementKind.valueOf(sourceUri.substring(qIdx + 1, hIdx)), sourceUri.substring(hIdx + 1)); - CompletableFuture<ElementOpen.Location> location = ElementOpen.getLocation(ClasspathInfo.create(root), typeHandle, typeHandle.getQualifiedName().replace('.', '/') + ".class"); - location.exceptionally(ex -> { - result.completeExceptionally(ex); - return null; - }).thenAccept(loc -> { - if (loc != null) { - ShowDocumentParams sdp = new ShowDocumentParams(Utils.toUri(loc.getFileObject())); - Position position = Utils.createPosition(loc.getFileObject(), loc.getStartOffset()); - sdp.setSelection(new Range(position, position)); - client.showDocument(sdp).thenAccept(res -> { - if (res.isSuccess()) { - workspaceSymbol.setLocation(Either.forLeft(new Location(Utils.toUri(loc.getFileObject()), new Range(position, position)))); - result.complete(workspaceSymbol); - } else { - result.completeExceptionally(new IllegalStateException("Cannot open source for: " + typeHandle.getQualifiedName())); - } - }); - } else if (!result.isCompletedExceptionally()) { - result.completeExceptionally(new IllegalStateException("Cannot find source for: " + typeHandle.getQualifiedName())); + result.complete(workspaceSymbol); + } else { + String rootUri = sourceUri.substring(0, qIdx); + FileObject root = Utils.fromUri(rootUri); + if (root == null) { + throw new IllegalStateException("Unable to find root: " + rootUri); } - }); + ElementHandle typeHandle = ElementHandleAccessor.getInstance().create(ElementKind.valueOf(sourceUri.substring(qIdx + 1, hIdx)), sourceUri.substring(hIdx + 1)); + CompletableFuture<ElementOpen.Location> location = ElementOpen.getLocation(ClasspathInfo.create(root), typeHandle, typeHandle.getQualifiedName().replace('.', '/') + ".class"); + location.exceptionally(ex -> { + result.completeExceptionally(ex); + return null; + }).thenAccept(loc -> { + if (loc != null) { + ShowDocumentParams sdp = new ShowDocumentParams(Utils.toUri(loc.getFileObject())); + Position position = Utils.createPosition(loc.getFileObject(), loc.getStartOffset()); + sdp.setSelection(new Range(position, position)); + client.showDocument(sdp).thenAccept(res -> { + if (res.isSuccess()) { + workspaceSymbol.setLocation(Either.forLeft(new Location(Utils.toUri(loc.getFileObject()), new Range(position, position)))); + result.complete(workspaceSymbol); + } else { + result.completeExceptionally(new IllegalStateException("Cannot open source for: " + typeHandle.getQualifiedName())); + } + }); + } else if (!result.isCompletedExceptionally()) { + result.completeExceptionally(new IllegalStateException("Cannot find source for: " + typeHandle.getQualifiedName())); + } + }); + } } catch (Throwable t) { result.completeExceptionally(t); } diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java index 33523b8041..d26ba5d8a6 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java @@ -125,7 +125,6 @@ public abstract class TestCodeLanguageClient implements NbCodeLanguageClient { @Override public void telemetryEvent(Object params) { - throw new UnsupportedOperationException(); } @Override 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 4a7645dbca..9d3412e0aa 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 @@ -53,6 +53,7 @@ import java.util.Set; import java.util.TreeSet; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; @@ -122,6 +123,8 @@ import org.eclipse.lsp4j.SemanticTokensCapabilities; import org.eclipse.lsp4j.SemanticTokensLegend; import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.ResourceOperationKind; +import org.eclipse.lsp4j.ShowDocumentParams; +import org.eclipse.lsp4j.ShowDocumentResult; import org.eclipse.lsp4j.ShowMessageRequestParams; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextDocumentClientCapabilities; @@ -329,7 +332,6 @@ public class ServerTest extends NbTestCase { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -671,7 +673,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -781,7 +782,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -924,7 +924,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1008,7 +1007,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1073,7 +1071,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object params) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1137,7 +1134,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object params) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1239,7 +1235,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1307,7 +1302,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1357,7 +1351,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1416,7 +1409,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1555,7 +1547,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1717,7 +1708,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1822,7 +1812,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -1848,6 +1837,11 @@ public class ServerTest extends NbTestCase { public void logMessage(MessageParams arg0) { throw new UnsupportedOperationException("Not supported yet."); } + + @Override + public CompletableFuture<ShowDocumentResult> showDocument(ShowDocumentParams params) { + return CompletableFuture.completedFuture(new ShowDocumentResult(true)); + } }, client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); @@ -1856,13 +1850,20 @@ public class ServerTest extends NbTestCase { InitializeResult result = server.initialize(initParams).get(); indexingComplete.await(); Either<List<? extends SymbolInformation>, List<? extends WorkspaceSymbol>> symbols = server.getWorkspaceService().symbol(new WorkspaceSymbolParams("Tes")).get(); - List<String> actual = symbols.getRight().stream().map(ws -> ws.getKind() + ":" + ws.getName() + ":" + ws.getContainerName() + ":" - + (ws.getLocation().isLeft() ? toString(ws.getLocation().getLeft()) : toString(ws.getLocation().getRight()))).collect(Collectors.toList()); + List<String> actual = symbols.getRight().stream().map(symbol -> { + WorkspaceSymbol ws; + try { + ws = server.getWorkspaceService().resolveWorkspaceSymbol(symbol).get(); + } catch (Exception ex) { + ws = symbol; + } + return ws.getKind() + ":" + ws.getName() + ":" + ws.getContainerName() + ":" + (ws.getLocation().isLeft() ? toString(ws.getLocation().getLeft()) : toString(ws.getLocation().getRight())); + }).collect(Collectors.toList()); assertEquals(Arrays.asList("Constructor:Test():Test:Test.java:0:7-0:7", "Method:testMethod():Test:Test.java:2:4-2:38", "Constructor:TestNested():Test.TestNested:Test.java:1:18-1:18", - "Class:Test:null:Test", - "Class:TestNested:Test:Test%24TestNested"), + "Class:Test:null:Test.java:0:13-0:13", + "Class:TestNested:Test:Test.java:1:24-1:24"), actual); } @@ -1882,7 +1883,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2022,7 +2022,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2112,7 +2111,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2203,7 +2201,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2297,7 +2294,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2388,7 +2384,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2480,7 +2475,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2589,7 +2583,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2693,7 +2686,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2797,7 +2789,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -2904,7 +2895,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -3038,7 +3028,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -3558,7 +3547,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -3692,7 +3680,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -4581,7 +4568,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -4661,7 +4647,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -4745,7 +4730,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -4824,7 +4808,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -4893,7 +4876,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -5028,7 +5010,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LanguageClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override @@ -5091,7 +5072,6 @@ public class ServerTest extends NbTestCase { Launcher<LanguageServer> serverLauncher = createClientLauncherWithLogging(new LanguageClient() { @Override public void telemetryEvent(Object arg0) { - throw new UnsupportedOperationException("Not supported yet."); } @Override --------------------------------------------------------------------- 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