rename method: conflict on final override (IDEA-63845)

This commit is contained in:
anna
2011-01-17 17:42:09 +01:00
parent d62584c9ea
commit 434aba1728
4 changed files with 68 additions and 0 deletions
@@ -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<PsiElement, String> conflicts) {
@@ -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();
}
@@ -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();
}
@@ -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 <b><code>A.finalMethod()</code></b>\"\n" +
"Method finalMethod() will override\n" +
"a method of the base class <b><code>p.A</code></b>.", 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;