Bug 455540 - types in pulled-up method require qualification
- change PullUpRefactoringProcessor.PullUpAstNodeMapper class
to add a SimpleType visit method which checks if the same
type name is used in the target as a simple name but has
a different qualifier in which case change the original
SimpleType to a QualifiedType
- add new test to PullUpTests
Change-Id: I264fe56b8f9739f9087f84be7f77412169953224
Reviewed-on: https://git.eclipse.org/r/c/jdt/eclipse.jdt.ui/+/188897
Tested-by: JDT Bot <jdt-bot@eclipse.org>
Tested-by: Jeff Johnston <jjohnstn@redhat.com>
Reviewed-by: Jeff Johnston <jjohnstn@redhat.com>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/A.java
new file mode 100644
index 0000000..611171d
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/A.java
@@ -0,0 +1,10 @@
+package p;
+
+import q.Asuper;
+
+public class A extends Asuper {
+
+ void m() {
+ C c = null;
+ }
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/C.java
new file mode 100644
index 0000000..cca21a2
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/p/C.java
@@ -0,0 +1,4 @@
+package p;
+
+public class C {
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/Asuper.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/Asuper.java
new file mode 100644
index 0000000..4eb74a4
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/Asuper.java
@@ -0,0 +1,7 @@
+package q;
+
+public class Asuper {
+
+ C cc;
+
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/C.java
new file mode 100644
index 0000000..ebc356e
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/in/q/C.java
@@ -0,0 +1,4 @@
+package q;
+
+public class C {
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/A.java
new file mode 100644
index 0000000..e23c2a3
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/A.java
@@ -0,0 +1,6 @@
+package p;
+
+import q.Asuper;
+
+public class A extends Asuper {
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/C.java
new file mode 100644
index 0000000..cca21a2
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/p/C.java
@@ -0,0 +1,4 @@
+package p;
+
+public class C {
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/Asuper.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/Asuper.java
new file mode 100644
index 0000000..54bdf29
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/Asuper.java
@@ -0,0 +1,11 @@
+package q;
+
+public class Asuper {
+
+ C cc;
+
+ void m() {
+ p.C c = null;
+ }
+
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/C.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/C.java
new file mode 100644
index 0000000..ebc356e
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldMethod5/out/q/C.java
@@ -0,0 +1,4 @@
+package q;
+
+public class C {
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java
index e3ad5d5..dfc677e 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/PullUpTests.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -1589,6 +1589,11 @@
fieldMethodHelper2(new String[] { "c" }, new String[] {}, new String[][] { new String[0] }, true, false);
}
+ @Test
+ public void testFieldMethod5() throws Exception {
+ fieldMethodHelper2(new String[] {}, new String[] {"m"}, new String[][] { new String[0] }, true, false);
+ }
+
//----
@Test
public void testAddingRequiredMembers0() throws Exception {
diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java
index a445e38..44d641f 100644
--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java
+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/PullUpRefactoringProcessor.java
@@ -70,6 +70,7 @@
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.ASTRequestor;
+import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
import org.eclipse.jdt.core.dom.AnonymousClassDeclaration;
import org.eclipse.jdt.core.dom.Block;
@@ -88,6 +89,7 @@
import org.eclipse.jdt.core.dom.Name;
import org.eclipse.jdt.core.dom.NodeFinder;
import org.eclipse.jdt.core.dom.QualifiedName;
+import org.eclipse.jdt.core.dom.QualifiedType;
import org.eclipse.jdt.core.dom.ReturnStatement;
import org.eclipse.jdt.core.dom.SimpleName;
import org.eclipse.jdt.core.dom.SimpleType;
@@ -116,6 +118,7 @@
import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility2Core;
import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;
import org.eclipse.jdt.internal.corext.dom.ASTNodes;
+import org.eclipse.jdt.internal.corext.dom.AbortSearchException;
import org.eclipse.jdt.internal.corext.dom.Bindings;
import org.eclipse.jdt.internal.corext.dom.BodyDeclarationRewrite;
import org.eclipse.jdt.internal.corext.dom.IASTSharedValues;
@@ -238,6 +241,29 @@
}
@Override
+ public final boolean visit(final SimpleType node) {
+ if (node.getName().isSimpleName()) {
+ ITypeBinding binding= node.resolveBinding();
+ if (binding == null) {
+ return false;
+ }
+ CheckTypeNameInTarget check= new CheckTypeNameInTarget(binding);
+ try {
+ fTargetRewriter.getRoot().accept(check);
+ } catch (AbortSearchException e) {
+ // do nothing
+ }
+ if (check.isQualificationRequired() && binding.getPackage() != null && !binding.getPackage().getName().isEmpty()) {
+ String newName= binding.getPackage().getName() + "." + node.getName().getFullyQualifiedName(); //$NON-NLS-1$
+ QualifiedType newQualifiedType= (QualifiedType)fRewrite.createStringPlaceholder(newName, ASTNode.QUALIFIED_TYPE);
+ fRewrite.replace(node, newQualifiedType, null);
+ return false;
+ }
+ }
+ return false;
+ }
+
+ @Override
public final boolean visit(final SuperMethodInvocation node) {
if (!fAnonymousClassDeclaration && !fTypeDeclarationStatement) {
final IBinding superBinding= node.getName().resolveBinding();
@@ -278,6 +304,35 @@
fTypeDeclarationStatement= true;
return super.visit(node);
}
+
+ private class CheckTypeNameInTarget extends ASTVisitor {
+
+ private final ITypeBinding fBinding;
+ private boolean fQualificationRequired;
+
+ public CheckTypeNameInTarget(ITypeBinding binding) {
+ this.fBinding= binding;
+ }
+
+ @Override
+ public boolean visit(SimpleType node) {
+ if (!node.getName().isSimpleName() || !node.getName().getFullyQualifiedName().equals(fBinding.getName())) {
+ return false;
+ }
+ ITypeBinding binding= node.resolveBinding();
+ if (binding != null) {
+ if (!binding.isEqualTo(fBinding)) {
+ fQualificationRequired= true;
+ throw new AbortSearchException();
+ }
+ }
+ return false;
+ }
+
+ public boolean isQualificationRequired() {
+ return fQualificationRequired;
+ }
+ }
}
protected static final String ATTRIBUTE_ABSTRACT= "abstract"; //$NON-NLS-1$