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/netbeans.git


The following commit(s) were added to refs/heads/master by this push:
     new c31b1fd  Upgrading the LSP4J library to 0.7.0.
c31b1fd is described below

commit c31b1fd36b21d2669d82a96bfd476c9e540b4d4b
Author: Jan Lahoda <jlah...@netbeans.org>
AuthorDate: Tue Apr 30 20:49:52 2019 +0200

    Upgrading the LSP4J library to 0.7.0.
---
 ide/lsp.client/external/binaries-list              |  6 +-
 ...j-0.4.1-license.txt => lsp4j-0.7.0-license.txt} |  4 +-
 ide/lsp.client/nbproject/project.properties        |  6 +-
 ide/lsp.client/nbproject/project.xml               | 12 ++--
 .../netbeans/modules/lsp/client/LSPBindings.java   |  7 ++-
 .../src/org/netbeans/modules/lsp/client/Utils.java | 65 +++++++++++++++++++++
 .../modules/lsp/client/bindings/CodeActions.java   | 12 ++--
 .../lsp/client/bindings/HyperlinkProviderImpl.java | 49 ++++++++++------
 .../lsp/client/bindings/LanguageClientImpl.java    | 51 ++++-------------
 .../lsp/client/bindings/NavigatorPanelImpl.java    | 66 +++++++++++++++++++---
 10 files changed, 192 insertions(+), 86 deletions(-)

diff --git a/ide/lsp.client/external/binaries-list 
b/ide/lsp.client/external/binaries-list
index 248d43a..1779fd7 100644
--- a/ide/lsp.client/external/binaries-list
+++ b/ide/lsp.client/external/binaries-list
@@ -15,9 +15,9 @@
 # specific language governing permissions and limitations
 # under the License.
 
-90E34B7C7E0257E3993CA5A939AE94F889D31340 
org.eclipse.lsp4j:org.eclipse.lsp4j:0.4.1
-467F27E91FD694C05EB663532F2EDE0404025AFE 
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.4.1
-F3F93F50BBEB7D58B50E6FFCA615CBFC76491846 
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.4.1
+22FA797D3E83E92ABBA55D1020DECFB6FC7454BA 
org.eclipse.lsp4j:org.eclipse.lsp4j:0.7.0
+D5DA405216BFF241A78DDA7F44F35362E09BBDC2 
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.7.0
+4017EAB62A0845A1D166A1B902AE4EEFCA6594EB 
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.7.0
 56459301B64C92BBBB6E13988B91CDBE1FC6264E 
org.eclipse.xtend:org.eclipse.xtend.lib:2.14.0
 F2FCA7A70C8A29374E79487417CEFB5F51A84867 
org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.14.0
 C40FFE7E5E6244DD094AE95009AA45072C629254 
org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.14.0
diff --git a/ide/lsp.client/external/lsp4j-0.4.1-license.txt 
b/ide/lsp.client/external/lsp4j-0.7.0-license.txt
similarity index 98%
rename from ide/lsp.client/external/lsp4j-0.4.1-license.txt
rename to ide/lsp.client/external/lsp4j-0.7.0-license.txt
index 8129cb7..1cff7fa 100644
--- a/ide/lsp.client/external/lsp4j-0.4.1-license.txt
+++ b/ide/lsp.client/external/lsp4j-0.7.0-license.txt
@@ -1,10 +1,10 @@
 Name: Eclipse Language Server Protocol Library
 Origin: Eclipse
-Version: 0.4.1
+Version: 0.7.0
 License: EPL-v10
 URL: http://www.eclipse.org/
 Description: Eclipse Language Server Protocol Library
-Files: org.eclipse.lsp4j-0.4.1.jar org.eclipse.lsp4j.generator-0.4.1.jar 
org.eclipse.lsp4j.jsonrpc-0.4.1.jar
+Files: org.eclipse.lsp4j-0.7.0.jar org.eclipse.lsp4j.generator-0.7.0.jar 
org.eclipse.lsp4j.jsonrpc-0.7.0.jar
 
 Eclipse Public License - v 1.0
 
diff --git a/ide/lsp.client/nbproject/project.properties 
b/ide/lsp.client/nbproject/project.properties
index 1118a91..bc9ed2c 100644
--- a/ide/lsp.client/nbproject/project.properties
+++ b/ide/lsp.client/nbproject/project.properties
@@ -18,9 +18,9 @@
 javac.source=1.8
 javac.compilerargs=-Xlint -Xlint:-serial
 javadoc.arch=${basedir}/arch.xml
-release.external/org.eclipse.lsp4j-0.4.1.jar=modules/ext/org.eclipse.lsp4j-0.4.1.jar
-release.external/org.eclipse.lsp4j.generator-0.4.1.jar=modules/ext/org.eclipse.lsp4j.generator-0.4.1.jar
-release.external/org.eclipse.lsp4j.jsonrpc-0.4.1.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.4.1.jar
+release.external/org.eclipse.lsp4j-0.7.0.jar=modules/ext/org.eclipse.lsp4j-0.7.0.jar
+release.external/org.eclipse.lsp4j.generator-0.7.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.7.0.jar
+release.external/org.eclipse.lsp4j.jsonrpc-0.7.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.7.0.jar
 
release.external/org.eclipse.xtend.lib-2.14.0.jar=modules/ext/org.eclipse.xtend.lib-2.14.0.jar
 
release.external/org.eclipse.xtend.lib.macro-2.14.0.jar=modules/ext/org.eclipse.xtend.lib.macro-2.14.0.jar
 
release.external/org.eclipse.xtext.xbase.lib-2.14.0.jar=modules/ext/org.eclipse.xtext.xbase.lib-2.14.0.jar
diff --git a/ide/lsp.client/nbproject/project.xml 
b/ide/lsp.client/nbproject/project.xml
index c032598..00ad85f 100644
--- a/ide/lsp.client/nbproject/project.xml
+++ b/ide/lsp.client/nbproject/project.xml
@@ -224,16 +224,16 @@
                 <package>org.netbeans.modules.lsp.client.spi</package>
             </public-packages>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j-0.4.1.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j-0.4.1.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j-0.7.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j-0.7.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 
<runtime-relative-path>ext/org.eclipse.xtend.lib.macro-2.14.0.jar</runtime-relative-path>
                 
<binary-origin>external/org.eclipse.xtend.lib.macro-2.14.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.4.1.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j.generator-0.4.1.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.7.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j.generator-0.7.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
                 
<runtime-relative-path>ext/org.eclipse.xtend.lib-2.14.0.jar</runtime-relative-path>
@@ -244,8 +244,8 @@
                 
<binary-origin>external/org.eclipse.xtext.xbase.lib-2.14.0.jar</binary-origin>
             </class-path-extension>
             <class-path-extension>
-                
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.4.1.jar</runtime-relative-path>
-                
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.4.1.jar</binary-origin>
+                
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.7.0.jar</runtime-relative-path>
+                
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.7.0.jar</binary-origin>
             </class-path-extension>
         </data>
     </configuration>
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 5889b9b..a0eb7be 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
@@ -35,6 +35,7 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.util.stream.Collectors;
 import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.DocumentSymbolCapabilities;
 import org.eclipse.lsp4j.InitializeParams;
 import org.eclipse.lsp4j.InitializeResult;
 import org.eclipse.lsp4j.TextDocumentClientCapabilities;
@@ -164,7 +165,11 @@ public class LSPBindings {
        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));
+       TextDocumentClientCapabilities tdcc = new 
TextDocumentClientCapabilities();
+       DocumentSymbolCapabilities dsc = new DocumentSymbolCapabilities();
+       dsc.setHierarchicalDocumentSymbolSupport(true);
+       tdcc.setDocumentSymbol(dsc);
+       initParams.setCapabilities(new ClientCapabilities(new 
WorkspaceClientCapabilities(), tdcc, null));
        return server.initialize(initParams).get();
     }
 
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
index f972bc5..b924944 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
@@ -18,12 +18,29 @@
  */
 package org.netbeans.modules.lsp.client;
 
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
+import javax.swing.text.StyledDocument;
+import org.eclipse.lsp4j.CodeAction;
+import org.eclipse.lsp4j.Command;
+import org.eclipse.lsp4j.ExecuteCommandParams;
 import org.eclipse.lsp4j.Position;
+import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.netbeans.api.editor.document.LineDocument;
 import org.netbeans.api.editor.document.LineDocumentUtils;
+import org.openide.cookies.EditorCookie;
 import org.openide.filesystems.FileObject;
+import org.openide.filesystems.URLMapper;
+import org.openide.text.NbDocument;
+import org.openide.util.Exceptions;
 
 /**
  *
@@ -43,4 +60,52 @@ public class Utils {
     public static int getOffset(Document doc, Position pos) {
         return LineDocumentUtils.getLineStartFromIndex((LineDocument) doc, 
pos.getLine()) + pos.getCharacter();
     }
+
+    public static void applyWorkspaceEditor(WorkspaceEdit edit) {
+        for (Map.Entry<String, List<TextEdit>> e : 
edit.getChanges().entrySet()) {
+            try {
+                FileObject file = URLMapper.findFileObject(new 
URI(e.getKey()).toURL());
+                EditorCookie ec = file.getLookup().lookup(EditorCookie.class);
+                Document doc = ec != null ? ec.openDocument() : null;
+                if (doc == null) {
+                    continue;
+                }
+                NbDocument.runAtomic((StyledDocument) doc, () -> {
+                    e.getValue()
+                     .stream()
+                     .sorted((te1, te2) -> te1.getRange().getEnd().getLine() 
== te2.getRange().getEnd().getLine() ? te1.getRange().getEnd().getCharacter() - 
te2.getRange().getEnd().getCharacter() : te1.getRange().getEnd().getLine() - 
te2.getRange().getEnd().getLine())
+                     .forEach(te -> {
+                        try {
+                            int start = Utils.getOffset(doc, 
te.getRange().getStart());
+                            int end = Utils.getOffset(doc, 
te.getRange().getEnd());
+                            doc.remove(start, end - start);
+                            doc.insertString(start, te.getNewText(), null);
+                        } catch (BadLocationException ex) {
+                            Exceptions.printStackTrace(ex);
+                        }
+                     });
+                });
+            } catch (URISyntaxException | IOException ex) {
+                Exceptions.printStackTrace(ex);
+            }
+        }
+    }
+
+    public static void applyCodeAction(LSPBindings server, Either<Command, 
CodeAction> cmd) {
+        try {
+            Command command;
+
+            if (cmd.isLeft()) {
+                command = cmd.getLeft();
+            } else {
+                Utils.applyWorkspaceEditor(cmd.getRight().getEdit());
+                command = cmd.getRight().getCommand();
+            }
+            if (command != null) {
+                server.getWorkspaceService().executeCommand(new 
ExecuteCommandParams(command.getCommand(), command.getArguments())).get();
+            }
+        } catch (InterruptedException | ExecutionException ex) {
+            Exceptions.printStackTrace(ex);
+        }
+    }
 }
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CodeActions.java 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CodeActions.java
index 982da88..6ba877c 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CodeActions.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CodeActions.java
@@ -24,12 +24,14 @@ import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.JTextComponent;
+import org.eclipse.lsp4j.CodeAction;
 import org.eclipse.lsp4j.CodeActionContext;
 import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.Command;
 import org.eclipse.lsp4j.ExecuteCommandParams;
 import org.eclipse.lsp4j.Range;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
 import org.netbeans.modules.editor.NbEditorUtilities;
 import org.netbeans.modules.lsp.client.LSPBindings;
@@ -62,7 +64,7 @@ public class CodeActions implements CodeGenerator.Factory {
         }
         String uri = Utils.toURI(file);
         try {
-            List<? extends Command> commands = 
+            List<Either<Command, CodeAction>> commands =
                     server.getTextDocumentService().codeAction(new 
CodeActionParams(new TextDocumentIdentifier(uri),
                     new Range(Utils.createPosition(component.getDocument(), 
component.getSelectionStart()),
                             Utils.createPosition(component.getDocument(), 
component.getSelectionEnd())),
@@ -70,16 +72,12 @@ public class CodeActions implements CodeGenerator.Factory {
             return commands.stream().map(cmd -> new CodeGenerator() {
                 @Override
                 public String getDisplayName() {
-                    return cmd.getTitle();
+                    return cmd.isLeft() ? cmd.getLeft().getTitle() : 
cmd.getRight().getTitle();
                 }
 
                 @Override
                 public void invoke() {
-                    try {
-                        server.getWorkspaceService().executeCommand(new 
ExecuteCommandParams(cmd.getCommand(), cmd.getArguments())).get();
-                    } catch (InterruptedException | ExecutionException ex) {
-                        Exceptions.printStackTrace(ex);
-                    }
+                    Utils.applyCodeAction(server, cmd);
                 }
             }).collect(Collectors.toList());
         } catch (BadLocationException | InterruptedException | 
ExecutionException ex) {
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/HyperlinkProviderImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/HyperlinkProviderImpl.java
index 4f1cb70..3419d7e 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/HyperlinkProviderImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/HyperlinkProviderImpl.java
@@ -29,8 +29,11 @@ import javax.swing.SwingUtilities;
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import org.eclipse.lsp4j.Location;
+import org.eclipse.lsp4j.LocationLink;
+import org.eclipse.lsp4j.Range;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
 import org.eclipse.lsp4j.TextDocumentPositionParams;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.netbeans.api.editor.mimelookup.MimeRegistration;
 import org.netbeans.editor.BaseDocument;
 import org.netbeans.editor.Utilities;
@@ -91,32 +94,44 @@ public class HyperlinkProviderImpl implements 
HyperlinkProviderExt {
             params = new TextDocumentPositionParams(new 
TextDocumentIdentifier(uri),
                                                     Utils.createPosition(doc, 
offset));
             //TODO: Location or Location[]
-            CompletableFuture<List<? extends Location>> def = 
server.getTextDocumentService().definition(params);
+            CompletableFuture<Either<List<? extends Location>, List<? extends 
LocationLink>>> def = server.getTextDocumentService().definition(params);
             def.handleAsync((locations, exception) -> {
                 if (exception != null) {
                     exception.printStackTrace();
                 }
-                if (locations != null && locations.size() == 1) { //TODO: what 
to do when there are multiple locations?
-                    try {
-                        URI target = URI.create(locations.get(0).getUri());
-                        FileObject targetFile = 
URLMapper.findFileObject(target.toURL());
+                if (locations == null) {
+                    return null;
+                }
+                String targetUri;
+                Range targetRange;
+                if (locations.isLeft() && locations.getLeft().size() == 1) { 
//TODO: what to do when there are multiple locations?
+                    targetUri = locations.getLeft().get(0).getUri();
+                    targetRange = locations.getLeft().get(0).getRange();
+                } else if (locations.isRight() && locations.getRight().size() 
== 1) { //TODO: what to do when there are multiple locations?
+                    targetUri = locations.getRight().get(0).getTargetUri();
+                    targetRange = locations.getRight().get(0).getTargetRange();
+                } else {
+                    return null;
+                }
+                try {
+                    URI target = URI.create(targetUri);
+                    FileObject targetFile = 
URLMapper.findFileObject(target.toURL());
 
-                        if (targetFile != null) {
-                            LineCookie lc = 
targetFile.getLookup().lookup(LineCookie.class);
+                    if (targetFile != null) {
+                        LineCookie lc = 
targetFile.getLookup().lookup(LineCookie.class);
 
-                            //TODO: expecting lc != null!
+                        //TODO: expecting lc != null!
 
-                            Line line = 
lc.getLineSet().getCurrent(locations.get(0).getRange().getStart().getLine());
+                        Line line = 
lc.getLineSet().getCurrent(targetRange.getStart().getLine());
 
-                            SwingUtilities.invokeLater(() ->
-                                line.show(ShowOpenType.OPEN, 
ShowVisibilityType.FOCUS, locations.get(0).getRange().getStart().getCharacter())
-                            );
-                        } else {
-                            //TODO: beep
-                        }
-                    } catch (MalformedURLException ex) {
-                        Exceptions.printStackTrace(ex);
+                        SwingUtilities.invokeLater(() ->
+                            line.show(ShowOpenType.OPEN, 
ShowVisibilityType.FOCUS, targetRange.getStart().getCharacter())
+                        );
+                    } else {
+                        //TODO: beep
                     }
+                } catch (MalformedURLException ex) {
+                    Exceptions.printStackTrace(ex);
                 }
                 return null;
             }).get();
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
index fe2ebdd..bb4abce 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
@@ -40,7 +40,9 @@ import javax.swing.text.Document;
 import javax.swing.text.StyledDocument;
 import org.eclipse.lsp4j.ApplyWorkspaceEditParams;
 import org.eclipse.lsp4j.ApplyWorkspaceEditResponse;
+import org.eclipse.lsp4j.CodeAction;
 import org.eclipse.lsp4j.CodeActionContext;
+import org.eclipse.lsp4j.CodeActionOptions;
 import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.Command;
 import org.eclipse.lsp4j.ConfigurationItem;
@@ -56,6 +58,7 @@ import org.eclipse.lsp4j.ShowMessageRequestParams;
 import org.eclipse.lsp4j.TextDocumentIdentifier;
 import org.eclipse.lsp4j.TextEdit;
 import org.eclipse.lsp4j.WorkspaceEdit;
+import org.eclipse.lsp4j.jsonrpc.messages.Either;
 import org.eclipse.lsp4j.services.LanguageClient;
 import org.netbeans.modules.lsp.client.LSPBindings;
 import org.netbeans.modules.lsp.client.Utils;
@@ -88,8 +91,8 @@ public class LanguageClientImpl implements LanguageClient {
     public void setBindings(LSPBindings bindings) {
         this.bindings = bindings;
         ServerCapabilities serverCapabilities = 
bindings.getInitResult().getCapabilities();
-        Boolean codeActions = serverCapabilities.getCodeActionProvider();
-        allowCodeActions = codeActions != null && codeActions;
+        Either<Boolean, CodeActionOptions> codeActions = 
serverCapabilities.getCodeActionProvider();
+        allowCodeActions = codeActions != null && (!codeActions.isLeft() || 
codeActions.getLeft());
     }
 
     @Override
@@ -126,34 +129,7 @@ public class LanguageClientImpl implements LanguageClient {
 
     @Override
     public CompletableFuture<ApplyWorkspaceEditResponse> 
applyEdit(ApplyWorkspaceEditParams params) {
-        WorkspaceEdit edit = params.getEdit();
-        for (Entry<String, List<TextEdit>> e : edit.getChanges().entrySet()) {
-            try {
-                FileObject file = URLMapper.findFileObject(new 
URI(e.getKey()).toURL());
-                EditorCookie ec = file.getLookup().lookup(EditorCookie.class);
-                Document doc = ec != null ? ec.openDocument() : null;
-                if (doc == null) {
-                    continue;
-                }
-                NbDocument.runAtomic((StyledDocument) doc, () -> {
-                    e.getValue()
-                     .stream()
-                     .sorted((te1, te2) -> te1.getRange().getEnd().getLine() 
== te2.getRange().getEnd().getLine() ? te1.getRange().getEnd().getCharacter() - 
te2.getRange().getEnd().getCharacter() : te1.getRange().getEnd().getLine() - 
te2.getRange().getEnd().getLine())
-                     .forEach(te -> {
-                        try {
-                            int start = Utils.getOffset(doc, 
te.getRange().getStart());
-                            int end = Utils.getOffset(doc, 
te.getRange().getEnd());
-                            doc.remove(start, end - start);
-                            doc.insertString(start, te.getNewText(), null);
-                        } catch (BadLocationException ex) {
-                            Exceptions.printStackTrace(ex);
-                        }
-                     });
-                });
-            } catch (URISyntaxException | IOException ex) {
-                Exceptions.printStackTrace(ex);
-            }
-        }
+        Utils.applyWorkspaceEditor(params.getEdit());
         return CompletableFuture.completedFuture(new 
ApplyWorkspaceEditResponse(true));
     }
 
@@ -221,7 +197,7 @@ public class LanguageClientImpl implements LanguageClient {
                 computing = true;
                 bindings.runOnBackground(() -> {
                     try {
-                        List<? extends Command> commands =
+                        List<Either<Command, CodeAction>> commands =
                                 
bindings.getTextDocumentService().codeAction(new CodeActionParams(new 
TextDocumentIdentifier(fileUri),
                                         diagnostic.getRange(),
                                         new 
CodeActionContext(Collections.singletonList(diagnostic)))).get();
@@ -250,25 +226,20 @@ public class LanguageClientImpl implements LanguageClient 
{
 
         private class CommandBasedFix implements Fix {
 
-            private final Command cmd;
+            private final Either<Command, CodeAction> cmd;
 
-            public CommandBasedFix(Command cmd) {
+            public CommandBasedFix(Either<Command, CodeAction> cmd) {
                 this.cmd = cmd;
             }
 
             @Override
             public String getText() {
-                return cmd.getTitle();
+                return cmd.isLeft() ? cmd.getLeft().getTitle() : 
cmd.getRight().getTitle();
             }
 
             @Override
             public ChangeInfo implement() throws Exception {
-                try {
-                    bindings.getWorkspaceService().executeCommand(new 
ExecuteCommandParams(cmd.getCommand(), cmd.getArguments())).get();
-                } catch (InterruptedException | ExecutionException ex) {
-                    Exceptions.printStackTrace(ex);
-                }
-                
+                Utils.applyCodeAction(bindings, cmd);
                 return null;
             }
         }
diff --git 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/NavigatorPanelImpl.java
 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/NavigatorPanelImpl.java
index def4911..56c01b9 100644
--- 
a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/NavigatorPanelImpl.java
+++ 
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/NavigatorPanelImpl.java
@@ -27,9 +27,11 @@ import java.util.List;
 import java.util.concurrent.ExecutionException;
 import javax.swing.JComponent;
 import javax.swing.JPanel;
+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.netbeans.modules.lsp.client.LSPBindings;
 import org.netbeans.modules.lsp.client.LSPBindings.BackgroundTask;
 import org.netbeans.modules.lsp.client.Utils;
@@ -52,7 +54,7 @@ import org.openide.util.lookup.ServiceProvider;
  *
  * @author lahvac
  */
-public class NavigatorPanelImpl extends Children.Keys<SymbolInformation> 
implements NavigatorPanel, BackgroundTask, LookupListener {
+public class NavigatorPanelImpl extends 
Children.Keys<Either<SymbolInformation, DocumentSymbol>> implements 
NavigatorPanel, BackgroundTask, LookupListener {
 
     private static final NavigatorPanelImpl INSTANCE = new 
NavigatorPanelImpl();
 
@@ -137,7 +139,7 @@ public class NavigatorPanelImpl extends 
Children.Keys<SymbolInformation> impleme
         if (file.equals(this.file)) {
             try {
                 String uri = Utils.toURI(file);
-                List<? extends SymbolInformation> symbols = 
bindings.getTextDocumentService().documentSymbol(new DocumentSymbolParams(new 
TextDocumentIdentifier(uri))).get();
+                List<Either<SymbolInformation, DocumentSymbol>> symbols = 
bindings.getTextDocumentService().documentSymbol(new DocumentSymbolParams(new 
TextDocumentIdentifier(uri))).get();
 
                 setKeys(symbols);
             } catch (InterruptedException | ExecutionException ex) {
@@ -149,11 +151,8 @@ public class NavigatorPanelImpl extends 
Children.Keys<SymbolInformation> impleme
     }
 
     @Override
-    protected Node[] createNodes(SymbolInformation sym) {
-        AbstractNode n = new AbstractNode(LEAF);
-        n.setDisplayName(sym.getName());
-        n.setIconBaseWithExtension(Icons.getSymbolIconBase(sym.getKind()));
-        return new Node[] {n};
+    protected Node[] createNodes(Either<SymbolInformation, DocumentSymbol> 
sym) {
+        return new Node[] {new NodeImpl(sym)};
     }
 
     @Override
@@ -161,6 +160,59 @@ public class NavigatorPanelImpl extends 
Children.Keys<SymbolInformation> impleme
         updateFile();
     }
 
+    private static final class NodeImpl extends AbstractNode {
+
+        private static Children createChildren(Either<SymbolInformation, 
DocumentSymbol> sym) {
+            if (sym.isLeft()) {
+                return LEAF;
+            }
+            return createChildren(sym.getRight());
+        }
+
+        private static Children createChildren(DocumentSymbol sym) {
+            if (sym.getChildren().isEmpty()) {
+                return LEAF;
+            }
+            return new Keys<DocumentSymbol>() {
+                @Override
+                protected void addNotify() {
+                    setKeys(sym.getChildren());
+                }
+
+                @Override
+                protected Node[] createNodes(DocumentSymbol sym) {
+                    return new Node[] {
+                        new NodeImpl(sym)
+                    };
+                }
+
+                @Override
+                protected void removeNotify() {
+                    setKeys(Collections.emptyList());
+                }
+
+            };
+        }
+
+        public NodeImpl(Either<SymbolInformation, DocumentSymbol> symbol) {
+            super(createChildren(symbol));
+            if (symbol.isLeft()) {
+                setDisplayName(symbol.getLeft().getName());
+                
setIconBaseWithExtension(Icons.getSymbolIconBase(symbol.getLeft().getKind()));
+            } else {
+                setDisplayName(symbol.getRight().getName());
+                
setIconBaseWithExtension(Icons.getSymbolIconBase(symbol.getRight().getKind()));
+            }
+        }
+
+        public NodeImpl(DocumentSymbol symbol) {
+            super(createChildren(symbol));
+            setDisplayName(symbol.getName());
+            
setIconBaseWithExtension(Icons.getSymbolIconBase(symbol.getKind()));
+        }
+
+    }
+
     @ServiceProvider(service=DynamicRegistration.class)
     public static final class DynamicRegistrationImpl implements 
DynamicRegistration {
 


---------------------------------------------------------------------
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

Reply via email to