mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
push down: inline super call when push is called after conflict detection (IDEA-99041)
This commit is contained in:
@@ -30,18 +30,21 @@ import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
|
||||
import com.intellij.psi.javadoc.PsiDocComment;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.searches.ClassInheritorsSearch;
|
||||
import com.intellij.psi.search.searches.FunctionalExpressionSearch;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.*;
|
||||
import com.intellij.refactoring.RefactoringBundle;
|
||||
import com.intellij.refactoring.classMembers.MemberInfoBase;
|
||||
import com.intellij.refactoring.inline.InlineMethodProcessor;
|
||||
import com.intellij.refactoring.listeners.JavaRefactoringListenerManager;
|
||||
import com.intellij.refactoring.listeners.impl.JavaRefactoringListenerManagerImpl;
|
||||
import com.intellij.refactoring.util.DocCommentPolicy;
|
||||
import com.intellij.refactoring.util.RefactoringUtil;
|
||||
import com.intellij.refactoring.util.classMembers.MemberInfo;
|
||||
import com.intellij.util.IncorrectOperationException;
|
||||
import com.intellij.util.containers.ContainerUtil;
|
||||
import com.intellij.util.containers.MultiMap;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -300,6 +303,7 @@ public class JavaPushDownDelegate extends PushDownDelegate<MemberInfo, PsiMember
|
||||
}
|
||||
}
|
||||
}
|
||||
inlineSuperCall(memberInfo, methodBySignature);
|
||||
}
|
||||
}
|
||||
else if (member instanceof PsiClass) {
|
||||
@@ -346,6 +350,22 @@ public class JavaPushDownDelegate extends PushDownDelegate<MemberInfo, PsiMember
|
||||
}
|
||||
}
|
||||
|
||||
public void inlineSuperCall(MemberInfoBase<? extends PsiElement> memberInfo, PsiMethod methodBySignature) {
|
||||
PsiMethod superMethod = (PsiMethod)memberInfo.getMember();
|
||||
Collection<PsiReference> superReferences =
|
||||
ReferencesSearch.search(superMethod, new LocalSearchScope(methodBySignature)).findAll();
|
||||
if (superReferences.size() == 1) {
|
||||
PsiReference reference = ContainerUtil.getFirstItem(superReferences);
|
||||
if (reference == null) return;
|
||||
PsiElement element = reference.getElement();
|
||||
if (element instanceof PsiReferenceExpression) {
|
||||
PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element;
|
||||
new InlineMethodProcessor(element.getProject(), superMethod, referenceExpression, null, true)
|
||||
.inlineMethodCall(referenceExpression);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeFromSourceClass(PushDownData<MemberInfo, PsiMember> pushDownData) {
|
||||
for (MemberInfoBase<? extends PsiElement> memberInfo : pushDownData.getMembersToMove()) {
|
||||
|
||||
@@ -18,6 +18,7 @@ package com.intellij.refactoring.memberPushDown;
|
||||
import com.intellij.codeInsight.AnnotationUtil;
|
||||
import com.intellij.openapi.util.text.StringUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.LocalSearchScope;
|
||||
import com.intellij.psi.search.searches.ReferencesSearch;
|
||||
import com.intellij.psi.util.InheritanceUtil;
|
||||
import com.intellij.psi.util.MethodSignatureUtil;
|
||||
@@ -150,6 +151,7 @@ public class PushDownConflicts {
|
||||
if (myConflicts.containsKey(element)) continue;
|
||||
final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)element;
|
||||
final PsiExpression qualifier = referenceExpression.getQualifierExpression();
|
||||
if (qualifier instanceof PsiSuperExpression) continue;
|
||||
if (qualifier != null) {
|
||||
final PsiType qualifierType = qualifier.getType();
|
||||
PsiClass aClass = null;
|
||||
@@ -192,7 +194,7 @@ public class PushDownConflicts {
|
||||
if (!modifierList.hasModifierProperty(PsiModifier.ABSTRACT)) {
|
||||
PsiMethod method = (PsiMethod)movedMember;
|
||||
final PsiMethod overrider = MethodSignatureUtil.findMethodBySuperMethod(targetClass, method, false);
|
||||
if (overrider != null) {
|
||||
if (overrider != null && ReferencesSearch.search(method, new LocalSearchScope(overrider)).findAll().size() != 1) {
|
||||
String message = RefactoringBundle.message("0.is.already.overridden.in.1",
|
||||
RefactoringUIUtil.getDescription(method, true), RefactoringUIUtil.getDescription(targetClass, false));
|
||||
myConflicts.putValue(overrider, CommonRefactoringUtil.capitalize(message));
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
class Test {
|
||||
void fo<caret>o(final boolean d) {
|
||||
if (d) {
|
||||
foo(false);
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
class Test2 extends Test {
|
||||
@Override
|
||||
void foo(final boolean d) {
|
||||
super.foo(d);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
class Test {
|
||||
}
|
||||
|
||||
class Test2 extends Test {
|
||||
void foo(final boolean d) {
|
||||
if (d) {
|
||||
foo(false);
|
||||
}
|
||||
System.out.println();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -18,6 +18,7 @@ package com.intellij.java.refactoring;
|
||||
import com.intellij.codeInsight.TargetElementUtil;
|
||||
import com.intellij.psi.*;
|
||||
import com.intellij.psi.search.GlobalSearchScope;
|
||||
import com.intellij.refactoring.BaseRefactoringProcessor;
|
||||
import com.intellij.refactoring.memberPushDown.PushDownProcessor;
|
||||
import com.intellij.refactoring.util.DocCommentPolicy;
|
||||
import com.intellij.refactoring.util.classMembers.MemberInfo;
|
||||
@@ -66,6 +67,7 @@ public class PushDownTest extends LightRefactoringTestCase {
|
||||
public void testFunctionalExpression() { doTest(true);}
|
||||
public void testFunctionalInterface() { doTest(true);}
|
||||
public void testFunctionalExpressionDefaultMethod() { doTest();}
|
||||
public void testInlineSuperMethodCall() { BaseRefactoringProcessor.ConflictsInTestsException.withIgnoredConflicts(() -> doTest(true));}
|
||||
public void testRenameTypeParametersToAvoidHiding() { doTest();}
|
||||
public void testNoRenameTypeParametersToAvoidHidingForStatic() { doTest();}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user