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$