From 434aba1728cfa170d189f2aba16d6a457b85527d Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 17 Jan 2011 15:33:33 +0100 Subject: [PATCH] rename method: conflict on final override (IDEA-63845) --- .../rename/RenameJavaMethodProcessor.java | 22 +++++++++++++++++++ .../multi/rename2OverrideFinal/after/p/A.java | 16 ++++++++++++++ .../rename2OverrideFinal/before/p/A.java | 16 ++++++++++++++ .../refactoring/RenameMethodMultiTest.java | 14 ++++++++++++ 4 files changed, 68 insertions(+) create mode 100644 java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/after/p/A.java create mode 100644 java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/before/p/A.java diff --git a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java index 843f66603b31..e4a1ff9711c7 100644 --- a/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/rename/RenameJavaMethodProcessor.java @@ -33,6 +33,7 @@ import com.intellij.refactoring.RefactoringBundle; import com.intellij.refactoring.listeners.RefactoringElementListener; import com.intellij.refactoring.util.ConflictsUtil; import com.intellij.refactoring.util.MoveRenameUsageInfo; +import com.intellij.refactoring.util.RefactoringUIUtil; import com.intellij.refactoring.util.RefactoringUtil; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; @@ -147,6 +148,27 @@ public class RenameJavaMethodProcessor extends RenameJavaMemberProcessor { findSubmemberHidesMemberCollisions(methodToRename, newName, result); findMemberHidesOuterMemberCollisions((PsiMethod) element, newName, result); findCollisionsAgainstNewName(methodToRename, newName, result); + final PsiClass containingClass = methodToRename.getContainingClass(); + if (containingClass != null) { + final PsiMethod patternMethod = (PsiMethod)methodToRename.copy(); + try { + patternMethod.setName(newName); + final PsiMethod methodInBaseClass = containingClass.findMethodBySignature(patternMethod, true); + if (methodInBaseClass != null && methodInBaseClass.getContainingClass() != containingClass) { + if (methodInBaseClass.hasModifierProperty(PsiModifier.FINAL)) { + result.add(new UnresolvableCollisionUsageInfo(methodInBaseClass, methodToRename) { + @Override + public String getDescription() { + return "Renaming method will override final \"" + RefactoringUIUtil.getDescription(methodInBaseClass, true) + "\""; + } + }); + } + } + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } } public void findExistingNameConflicts(final PsiElement element, final String newName, final MultiMap conflicts) { diff --git a/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/after/p/A.java b/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/after/p/A.java new file mode 100644 index 000000000000..3676de4893f9 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/after/p/A.java @@ -0,0 +1,16 @@ +package p; +public class A { + + public final void finalMethod() { + } +} + +class B extends A implements I { + + public void method() { + } +} + +interface I { + void method(); +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/before/p/A.java b/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/before/p/A.java new file mode 100644 index 000000000000..3676de4893f9 --- /dev/null +++ b/java/java-tests/testData/refactoring/renameMethod/multi/rename2OverrideFinal/before/p/A.java @@ -0,0 +1,16 @@ +package p; +public class A { + + public final void finalMethod() { + } +} + +class B extends A implements I { + + public void method() { + } +} + +interface I { + void method(); +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameMethodMultiTest.java b/java/java-tests/testSrc/com/intellij/refactoring/RenameMethodMultiTest.java index 11c4082d536d..20ee15e902e9 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/RenameMethodMultiTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameMethodMultiTest.java @@ -8,6 +8,7 @@ import com.intellij.psi.PsiMethod; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.refactoring.rename.RenameProcessor; import com.intellij.JavaTestUtil; +import org.junit.Assert; /** * @author dsl @@ -39,6 +40,19 @@ public class RenameMethodMultiTest extends MultiFileTestCase { doTest("pack1.A", "void staticMethod(int i)", "renamedStaticMethod"); } + public void testRename2OverrideFinal() throws Exception { + try { + doTest("p.B", "void method()", "finalMethod"); + } + catch (BaseRefactoringProcessor.ConflictsInTestsException e) { + Assert.assertEquals("Renaming method will override final \"method A.finalMethod()\"\n" + + "Method finalMethod() will override\n" + + "a method of the base class p.A.", e.getMessage()); + return; + } + fail("Conflicts were not found"); + } + public void testAlignedMultilineParameters() throws Exception { getCurrentCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS = true; getCurrentCodeStyleSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true;