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 96f51a7  Various fixes for LSP codeAction and rename requests. (#2655)
96f51a7 is described below

commit 96f51a783e8794e18b4dea5629d5a26b89ced179
Author: Dusan Balek <dusan.ba...@oracle.com>
AuthorDate: Sat Jan 9 17:02:18 2021 +0100

    Various fixes for LSP codeAction and rename requests. (#2655)
    
    * Request textDocument/codeAction failed when selecting source code for 
Introduce var refactor - fixed.
    * Implementing an interface results in NullPointerException - fixed.
    * GeneratorUtils$DuplicateMemberException: Class member already exists form 
Generate Constructor source action - fixed.
    * IllegalStateException from Rename Symbol - fixed.
    * GeneratorUtils$DuplicateMemberException: Class member already exists 
thrown from introduce element hints - fixed.
---
 .../modules/java/hints/errors/CreateClassFix.java  |  2 +-
 .../IntroduceExpressionBasedMethodFix.java         | 14 ++++-
 .../java/hints/introduce/IntroduceMethodFix.java   | 14 ++++-
 .../modules/java/lsp/server/LspServerUtils.java    |  2 +-
 .../lsp/server/protocol/ConstructorGenerator.java  | 16 ++++--
 .../server/protocol/TextDocumentServiceImpl.java   | 63 ++++++++++++----------
 java/java.lsp.server/vscode/src/extension.ts       |  4 +-
 7 files changed, 75 insertions(+), 40 deletions(-)

diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/errors/CreateClassFix.java
 
b/java/java.hints/src/org/netbeans/modules/java/hints/errors/CreateClassFix.java
index d83bf63..46469b8 100644
--- 
a/java/java.hints/src/org/netbeans/modules/java/hints/errors/CreateClassFix.java
+++ 
b/java/java.hints/src/org/netbeans/modules/java/hints/errors/CreateClassFix.java
@@ -309,7 +309,7 @@ public abstract class CreateClassFix extends CreateFixBase 
implements EnhancedFi
                             source = 
make.Class(make.Modifiers(EnumSet.of(Modifier.PUBLIC)), simpleName, 
Collections.<TypeParameterTree>emptyList(), null, 
Collections.<Tree>emptyList(), Collections.<Tree>emptyList());
                             break;
                         case INTERFACE:
-                            source = 
make.Interface(make.Modifiers(EnumSet.of(Modifier.PUBLIC)), simpleName, 
Collections.<TypeParameterTree>emptyList(), null, 
Collections.<Tree>emptyList());
+                            source = 
make.Interface(make.Modifiers(EnumSet.of(Modifier.PUBLIC)), simpleName, 
Collections.<TypeParameterTree>emptyList(), Collections.<Tree>emptyList(), 
Collections.<Tree>emptyList());
                             break;
                         case ANNOTATION_TYPE:
                             source = 
make.AnnotationType(make.Modifiers(EnumSet.of(Modifier.PUBLIC)), simpleName, 
Collections.<Tree>emptyList());
diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceExpressionBasedMethodFix.java
 
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceExpressionBasedMethodFix.java
index 5b08e05..d5aa9e4 100644
--- 
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceExpressionBasedMethodFix.java
+++ 
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceExpressionBasedMethodFix.java
@@ -27,6 +27,7 @@ import com.sun.source.tree.Tree;
 import com.sun.source.tree.TypeParameterTree;
 import com.sun.source.tree.VariableTree;
 import com.sun.source.util.TreePath;
+import java.awt.GraphicsEnvironment;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -199,7 +200,16 @@ final class IntroduceExpressionBasedMethodFix extends 
IntroduceFixBase implement
 
     @Override
     public ModificationResult getModificationResult() throws IOException {
-        return getModificationResult("method", targets.iterator().next(), 
true, EnumSet.of(Modifier.PRIVATE), false, null);
+        ModificationResult result = null;
+        int counter = 0;
+        do {
+            try {
+                result = getModificationResult("method" + (counter != 0 ? 
String.valueOf(counter) : ""), targets.iterator().next(), true, 
EnumSet.of(Modifier.PRIVATE), false, null);
+            } catch (Exception e) {
+                counter++;
+            }
+        } while (result == null && counter < 10);
+        return result;
     }
 
     private ModificationResult getModificationResult(final String name, final 
TargetDescription target, final boolean replaceOther, final Set<Modifier> 
access, final boolean redoReferences, final MemberSearchResult searchResult) 
throws IOException {
@@ -259,7 +269,7 @@ final class IntroduceExpressionBasedMethodFix extends 
IntroduceFixBase implement
                         TreePath firstLeaf = desc.getOccurrenceRoot();
                         int startOff = (int) 
copy.getTrees().getSourcePositions().getStartPosition(copy.getCompilationUnit(),
 firstLeaf.getLeaf());
                         int endOff = (int) 
copy.getTrees().getSourcePositions().getEndPosition(copy.getCompilationUnit(), 
firstLeaf.getLeaf());
-                        if (!IntroduceHint.shouldReplaceDuplicate(doc, 
startOff, endOff)) {
+                        if (!GraphicsEnvironment.isHeadless() && 
!IntroduceHint.shouldReplaceDuplicate(doc, startOff, endOff)) {
                             continue;
                         }
                         //XXX:
diff --git 
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceMethodFix.java
 
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceMethodFix.java
index d3284d8..0eefbb2 100644
--- 
a/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceMethodFix.java
+++ 
b/java/java.hints/src/org/netbeans/modules/java/hints/introduce/IntroduceMethodFix.java
@@ -35,6 +35,7 @@ import com.sun.source.tree.TypeParameterTree;
 import com.sun.source.tree.VariableTree;
 import com.sun.source.util.SourcePositions;
 import com.sun.source.util.TreePath;
+import java.awt.GraphicsEnvironment;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -438,7 +439,16 @@ public final class IntroduceMethodFix extends 
IntroduceFixBase implements Fix {
 
     @Override
     public ModificationResult getModificationResult() throws IOException {
-        return js.runModificationTask(new 
TaskImpl(EnumSet.of(Modifier.PRIVATE), "method", targets.iterator().next(), 
true, null, false));
+        ModificationResult result = null;
+        int counter = 0;
+        do {
+            try {
+                result = js.runModificationTask(new 
TaskImpl(EnumSet.of(Modifier.PRIVATE), "method" + (counter != 0 ? 
String.valueOf(counter) : ""), targets.iterator().next(), true, null, false));
+            } catch (Exception e) {
+                counter++;
+            }
+        } while (result == null && counter < 10);
+        return result;
     }
 
     static class OccurrencePositionComparator implements 
Comparator<Occurrence> {
@@ -863,7 +873,7 @@ public final class IntroduceMethodFix extends 
IntroduceFixBase implements Fix {
                     int startOff = (int) 
copy.getTrees().getSourcePositions().getStartPosition(copy.getCompilationUnit(),
 firstSt);
                     int endOff = (int) 
copy.getTrees().getSourcePositions().getEndPosition(copy.getCompilationUnit(), 
lastSt);
                     
-                    if (usedAfter || 
!IntroduceHint.shouldReplaceDuplicate(doc, startOff, endOff)) {
+                    if (usedAfter || !GraphicsEnvironment.isHeadless() && 
!IntroduceHint.shouldReplaceDuplicate(doc, startOff, endOff)) {
                         continue;
                     }
                     List<StatementTree> newStatements = new 
LinkedList<StatementTree>();
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/LspServerUtils.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/LspServerUtils.java
index ab14aed..c98193b 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/LspServerUtils.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/LspServerUtils.java
@@ -85,7 +85,7 @@ public class LspServerUtils {
     public static final void avoidClientMessageThread(Lookup context) {
         NbCodeLanguageClient client = LspServerUtils.findLspClient(context);
         if (LspServerUtils.isClientResponseThread(client)) {
-            throw new IllegalStateException("Can not block LSP server message 
loop. Use RequestProcessor to run the calling code, or use notifyLater()");
+            throw new IllegalStateException("Cannot block LSP server message 
loop. Use RequestProcessor to run the calling code, or use notifyLater()");
         }
     }
 }
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/ConstructorGenerator.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/ConstructorGenerator.java
index d3e6fab..27e3dd8 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/ConstructorGenerator.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/ConstructorGenerator.java
@@ -110,9 +110,14 @@ public final class ConstructorGenerator extends 
CodeGenerator {
         }
         List<QuickPickItem> constructors;
         if (typeElement.getKind() != ElementKind.ENUM && 
inheritedConstructors.size() == 1) {
-            QuickPickItem item = new QuickPickItem(createLabel(info, 
inheritedConstructors.get(0)));
-            item.setUserData(new ElementData(inheritedConstructors.get(0)));
-            constructors = Collections.singletonList(item);
+            if (uninitializedFields.isEmpty() && 
inheritedConstructors.get(0).getParameters().isEmpty()
+                    && 
ElementFilter.constructorsIn(typeElement.getEnclosedElements()).stream().filter(ctor
 -> ctor.getParameters().isEmpty() && 
!info.getElementUtilities().isSynthetic(ctor)).count() > 0) {
+                constructors = Collections.emptyList();
+            } else {
+                QuickPickItem item = new QuickPickItem(createLabel(info, 
inheritedConstructors.get(0)));
+                item.setUserData(new 
ElementData(inheritedConstructors.get(0)));
+                constructors = Collections.singletonList(item);
+            }
         } else if (inheritedConstructors.size() > 1) {
             constructors = new ArrayList<>(inheritedConstructors.size());
             for (ExecutableElement constructorElement : inheritedConstructors) 
{
@@ -190,6 +195,9 @@ public final class ConstructorGenerator extends 
CodeGenerator {
         }
     }
 
+    @NbBundle.Messages({
+        "DN_ConstructorAlreadyExists=Given constructor already exists",
+    })
     private void generate(NbCodeLanguageClient client, String uri, int offset, 
List<QuickPickItem> constructors, List<QuickPickItem> fields) {
         try {
             FileObject file = Utils.fromUri(uri);
@@ -214,6 +222,8 @@ public final class ConstructorGenerator extends 
CodeGenerator {
                 }
             });
             client.applyEdit(new ApplyWorkspaceEditParams(new 
WorkspaceEdit(Collections.singletonMap(uri, edits))));
+        } catch (GeneratorUtils.DuplicateMemberException dme) {
+            client.showMessage(new MessageParams(MessageType.Info, 
Bundle.DN_ConstructorAlreadyExists()));
         } catch (IOException | IllegalArgumentException ex) {
             client.logMessage(new MessageParams(MessageType.Error, 
ex.getLocalizedMessage()));
         }
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
index 2a55323..52085f0 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java
@@ -121,6 +121,7 @@ import org.eclipse.lsp4j.TextEdit;
 import org.eclipse.lsp4j.VersionedTextDocumentIdentifier;
 import org.eclipse.lsp4j.WorkspaceEdit;
 import org.eclipse.lsp4j.jsonrpc.messages.Either;
+import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode;
 import org.eclipse.lsp4j.services.LanguageClient;
 import org.eclipse.lsp4j.services.LanguageClientAware;
 import org.eclipse.lsp4j.services.TextDocumentService;
@@ -165,6 +166,7 @@ import org.netbeans.modules.java.hints.spiimpl.JavaFixImpl;
 import org.netbeans.modules.java.hints.spiimpl.hints.HintsInvoker;
 import org.netbeans.modules.java.hints.spiimpl.options.HintsSettings;
 import org.netbeans.modules.java.lsp.server.Utils;
+import org.netbeans.modules.java.lsp.server.debugging.utils.ErrorUtilities;
 import org.netbeans.modules.java.source.ElementHandleAccessor;
 import org.netbeans.modules.java.source.ui.ElementOpenAccessor;
 import org.netbeans.modules.parsing.api.ParserManager;
@@ -963,18 +965,18 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                 p = query[0].checkParameters();
                 if (cancel.get()) return ;
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 p = query[0].preCheck();
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 if (cancel.get()) return ;
                 p = query[0].prepare(refactoring);
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 for (RefactoringElement re : 
refactoring.getRefactoringElements()) {
@@ -1258,32 +1260,35 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                     for (ErrorDescription err : IntroduceHint.computeError(cc, 
Utils.getOffset(doc, range.getStart()), Utils.getOffset(doc, range.getEnd()), 
new EnumMap<IntroduceKind, Fix>(IntroduceKind.class), new 
EnumMap<IntroduceKind, String>(IntroduceKind.class), new AtomicBoolean())) {
                         for (Fix fix : err.getFixes().getFixes()) {
                             if (fix instanceof IntroduceFixBase) {
-                                ModificationResult changes = 
((IntroduceFixBase) fix).getModificationResult();
-                                if (changes != null) {
-                                    List<Either<TextDocumentEdit, 
ResourceOperation>> documentChanges = new ArrayList<>();
-                                    Set<? extends FileObject> fos = 
changes.getModifiedFileObjects();
-                                    if (fos.size() == 1) {
-                                        FileObject fileObject = 
fos.iterator().next();
-                                        List<? extends 
ModificationResult.Difference> diffs = changes.getDifferences(fileObject);
-                                        if (diffs != null) {
-                                            List<TextEdit> edits = new 
ArrayList<>();
-                                            for (ModificationResult.Difference 
diff : diffs) {
-                                                String newText = 
diff.getNewText();
-                                                edits.add(new TextEdit(new 
Range(Utils.createPosition(fileObject, diff.getStartPosition().getOffset()),
-                                                                               
  Utils.createPosition(fileObject, diff.getEndPosition().getOffset())),
-                                                                       newText 
!= null ? newText : ""));
+                                try {
+                                    ModificationResult changes = 
((IntroduceFixBase) fix).getModificationResult();
+                                    if (changes != null) {
+                                        List<Either<TextDocumentEdit, 
ResourceOperation>> documentChanges = new ArrayList<>();
+                                        Set<? extends FileObject> fos = 
changes.getModifiedFileObjects();
+                                        if (fos.size() == 1) {
+                                            FileObject fileObject = 
fos.iterator().next();
+                                            List<? extends 
ModificationResult.Difference> diffs = changes.getDifferences(fileObject);
+                                            if (diffs != null) {
+                                                List<TextEdit> edits = new 
ArrayList<>();
+                                                for 
(ModificationResult.Difference diff : diffs) {
+                                                    String newText = 
diff.getNewText();
+                                                    edits.add(new TextEdit(new 
Range(Utils.createPosition(fileObject, diff.getStartPosition().getOffset()),
+                                                                               
      Utils.createPosition(fileObject, diff.getEndPosition().getOffset())),
+                                                                           
newText != null ? newText : ""));
+                                                }
+                                                
documentChanges.add(Either.forLeft(new TextDocumentEdit(new 
VersionedTextDocumentIdentifier(Utils.toUri(fileObject), -1), edits)));
                                             }
-                                            
documentChanges.add(Either.forLeft(new TextDocumentEdit(new 
VersionedTextDocumentIdentifier(Utils.toUri(fileObject), -1), edits)));
-                                        }
-                                        CodeAction codeAction = new 
CodeAction(fix.getText());
-                                        
codeAction.setKind(CodeActionKind.RefactorExtract);
-                                        codeAction.setEdit(new 
WorkspaceEdit(documentChanges));
-                                        int renameOffset = ((IntroduceFixBase) 
fix).getNameOffset(changes);
-                                        if (renameOffset >= 0) {
-                                            codeAction.setCommand(new 
Command("Rename", "java.rename.element.at", 
Collections.singletonList(renameOffset)));
+                                            CodeAction codeAction = new 
CodeAction(fix.getText());
+                                            
codeAction.setKind(CodeActionKind.RefactorExtract);
+                                            codeAction.setEdit(new 
WorkspaceEdit(documentChanges));
+                                            int renameOffset = 
((IntroduceFixBase) fix).getNameOffset(changes);
+                                            if (renameOffset >= 0) {
+                                                codeAction.setCommand(new 
Command("Rename", "java.rename.element.at", 
Collections.singletonList(renameOffset)));
+                                            }
+                                            
result.add(Either.forRight(codeAction));
                                         }
-                                        
result.add(Either.forRight(codeAction));
                                     }
+                                } catch 
(GeneratorUtils.DuplicateMemberException dme) {
                                 }
                             }
                         }
@@ -1453,18 +1458,18 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                 p = refactoring[0].checkParameters();
                 if (cancel.get()) return ;
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 p = refactoring[0].preCheck();
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 if (cancel.get()) return ;
                 p = refactoring[0].prepare(session);
                 if (p != null && p.isFatal()) {
-                    result.completeExceptionally(new 
IllegalStateException(p.getMessage()));
+                    ErrorUtilities.completeExceptionally(result, 
p.getMessage(), ResponseErrorCode.UnknownErrorCode);
                     return ;
                 }
                 //TODO: check client capabilities!
diff --git a/java/java.lsp.server/vscode/src/extension.ts 
b/java/java.lsp.server/vscode/src/extension.ts
index a6c1f0c..c3a78f3 100644
--- a/java/java.lsp.server/vscode/src/extension.ts
+++ b/java/java.lsp.server/vscode/src/extension.ts
@@ -29,7 +29,7 @@ import {
     Message,
     MessageType,
     LogMessageNotification,
-    HandlerResult
+    RevealOutputChannelOn
 } from 'vscode-languageclient';
 
 import * as net from 'net';
@@ -395,7 +395,7 @@ function doActivateWithJDK(specifiedJDK: string | null, 
context: ExtensionContex
                 ]
             },
             outputChannel: log,
-            revealOutputChannelOn: 3, // error
+            revealOutputChannelOn: RevealOutputChannelOn.Never,
             progressOnInitialization: true,
             initializationOptions : {
                 'nbcodeCapabilities' : {


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