This is an automated email from the ASF dual-hosted git repository. jlahoda pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 7970e3e Some more fixes for the Language Server Protocol client: 7970e3e is described below commit 7970e3eea62f3bd0ea81459a023c576fd84b6ce4 Author: Jan Lahoda <lah...@gmail.com> AuthorDate: Fri Feb 1 07:38:21 2019 +0100 Some more fixes for the Language Server Protocol client: -following TextDocumentSyncKind requestes -sending client configuration also when connecting to a server manually -prevent NPE when closing IDE when a server is configured manually --- .../netbeans/modules/lsp/client/LSPBindings.java | 24 ++++++------ .../TextDocumentSyncServerCapabilityHandler.java | 43 +++++++++++++++++++--- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java index f68c1db..110eefb 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java @@ -109,12 +109,7 @@ public class LSPBindings { Launcher<LanguageServer> launcher = LSPLauncher.createClientLauncher(lci, in, out); launcher.startListening(); LanguageServer server = launcher.getRemoteProxy(); - InitializeParams initParams = new InitializeParams(); - initParams.setRootUri(Utils.toURI(prj.getProjectDirectory())); //XXX: what if a different root is expected???? - initParams.setRootPath(FileUtil.toFile(prj.getProjectDirectory()).getAbsolutePath()); //some servers still expect root path - initParams.setProcessId(0); - initParams.setCapabilities(new ClientCapabilities(new WorkspaceClientCapabilities(), new TextDocumentClientCapabilities(), null)); - InitializeResult result = server.initialize(initParams).get(); + InitializeResult result = initServer(server, prj.getProjectDirectory()); //XXX: what if a different root is expected???? LSPBindings b = new LSPBindings(server, result, LanguageServerProviderAccessor.getINSTANCE().getProcess(desc)); lci.setBindings(b); return b; @@ -152,11 +147,7 @@ public class LSPBindings { }); launcher.startListening(); LanguageServer server = launcher.getRemoteProxy(); - - InitializeParams initParams = new InitializeParams(); - initParams.setRootUri(Utils.toURI(root)); - initParams.setProcessId(0); - InitializeResult result = server.initialize(initParams).get(); + InitializeResult result = initServer(server, root); LSPBindings bindings = new LSPBindings(server, result, null); lc.setBindings(bindings); @@ -168,6 +159,15 @@ public class LSPBindings { }, Bundle.LBL_Connecting()); } + private static InitializeResult initServer(LanguageServer server, FileObject root) throws InterruptedException, ExecutionException { + InitializeParams initParams = new InitializeParams(); + initParams.setRootUri(Utils.toURI(root)); + initParams.setRootPath(FileUtil.toFile(root).getAbsolutePath()); //some servers still expect root path + initParams.setProcessId(0); + initParams.setCapabilities(new ClientCapabilities(new WorkspaceClientCapabilities(), new TextDocumentClientCapabilities(), null)); + return server.initialize(initParams).get(); + } + private final LanguageServer server; private final InitializeResult initResult; private final Process process; @@ -246,7 +246,7 @@ public class LSPBindings { } for (Map<String, LSPBindings> mime2Bindings : workspace2Extension2Server.values()) { for (LSPBindings b : mime2Bindings.values()) { - if (b != null) { + if (b != null && b.process != null) { b.process.destroy(); } } diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java index 9ac2f60..79c88af 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java @@ -34,7 +34,10 @@ import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; import org.eclipse.lsp4j.TextDocumentItem; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.eclipse.lsp4j.TextDocumentSyncOptions; import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; +import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.netbeans.api.editor.EditorRegistry; import org.netbeans.editor.BaseDocumentEvent; import org.netbeans.modules.editor.*; @@ -133,14 +136,11 @@ public class TextDocumentSyncServerCapabilityHandler { } Position endPos = new Position(startPos.getLine() + additionalLines, startPos.getCharacter() + additionalChars); - TextDocumentContentChangeEvent event; - event = new TextDocumentContentChangeEvent(new Range(startPos, + TextDocumentContentChangeEvent[] event = new TextDocumentContentChangeEvent[1]; + event[0] = new TextDocumentContentChangeEvent(new Range(startPos, endPos), oldText.length(), newText); - VersionedTextDocumentIdentifier di = new VersionedTextDocumentIdentifier(++version); - di.setUri(org.netbeans.modules.lsp.client.Utils.toURI(file)); - DidChangeTextDocumentParams params = new DidChangeTextDocumentParams(di, Arrays.asList(event)); WORKER.post(() -> { LSPBindings server = LSPBindings.getBindings(file); @@ -148,6 +148,39 @@ public class TextDocumentSyncServerCapabilityHandler { if (server == null) return ; //ignore + TextDocumentSyncKind syncKind = TextDocumentSyncKind.None; + Either<TextDocumentSyncKind, TextDocumentSyncOptions> sync = server.getInitResult().getCapabilities().getTextDocumentSync(); + if (sync != null) { + if (sync.isLeft()) { + syncKind = sync.getLeft(); + } else { + TextDocumentSyncKind change = sync.getRight().getChange(); + if (change != null) + syncKind = change; + } + } + switch (syncKind) { + case None: + return ; + case Full: + doc.render(() -> { + try { + event[0] = new TextDocumentContentChangeEvent(doc.getText(0, doc.getLength())); + } catch (BadLocationException ex) { + Exceptions.printStackTrace(ex); + event[0] = new TextDocumentContentChangeEvent(""); + } + }); + break; + case Incremental: + //event already filled + break; + } + + VersionedTextDocumentIdentifier di = new VersionedTextDocumentIdentifier(++version); + di.setUri(org.netbeans.modules.lsp.client.Utils.toURI(file)); + DidChangeTextDocumentParams params = new DidChangeTextDocumentParams(di, Arrays.asList(event)); + server.getTextDocumentService().didChange(params); server.scheduleBackgroundTasks(file); }); --------------------------------------------------------------------- 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