Bug 491541 - [pull up] cannot pull up field with different sub-types

- Add check for type signature before pull up and do not touch those
fields that doesn't have matching type.
- Remove testFieldFail1() test case
- Add new testcase testField1()

Change-Id: I2fdcaae655afc9c79a3932ceb65be2138a81b304
Signed-off-by: Kenneth Styrberg <kenneth@kean.nu>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/in/A.java
new file mode 100644
index 0000000..995f832
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/in/A.java
@@ -0,0 +1,12 @@
+package p;
+
+class A {
+}
+
+class B extends A {
+	int x;
+}
+class C extends B {
+	boolean x;
+}
+
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/out/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/out/A.java
new file mode 100644
index 0000000..f644eac
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testField1/out/A.java
@@ -0,0 +1,13 @@
+package p;
+
+class A {
+
+	boolean x;
+}
+
+class B extends A {
+	int x;
+}
+class C extends B {
+}
+
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java b/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java
deleted file mode 100644
index f3a8c65..0000000
--- a/org.eclipse.jdt.ui.tests.refactoring/resources/PullUp/testFieldFail1/in/A.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package p;
-
-class A {
-}
-
-class B extends A{
-	int x;
-}
-class C extends A{
-	boolean x;
-}
-
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 0b059f5..31b0fb3 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
@@ -216,6 +216,26 @@
 		assertEqualLines(expected, actual);
 	}
 
+	private void fieldHelper1b(String[] fieldNames, int targetClassIndex) throws Exception{
+		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
+		IType typeC= getType(cu, "C");
+		IField[] fields= getFields(typeC, fieldNames);
+
+		PullUpRefactoringProcessor processor= createRefactoringProcessor(fields);
+		Refactoring ref= processor.getRefactoring();
+
+		assertTrue("activation", ref.checkInitialConditions(new NullProgressMonitor()).isOK());
+		setTargetClass(processor, targetClassIndex);
+
+		RefactoringStatus checkInputResult= ref.checkFinalConditions(new NullProgressMonitor());
+		assertTrue("precondition was supposed to pass", !checkInputResult.hasError());
+		performChange(ref, false);
+
+		String expected= getFileContents(getOutputTestFileName("A"));
+		String actual= cu.getSource();
+		assertEqualLines(expected, actual);
+	}
+
 	private void fieldHelper2(String[] fieldNames, int targetClassIndex) throws Exception{
 		ICompilationUnit cu= createCUfromTestFile(getPackageP(), "A");
 		IType type= getType(cu, "B");
@@ -1447,11 +1467,11 @@
 		fieldHelper1(new String[]{"i"}, 0);
 	}
 
-	public void testFieldFail0() throws Exception{
-		fieldHelper2(new String[]{"x"}, 0);
+	public void testField1() throws Exception{
+		fieldHelper1b(new String[]{"x"}, 1);
 	}
 
-	public void testFieldFail1() throws Exception{
+	public void testFieldFail0() throws Exception{
 		fieldHelper2(new String[]{"x"}, 0);
 	}
 
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 b7e7133..1f76cba 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
@@ -882,10 +882,11 @@
 		return null;
 	}
 
-	private RefactoringStatus checkIfFieldDeclaredIn(final IField iField, final IType type) {
+	private RefactoringStatus checkIfFieldDeclaredIn(final IField iField, final IType type) throws JavaModelException {
 		final IField fieldInType= type.getField(iField.getElementName());
-		if (!fieldInType.exists())
+		if (!fieldInType.exists() || !iField.getTypeSignature().equals(fieldInType.getTypeSignature())) {
 			return null;
+		}
 		final String[] keys= { JavaElementLabels.getTextLabel(fieldInType, JavaElementLabels.ALL_FULLY_QUALIFIED), JavaElementLabels.getTextLabel(type, JavaElementLabels.ALL_FULLY_QUALIFIED)};
 		final String msg= Messages.format(RefactoringCoreMessages.PullUpRefactoring_Field_declared_in_class, keys);
 		final RefactoringStatusContext context= JavaStatusContext.create(fieldInType);
@@ -1660,8 +1661,9 @@
 			} else if (member instanceof IField) {
 				final IField field= (IField) member;
 				final IField found= initial.getField(field.getElementName());
-				if (found.exists())
+				if (found.exists() && field.getTypeSignature().equals(found.getTypeSignature())) {
 					addMatchingMember(result, field, found);
+				}
 			} else if (member instanceof IType) {
 				final IType type= (IType) member;
 				final IType found= initial.getType(type.getElementName());