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());