From 0d2ed24a27823823dd799849bb578886b64e147d Mon Sep 17 00:00:00 2001 From: Michael Bien Date: Sat, 5 Nov 2022 03:54:50 +0100 Subject: [PATCH 1/5] temp test setup: try to migrate the LSP job --- .github/workflows/main.yml | 55 +++++++++++++++++++++++++++++++++++++ .travis.yml => _.travis.yml | 11 -------- 2 files changed, 55 insertions(+), 11 deletions(-) rename .travis.yml => _.travis.yml (95%) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f5847f5627dc..a58a9f731709 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -108,6 +108,61 @@ jobs: if-no-files-found: error + java-cluster: + name: Experimental LSP job on JDK 8 + runs-on: ubuntu-latest + strategy: + matrix: + java: [ '11' ] + fail-fast: false + steps: + + - name: Set up JDK ${{ matrix.java }} + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: 'zulu' + + - name: Setup Xvfb + if: ${{ matrix.java != '20-ea' }} # see #4299 + run: | + echo "DISPLAY=:99.0" >> $GITHUB_ENV + Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & + + - name: Checkout ${{ github.ref }} ( ${{ github.sha }} ) + uses: actions/checkout@v3 + with: + persist-credentials: false + submodules: false + + - name: Caching dependencies + uses: actions/cache@v3 + with: + path: ~/.hgexternalcache + key: ${{ runner.os }}-${{ hashFiles('*/external/binaries-list', '*/*/external/binaries-list') }} + restore-keys: ${{ runner.os }}- + + - name: Build Java Cluster + run: | + ant $OPTS -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false clean + ant $OPTS -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false build + + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: 8 + distribution: 'zulu' + + - name: java/java.lsp.server + run: ant $OPTS -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false -f java/java.lsp.server test + + - name: Create Test Summary + uses: test-summary/action@v1 + if: failure() + with: + paths: "./*/*/build/test/*/results/TEST-*.xml" + + # secondary jobs linux-commit-validation: name: Commit Validation on Linux/JDK ${{ matrix.java }} diff --git a/.travis.yml b/_.travis.yml similarity index 95% rename from .travis.yml rename to _.travis.yml index b0881f52e3d1..21dd44666c57 100644 --- a/.travis.yml +++ b/_.travis.yml @@ -234,17 +234,6 @@ matrix: script: - travis_wait nbbuild/travis/scripting.sh -# exile: for tests which don't behave. Job should be kept short to be easily restartable - - name: Test unreliable tests on Java 8 - jdk: openjdk8 - env: - - OPTS="-Dmetabuild.jsonurl=https://raw.githubusercontent.com/apache/netbeans-jenkins-lib/master/meta/netbeansrelease.json -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false -Dtest-unit-sys-prop.ignore.random.failures=true" - before_script: - - nbbuild/travis/ant.sh $OPTS clean - - nbbuild/travis/ant.sh $OPTS build - script: - - travis_retry ant $OPTS -f java/java.lsp.server test - after_failure: - nbbuild/travis/print-junit-report.sh - sleep 3 From dbaca3ea54a67491aed89bec3fe9fad99b968c34 Mon Sep 17 00:00:00 2001 From: Svata Dedic Date: Fri, 11 Nov 2022 17:56:04 +0100 Subject: [PATCH 2/5] Avoid spurious Socket Closed exceptions. --- .../java/lsp/server/ConnectionSpec.java | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ConnectionSpec.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ConnectionSpec.java index 98dd3ccc25a0..9ab389564cc2 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ConnectionSpec.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ConnectionSpec.java @@ -25,6 +25,7 @@ import java.net.Inet4Address; import java.net.ServerSocket; import java.net.Socket; +import java.net.SocketException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutionException; @@ -46,7 +47,10 @@ final class ConnectionSpec implements Closeable { private final Boolean listen; private final int port; + // @GuardedBy (this) private final List close = new ArrayList<>(); + // @GuardedBy (this) + private final List closed = new ArrayList<>(); private ConnectionSpec(Boolean listen, int port) { this.listen = listen; @@ -110,11 +114,15 @@ public void prepare( @Override public void run() { while (true) { + Socket socket = null; try { - Socket socket = server.accept(); + socket = server.accept(); close.add(socket); connectToSocket(socket, prefix, session, serverSetter, launcher); } catch (IOException ex) { + if (isClosed(server)) { + break; + } Exceptions.printStackTrace(ex); } } @@ -144,7 +152,9 @@ public void run() { serverSetter.accept(session, connectionObject); connectionObject.getRunningFuture().get(); } catch (IOException | InterruptedException | ExecutionException ex) { - Exceptions.printStackTrace(ex); + if (!isClosed(socket)) { + Exceptions.printStackTrace(ex); + } } finally { serverSetter.accept(session, null); } @@ -152,11 +162,24 @@ public void run() { }; connectedThread.start(); } + + private boolean isClosed(Closeable c) { + synchronized (this) { + return closed.contains(c); + } + } @Override public void close() throws IOException { - for (Closeable c : close) { - c.close(); + synchronized (this) { + for (Closeable c : close) { + try { + c.close(); + closed.add(c); + } catch (IOException ex) { + Exceptions.printStackTrace(ex); + } + } } } } From 73fd81dc1c47ec6835d9717d6f6464a8334b8d34 Mon Sep 17 00:00:00 2001 From: Svata Dedic Date: Tue, 15 Nov 2022 16:06:27 +0100 Subject: [PATCH 3/5] Reorder build steps --- .github/workflows/main.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index a58a9f731709..f16c06811b28 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -117,6 +117,12 @@ jobs: fail-fast: false steps: + - name: Set up JDK 8 + uses: actions/setup-java@v3 + with: + java-version: 8 + distribution: 'zulu' + - name: Set up JDK ${{ matrix.java }} uses: actions/setup-java@v3 with: @@ -146,8 +152,8 @@ jobs: run: | ant $OPTS -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false clean ant $OPTS -quiet -Dcluster.config=java -Djavac.compilerargs=-nowarn -Dbuild.compiler.deprecation=false build - - - name: Set up JDK 8 + + - name: Reuse installed JDK 8 uses: actions/setup-java@v3 with: java-version: 8 From 44d561a7f538cbc2c6399c7f59b858ad3afcbecf Mon Sep 17 00:00:00 2001 From: Svata Dedic Date: Tue, 15 Nov 2022 16:06:42 +0100 Subject: [PATCH 4/5] Do not delete "$JsIndex$" and similar custom-generated classes --- .../antsrc/org/netbeans/nbbuild/CustomJavac.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/CustomJavac.java b/nbbuild/antsrc/org/netbeans/nbbuild/CustomJavac.java index 54746445ad7f..c2f69cbe836a 100644 --- a/nbbuild/antsrc/org/netbeans/nbbuild/CustomJavac.java +++ b/nbbuild/antsrc/org/netbeans/nbbuild/CustomJavac.java @@ -226,12 +226,16 @@ private void cleanUpDependDebris() { continue; } int i = clazz.indexOf('$'); - File enclosing = new File(d, clazz.substring(0, i) + ".class"); - if (!enclosing.isFile()) { - File enclosed = new File(d, clazz); - log(clazz + " will be deleted since " + enclosing.getName() + " is missing", Project.MSG_VERBOSE); - if (!enclosed.delete()) { - throw new BuildException("could not delete " + enclosed, getLocation()); + // ignore filenames that start right with '$' (separatorChar preceded), these could not be inner classes. + if (i > 0 && clazz.charAt(i - 1) != File.separatorChar) { + File enclosing = new File(d, clazz.substring(0, i) + ".class"); + // no inner class' filename may begin directly with '$', it must be preceded by an outer class' name. + if (!enclosing.isFile()) { + File enclosed = new File(d, clazz); + log(clazz + " will be deleted since " + enclosing.getName() + " is missing", Project.MSG_VERBOSE); + if (!enclosed.delete()) { + throw new BuildException("could not delete " + enclosed, getLocation()); + } } } } From 91e24ce9c511cc09d53e87d63db73e58d5f843ec Mon Sep 17 00:00:00 2001 From: Svata Dedic Date: Tue, 15 Nov 2022 16:06:48 +0100 Subject: [PATCH 5/5] Additional logging --- .../java/lsp/server/protocol/Server.java | 9 ++ .../java/lsp/server/protocol/ServerTest.java | 141 ++++++++++-------- 2 files changed, 91 insertions(+), 59 deletions(-) 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 df866c4ccd71..6b5203f4c7f8 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 @@ -78,6 +78,7 @@ import org.eclipse.lsp4j.jsonrpc.Launcher; import org.eclipse.lsp4j.jsonrpc.MessageConsumer; import org.eclipse.lsp4j.jsonrpc.MessageIssueException; +import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.eclipse.lsp4j.jsonrpc.messages.Message; import org.eclipse.lsp4j.jsonrpc.messages.NotificationMessage; @@ -119,6 +120,7 @@ import org.netbeans.spi.project.ActionProvider; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; +import org.openide.util.Exceptions; import org.openide.util.Lookup; import org.openide.util.NbBundle; import org.openide.util.NbPreferences; @@ -180,6 +182,10 @@ private static Launcher createLauncher(LanguageServerImpl } }); }) + .setExceptionHandler((t) -> { + LOG.log(Level.WARNING, "Error occurred during LSP message dispatch", t); + return RemoteEndpoint.DEFAULT_EXCEPTION_HANDLER.apply(t); + }) .create(); } @@ -255,6 +261,9 @@ public void consume(Message msg) throws MessageIssueException, JsonRpcException Lookups.executeWith(ll, () -> { try { delegate.consume(msg); + } catch (RuntimeException | Error e) { + LOG.log(Level.WARNING, "Error occurred during message dispatch", e); + throw e; } finally { // cancel while the OperationContext is still active. if (ftoCancel != null) { 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 367718191951..fc8818df160c 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 @@ -25,7 +25,10 @@ import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.io.Writer; import java.lang.ref.Reference; import java.lang.ref.WeakReference; @@ -140,8 +143,14 @@ import org.eclipse.lsp4j.WorkspaceSymbol; import org.eclipse.lsp4j.WorkspaceSymbolLocation; import org.eclipse.lsp4j.WorkspaceSymbolParams; +import org.eclipse.lsp4j.jsonrpc.Endpoint; import org.eclipse.lsp4j.jsonrpc.Launcher; +import org.eclipse.lsp4j.jsonrpc.MessageConsumer; +import org.eclipse.lsp4j.jsonrpc.RemoteEndpoint; +import org.eclipse.lsp4j.jsonrpc.json.MessageJsonHandler; +import org.eclipse.lsp4j.jsonrpc.json.StreamMessageConsumer; import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.eclipse.lsp4j.jsonrpc.services.ServiceEndpoints; import org.eclipse.lsp4j.launch.LSPLauncher; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageServer; @@ -328,7 +337,7 @@ public void testMain() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -405,7 +414,7 @@ public void testDiagnosticsRemovedForDeletedFile() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -513,7 +522,7 @@ public void testDidOpenPreservesLines() throws Exception { OpenCloseHook hook = new OpenCloseHook(); TextDocumentServiceImpl.HOOK_NOTIFICATION = hook::accept; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -589,7 +598,7 @@ public void testSimulateNewUnnamedFile() throws Exception { OpenCloseHook hook = new OpenCloseHook(); TextDocumentServiceImpl.HOOK_NOTIFICATION = hook::accept; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -625,7 +634,7 @@ public void testCodeActionWithRemoval() throws Exception { w.write(code); } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -732,7 +741,7 @@ public void testNavigator() throws Exception { } file2SourceLevel.put(FileUtil.toFileObject(src.getParentFile()), "17"); FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -875,7 +884,7 @@ public void testGoToDefinition() throws Exception { } FileUtil.refreshFor(getWorkDir()); CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -959,7 +968,7 @@ public void testGoToTypeDefinition() throws Exception { } FileUtil.refreshFor(getWorkDir()); CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1024,7 +1033,7 @@ public void testGoToImplementations() throws Exception { } FileUtil.refreshFor(getWorkDir()); CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object params) { throw new UnsupportedOperationException("Not supported yet."); @@ -1088,7 +1097,7 @@ public void testGoToSuperImplementation() throws Exception { "}"); } FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object params) { throw new UnsupportedOperationException("Not supported yet."); @@ -1131,7 +1140,7 @@ public void logMessage(MessageParams params) { } public void testFindDebugAttachConfigurations() throws Exception { - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { }, client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); @@ -1190,7 +1199,7 @@ public void testOpenProjectOpenJDK() throws Exception { List[] diags = new List[1]; boolean[] indexingComplete = new boolean[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1258,7 +1267,7 @@ public void testMarkOccurrences() throws Exception { w.write(code); } FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1308,7 +1317,7 @@ public void testHover() throws Exception { w.write(code); } FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1368,7 +1377,7 @@ public void testAdvancedCompletion1() throws Exception { } List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1503,7 +1512,7 @@ public void testAutoImportOnCompletion() throws Exception { } List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1589,14 +1598,14 @@ public void testFixImports() throws Exception { } List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void showStatusBarMessage(ShowStatusMessageParams params) { if (Server.INDEXING_COMPLETED.equals(params.getMessage())) { indexingComplete.countDown(); } } - + @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -1661,7 +1670,7 @@ public void testFindUsages() throws Exception { "}\n"); } CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1766,7 +1775,7 @@ public void testWorkspaceSymbols() throws Exception { w.write(code); } CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1826,7 +1835,7 @@ public void testCodeActionGenerateVarFieldOrParam() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -1954,7 +1963,7 @@ public void testCodeActionGenerateMethod() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2040,7 +2049,7 @@ public void testCodeActionGenerateClass() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2127,7 +2136,7 @@ public void testCodeActionImplementAllAbstractMethodsInClass() throws Exception } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2217,7 +2226,7 @@ public void testCodeActionImplementAllAbstractMethodsInAnonymousClass() throws E } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2304,7 +2313,7 @@ public void testCodeActionImplementAllAbstractMethodsInEnum() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2392,7 +2401,7 @@ public void testCodeActionIntroduceVariable() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2501,7 +2510,7 @@ public void testCodeActionIntroduceConstant() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2605,7 +2614,7 @@ public void testCodeActionIntroduceField() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2709,7 +2718,7 @@ public void testCodeActionIntroduceMethod() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2816,7 +2825,7 @@ public void testCodeActionGetterSetter() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -2893,7 +2902,7 @@ public void testCodeActionGenerateConstructor() throws Exception { w.write(code); } AtomicReference data = new AtomicReference<>(); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -2950,7 +2959,7 @@ public void testSourceActionGetterSetter() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -3051,7 +3060,7 @@ public void testSourceActionConstructor() throws Exception { w.write(code); } AtomicReference data = new AtomicReference<>(); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -3125,7 +3134,7 @@ public void testSourceActionEqualsHashCode() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture> showQuickPick(ShowQuickPickParams params) { return CompletableFuture.completedFuture(params.getItems().size() > 2 ? params.getItems().subList(0, 2) : params.getItems()); @@ -3187,7 +3196,7 @@ public void testSourceActionToString() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -3246,7 +3255,7 @@ public void testSourceActionDelegateMethod() throws Exception { w.write(code); } AtomicReference data = new AtomicReference<>(); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -3332,7 +3341,7 @@ public void testSourceActionOverrideMethod() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -3391,7 +3400,7 @@ public void testSourceActionLogger() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public CompletableFuture applyEdit(ApplyWorkspaceEditParams params) { throw new UnsupportedOperationException("Not supported yet."); @@ -3456,7 +3465,7 @@ public void testSourceActionOrganizeImports() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -3590,7 +3599,7 @@ private void doTestRename(Consumer settings, } List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -3674,7 +3683,7 @@ public void testMoveClass() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -3789,7 +3798,7 @@ public void testMoveMethod() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -3895,7 +3904,7 @@ public void testExtractInterface() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -4016,7 +4025,7 @@ public void testExtractSuperclass() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -4153,7 +4162,7 @@ public void testPullUp() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -4251,7 +4260,7 @@ public void testPushDown() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -4334,6 +4343,20 @@ public CompletableFuture> showQuickPick(ShowQuickPickParams } } } + + private Launcher createClientLauncherWithLogging(LanguageClient client, InputStream input, OutputStream output) { + return new LSPLauncher.Builder() + .setLocalService(client) + .setExceptionHandler((t) -> { + System.err.println("Error during dispatch at client: "); + t.printStackTrace(); + return RemoteEndpoint.DEFAULT_EXCEPTION_HANDLER.apply(t); + }) + .traceMessages(new PrintWriter(System.out)) + .setRemoteInterface(LanguageServer.class) + .setInput(input) + .setOutput(output).create(); + } public void testChangeMethodParameters() throws Exception { File src = new File(getWorkDir(), "a/Foo.java"); @@ -4363,7 +4386,7 @@ public void testChangeMethodParameters() throws Exception { List[] diags = new List[1]; CountDownLatch indexingComplete = new CountDownLatch(1); WorkspaceEdit[] edit = new WorkspaceEdit[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new TestCodeLanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new TestCodeLanguageClient() { @Override public void publishDiagnostics(PublishDiagnosticsParams params) { synchronized (diags) { @@ -4461,7 +4484,7 @@ public void testSurroundWith() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4541,7 +4564,7 @@ public void testFormatDocument() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4625,7 +4648,7 @@ public void testFormatSelection() throws Exception { } List[] diags = new List[1]; - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4704,7 +4727,7 @@ public void testNoErrorAndHintsFor() throws Exception { } Map> publishedDiagnostics = new HashMap<>(); FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4773,7 +4796,7 @@ public void testCodeFolding() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4845,7 +4868,7 @@ public void testAnnotationCompletion() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -4908,7 +4931,7 @@ public void testSemanticHighlighting() throws Exception { w.write(code); } FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LanguageClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -4971,7 +4994,7 @@ public void testSemanticHighlighting2() throws Exception { w.write(code); } FileUtil.refreshFor(getWorkDir()); - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LanguageClient() { + Launcher serverLauncher = createClientLauncherWithLogging(new LanguageClient() { @Override public void telemetryEvent(Object arg0) { throw new UnsupportedOperationException("Not supported yet."); @@ -5404,7 +5427,7 @@ public void showMessage(MessageParams params) { Lookup d = Lookup.getDefault(); IOProvider prov = IOProvider.getDefault(); - Launcher serverLauncher = LSPLauncher.createClientLauncher(lc, client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(lc, client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeParams initP = new InitializeParams(); @@ -5445,7 +5468,7 @@ public void testFileModificationDiags() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); @@ -5492,7 +5515,7 @@ public void testDeclarativeHints() throws Exception { try (Writer w = new FileWriter(src)) { w.write(code); } - Launcher serverLauncher = LSPLauncher.createClientLauncher(new LspClient(), client.getInputStream(), client.getOutputStream()); + Launcher serverLauncher = createClientLauncherWithLogging(new LspClient(), client.getInputStream(), client.getOutputStream()); serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get();