diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveJavaMemberHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveJavaMemberHandler.java index 8f0f3d1fb257..ea39904f5a1d 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveJavaMemberHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveJavaMemberHandler.java @@ -112,6 +112,12 @@ public class MoveJavaMemberHandler implements MoveMemberHandler { conflicts.putValue(element, CommonRefactoringUtil.capitalize(message)); } } + } else if (member instanceof PsiField && + usageInfo.reference instanceof PsiExpression && + member.hasModifierProperty(PsiModifier.FINAL) && + PsiUtil.isAccessedForWriting((PsiExpression)usageInfo.reference) && + !RefactoringHierarchyUtil.willBeInTargetClass(usageInfo.reference, membersToMove, targetClass, true)) { + conflicts.putValue(usageInfo.member, "final variable initializer won't be available after move."); } final PsiReference reference = usageInfo.getReference(); diff --git a/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/A.java b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/A.java new file mode 100644 index 000000000000..a5d52700d3e9 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/A.java @@ -0,0 +1,4 @@ +public class A { + + public static final String ONE; +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/B.java b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/B.java new file mode 100644 index 000000000000..add876cb4ee2 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/after/B.java @@ -0,0 +1,6 @@ +public class B { + + static { + A.ONE = "foo"; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/A.java b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/A.java new file mode 100644 index 000000000000..96a276f862e9 --- /dev/null +++ b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/A.java @@ -0,0 +1,3 @@ +public class A { + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/B.java b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/B.java new file mode 100644 index 000000000000..a1009adeeb4d --- /dev/null +++ b/java/java-tests/testData/refactoring/moveMembers/finalFieldWithInitializer/before/B.java @@ -0,0 +1,7 @@ +public class B { + public static final String ONE; + + static { + ONE = "foo"; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java index 2ceceea6c264..596944b839d3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java @@ -124,6 +124,16 @@ public class MoveMembersTest extends MultiFileTestCase { assertEquals("Field B.ONE has write access but is moved to an interface", e.getMessage()); } } + + public void testFinalFieldWithInitializer() throws Exception { + try { + doTest("B", "A", 0); + fail("conflict expected"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + assertEquals("final variable initializer won't be available after move.", e.getMessage()); + } + } public void testInnerToInterface() throws Exception { doTest("A", "B", 0);