mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
rename method: conflict on final override (IDEA-63845)
This commit is contained in:
@@ -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) {
|
||||
|
||||
+16
@@ -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();
|
||||
}
|
||||
+16
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user