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 3262aaac52 NBLS: Refactorings bug fixes. (#3926)
3262aaac52 is described below

commit 3262aaac52ecb7f5590f8a531b5babbd0a0d7003
Author: Dusan Balek <[email protected]>
AuthorDate: Thu Apr 7 11:39:12 2022 +0200

    NBLS: Refactorings bug fixes. (#3926)
    
    * Inconsistence between marking name method and invoking actions fixed.
    * Created files should be indexed before returned to client.
    * The name of method should be changed by Change Method Parameters 
refactoring if requested.
    * Rename Symbol renames wrong file - fixed.
    * Extract Supperclass refactoring imports not available class - fixed.
---
 .../java/lsp/server/protocol/LspTemplateUI.java       | 11 ++++++++++-
 .../lsp/server/protocol/TextDocumentServiceImpl.java  | 19 ++++++++++++++++---
 .../lsp/server/protocol/WorkspaceServiceImpl.java     |  1 -
 .../ChangeMethodParametersRefactoring.java            |  9 +++++++++
 .../ExtractSuperclassOrInterfaceRefactoring.java      |  7 +++++++
 .../java/lsp/server/refactoring/MoveRefactoring.java  |  7 +++++++
 .../lsp/server/refactoring/PullUpRefactoring.java     |  7 +++++++
 .../lsp/server/refactoring/PushDownRefactoring.java   |  7 +++++++
 .../plugins/ExtractSuperclassRefactoringPlugin.java   |  8 ++++++--
 9 files changed, 69 insertions(+), 7 deletions(-)

diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/LspTemplateUI.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/LspTemplateUI.java
index e29fa9451c..b0845195b4 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/LspTemplateUI.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/LspTemplateUI.java
@@ -29,6 +29,7 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,6 +50,7 @@ import org.netbeans.api.project.SourceGroup;
 import org.netbeans.api.project.SourceGroupModifier;
 import org.netbeans.api.templates.CreateDescriptor;
 import org.netbeans.api.templates.FileBuilder;
+import org.netbeans.modules.parsing.api.indexing.IndexingManager;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileUtil;
 import org.openide.filesystems.URLMapper;
@@ -109,7 +111,14 @@ final class LspTemplateUI {
             try {
                 if (builder != null) {
                     List<FileObject> created = builder.build();
-                    return created != null ? (Object) created.stream().map(fo 
-> fo.toURI().toString()).collect(Collectors.toList()) : null;
+                    if (created == null) {
+                        return null;
+                    } else if (created.isEmpty()) {
+                        return Collections.emptyList();
+                    }
+                    // Make sure the newly created files are indexed before 
returned to client
+                    IndexingManager.getDefault().refreshAllIndices(false, 
true, created.toArray(new FileObject[0]));
+                    return (Object) created.stream().map(fo -> 
fo.toURI().toString()).collect(Collectors.toList());
                 }
                 return null;
             } catch (IOException ex) {
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 74161b3f78..7cd46bbe1b 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
@@ -218,6 +218,7 @@ import 
org.netbeans.modules.refactoring.api.RenameRefactoring;
 import org.netbeans.modules.refactoring.api.WhereUsedQuery;
 import org.netbeans.modules.refactoring.api.impl.APIAccessor;
 import org.netbeans.modules.refactoring.api.impl.SPIAccessor;
+import org.netbeans.modules.refactoring.java.api.JavaRefactoringUtils;
 import org.netbeans.modules.refactoring.java.api.WhereUsedQueryConstants;
 import org.netbeans.modules.refactoring.java.spi.hooks.JavaModificationResult;
 import org.netbeans.modules.refactoring.plugins.FileRenamePlugin;
@@ -1208,8 +1209,14 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                     result.complete(null);
                 }
                 int pos = Utils.getOffset((LineDocument) doc, 
params.getPosition());
+                TokenSequence<JavaTokenId> ts = 
cc.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+                ts.move(pos);
+                if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE 
&& ts.offset() == pos) {
+                    pos += 1;
+                }
                 TreePath path = cc.getTreeUtilities().pathFor(pos);
                 RenameRefactoring ref = new 
RenameRefactoring(Lookups.singleton(TreePathHandle.create(path, cc)));
+                
ref.getContext().add(JavaRefactoringUtils.getClasspathInfoFor(cc.getFileObject()));
                 ref.setNewName("any");
                 Problem p = ref.fastCheckParameters();
                 boolean hasFatalProblem = false;
@@ -1221,7 +1228,6 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                     result.complete(null);
                 } else {
                     //XXX: better range computation
-                    TokenSequence<JavaTokenId> ts = 
cc.getTokenHierarchy().tokenSequence(JavaTokenId.language());
                     int d = ts.move(pos);
                     if (ts.moveNext()) {
                         if (d == 0 && ts.token().id() != 
JavaTokenId.IDENTIFIER) {
@@ -1272,7 +1278,13 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                     if (cancel.get()) return ;
                     Document doc = 
cc.getSnapshot().getSource().getDocument(true);
                     if (doc instanceof LineDocument) {
-                        TreePath path = 
cc.getTreeUtilities().pathFor(Utils.getOffset((LineDocument) doc, 
params.getPosition()));
+                        int pos = Utils.getOffset((LineDocument) doc, 
params.getPosition());
+                        TokenSequence<JavaTokenId> ts = 
cc.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+                        ts.move(pos);
+                        if (ts.moveNext() && ts.token().id() != 
JavaTokenId.WHITESPACE && ts.offset() == pos) {
+                            pos += 1;
+                        }
+                        TreePath path = cc.getTreeUtilities().pathFor(pos);
                         List<Object> lookupContent = new ArrayList<>();
 
                         lookupContent.add(TreePathHandle.create(path, cc));
@@ -1288,6 +1300,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                         }
 
                         refactoring[0] = new 
RenameRefactoring(Lookups.fixed(lookupContent.toArray(new Object[0])));
+                        
refactoring[0].getContext().add(JavaRefactoringUtils.getClasspathInfoFor(cc.getFileObject()));
                         refactoring[0].setNewName(params.getNewName());
                         refactoring[0].setSearchInComments(true); //TODO?
                     }
@@ -1339,7 +1352,7 @@ public class TextDocumentServiceImpl implements 
TextDocumentService, LanguageCli
                 List<RefactoringElementImplementation> fileChanges = 
APIAccessor.DEFAULT.getFileChanges(session);
                 for (RefactoringElementImplementation rei : fileChanges) {
                     if (rei instanceof FileRenamePlugin.RenameFile) {
-                        String oldURI = params.getTextDocument().getUri();
+                        String oldURI = Utils.toUri(rei.getParentFile());
                         int dot = oldURI.lastIndexOf('.');
                         int slash = oldURI.lastIndexOf('/');
                         String newURI = oldURI.substring(0, slash + 1) + 
params.getNewName() + oldURI.substring(dot);
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
index c2ccd5b056..11f576e576 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/WorkspaceServiceImpl.java
@@ -101,7 +101,6 @@ import 
org.netbeans.modules.gsf.testrunner.ui.api.TestMethodController;
 import org.netbeans.modules.gsf.testrunner.ui.api.TestMethodFinder;
 import org.netbeans.modules.java.lsp.server.LspServerState;
 import org.netbeans.modules.java.lsp.server.Utils;
-import org.netbeans.modules.java.lsp.server.db.DBAddConnection;
 import 
org.netbeans.modules.java.lsp.server.debugging.attach.AttachConfigurations;
 import 
org.netbeans.modules.java.lsp.server.debugging.attach.AttachNativeConfigurations;
 import org.netbeans.modules.java.source.ElementHandleAccessor;
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ChangeMethodParametersRefactoring.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ChangeMethodParametersRefactoring.java
index 0e5edc8bb9..2250f7061b 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ChangeMethodParametersRefactoring.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ChangeMethodParametersRefactoring.java
@@ -47,12 +47,14 @@ import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.MessageParams;
 import org.eclipse.lsp4j.MessageType;
 import org.netbeans.api.htmlui.HTMLDialog;
+import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
 import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.SourceUtils;
 import org.netbeans.api.java.source.TreePathHandle;
+import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.modules.editor.java.Utilities;
 import org.netbeans.modules.java.lsp.server.Utils;
 import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
@@ -95,6 +97,11 @@ public final class ChangeMethodParametersRefactoring extends 
CodeRefactoring {
         }
         info.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
         int offset = getOffset(info, params.getRange().getStart());
+        TokenSequence<JavaTokenId> ts = 
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+        ts.move(offset);
+        if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE && 
ts.offset() == offset) {
+            offset += 1;
+        }
         Trees trees = info.getTrees();
         TreePath path = info.getTreeUtilities().pathFor(offset);
         Tree.Kind kind = null;
@@ -259,6 +266,8 @@ public final class ChangeMethodParametersRefactoring 
extends CodeRefactoring {
                 }
                 String returnType = ui.getReturnType();
                 refactoring.setReturnType(returnType.length() > 0 ? returnType 
: null);
+                String name = ui.getName();
+                refactoring.setMethodName(name.length() > 0 ? name : null);
                 List<ParameterUI> parameters = ui.getParameters();
                 ChangeParametersRefactoring.ParameterInfo[] params = new 
ChangeParametersRefactoring.ParameterInfo[parameters.size()];
                 for (int i = 0; i < parameters.size(); i++) {
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ExtractSuperclassOrInterfaceRefactoring.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ExtractSuperclassOrInterfaceRefactoring.java
index 2bbf351876..ff53dc5c15 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ExtractSuperclassOrInterfaceRefactoring.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/ExtractSuperclassOrInterfaceRefactoring.java
@@ -47,12 +47,14 @@ import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.MessageParams;
 import org.eclipse.lsp4j.MessageType;
 import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
 import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.TreePathHandle;
 import org.netbeans.api.java.source.TreeUtilities;
+import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.modules.java.lsp.server.Utils;
 import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
 import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
@@ -100,6 +102,11 @@ public final class ExtractSuperclassOrInterfaceRefactoring 
extends CodeRefactori
         }
         info.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
         int offset = getOffset(info, params.getRange().getStart());
+        TokenSequence<JavaTokenId> ts = 
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+        ts.move(offset);
+        if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE && 
ts.offset() == offset) {
+            offset += 1;
+        }
         String uri = Utils.toUri(info.getFileObject());
         Trees trees = info.getTrees();
         TreeUtilities treeUtilities = info.getTreeUtilities();
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/MoveRefactoring.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/MoveRefactoring.java
index 466f92b7c3..5187f8468d 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/MoveRefactoring.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/MoveRefactoring.java
@@ -55,6 +55,7 @@ import org.eclipse.lsp4j.MessageParams;
 import org.eclipse.lsp4j.MessageType;
 import org.netbeans.api.htmlui.HTMLDialog;
 import org.netbeans.api.java.classpath.ClassPath;
+import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.project.JavaProjectConstants;
 import org.netbeans.api.java.source.ClassIndex;
 import org.netbeans.api.java.source.ClasspathInfo;
@@ -64,6 +65,7 @@ import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.ElementUtilities;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.TreePathHandle;
+import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.api.project.FileOwnerQuery;
 import org.netbeans.api.project.Project;
 import org.netbeans.api.project.ProjectUtils;
@@ -118,6 +120,11 @@ public final class MoveRefactoring extends CodeRefactoring 
{
         }
         info.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
         int offset = getOffset(info, params.getRange().getStart());
+        TokenSequence<JavaTokenId> ts = 
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+        ts.move(offset);
+        if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE && 
ts.offset() == offset) {
+            offset += 1;
+        }
         String uri = Utils.toUri(info.getFileObject());
         Element element = elementForOffset(info, offset);
         if (element != null) {
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PullUpRefactoring.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PullUpRefactoring.java
index 86ea3e774c..4f8af76ea5 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PullUpRefactoring.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PullUpRefactoring.java
@@ -46,6 +46,7 @@ import org.eclipse.lsp4j.CodeActionKind;
 import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.MessageParams;
 import org.eclipse.lsp4j.MessageType;
+import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
 import org.netbeans.api.java.source.CompilationInfo;
@@ -54,6 +55,7 @@ import org.netbeans.api.java.source.ElementUtilities;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.TreePathHandle;
 import org.netbeans.api.java.source.TreeUtilities;
+import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.modules.java.lsp.server.Utils;
 import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
 import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
@@ -94,6 +96,11 @@ public final class PullUpRefactoring extends CodeRefactoring 
{
         }
         info.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
         int offset = getOffset(info, params.getRange().getStart());
+        TokenSequence<JavaTokenId> ts = 
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+        ts.move(offset);
+        if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE && 
ts.offset() == offset) {
+            offset += 1;
+        }
         String uri = Utils.toUri(info.getFileObject());
         Trees trees = info.getTrees();
         TreeUtilities treeUtilities = info.getTreeUtilities();
diff --git 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PushDownRefactoring.java
 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PushDownRefactoring.java
index 8291d658a9..2c839e97cf 100644
--- 
a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PushDownRefactoring.java
+++ 
b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/refactoring/PushDownRefactoring.java
@@ -42,6 +42,7 @@ import org.eclipse.lsp4j.CodeActionKind;
 import org.eclipse.lsp4j.CodeActionParams;
 import org.eclipse.lsp4j.MessageParams;
 import org.eclipse.lsp4j.MessageType;
+import org.netbeans.api.java.lexer.JavaTokenId;
 import org.netbeans.api.java.source.ClassIndex;
 import org.netbeans.api.java.source.ClasspathInfo;
 import org.netbeans.api.java.source.CompilationController;
@@ -50,6 +51,7 @@ import org.netbeans.api.java.source.ElementHandle;
 import org.netbeans.api.java.source.JavaSource;
 import org.netbeans.api.java.source.TreePathHandle;
 import org.netbeans.api.java.source.TreeUtilities;
+import org.netbeans.api.lexer.TokenSequence;
 import org.netbeans.modules.java.lsp.server.Utils;
 import org.netbeans.modules.java.lsp.server.protocol.CodeActionsProvider;
 import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient;
@@ -90,6 +92,11 @@ public final class PushDownRefactoring extends 
CodeRefactoring {
         }
         info.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED);
         int offset = getOffset(info, params.getRange().getStart());
+        TokenSequence<JavaTokenId> ts = 
info.getTokenHierarchy().tokenSequence(JavaTokenId.language());
+        ts.move(offset);
+        if (ts.moveNext() && ts.token().id() != JavaTokenId.WHITESPACE && 
ts.offset() == offset) {
+            offset += 1;
+        }
         String uri = Utils.toUri(info.getFileObject());
         Trees trees = info.getTrees();
         SourcePositions sourcePositions = trees.getSourcePositions();
diff --git 
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/ExtractSuperclassRefactoringPlugin.java
 
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/ExtractSuperclassRefactoringPlugin.java
index b2e1417c39..7a0dfcb868 100644
--- 
a/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/ExtractSuperclassRefactoringPlugin.java
+++ 
b/java/refactoring.java/src/org/netbeans/modules/refactoring/java/plugins/ExtractSuperclassRefactoringPlugin.java
@@ -20,7 +20,6 @@ package org.netbeans.modules.refactoring.java.plugins;
 
 import com.sun.source.tree.*;
 import com.sun.source.util.TreePath;
-import org.netbeans.api.java.source.support.ErrorAwareTreeScanner;
 import com.sun.source.util.Trees;
 import java.io.IOException;
 import java.util.*;
@@ -611,7 +610,7 @@ public final class ExtractSuperclassRefactoringPlugin 
extends JavaRefactoringPlu
                                                 ))), false);
                                 // create constructor
                                 MethodTree newConstr = 
make.Method(superclassConstr, block);
-
+                                newConstr = removeAnnotations(make, newConstr);
                                 newConstr = 
removeRuntimeExceptions(workingCopy, superclassConstr, make, newConstr);
 
                                 newConstr = genUtils.importFQNs(newConstr);
@@ -626,6 +625,11 @@ public final class ExtractSuperclassRefactoringPlugin 
extends JavaRefactoringPlu
             }
         }
 
+        private static MethodTree removeAnnotations(final TreeMaker make, 
MethodTree newConstr) {
+            return 
make.Method(make.Modifiers(newConstr.getModifiers().getFlags(), 
Collections.emptyList()), newConstr.getName(), newConstr.getReturnType(),
+                    newConstr.getTypeParameters(), newConstr.getParameters(), 
newConstr.getThrows(), newConstr.getBody(), (ExpressionTree) 
newConstr.getDefaultValue());
+        }
+
         private static MethodTree removeRuntimeExceptions(final WorkingCopy 
javac, ExecutableElement superclassConstr, final TreeMaker make, MethodTree 
newConstr) {
             int i = 0;
             TypeMirror rte = 
javac.getElements().getTypeElement("java.lang.RuntimeException").asType(); 
//NOI18N


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to