push down: inline super call when push is called after conflict detection (IDEA-99041)

This commit is contained in:
Anna.Kozlova
2018-08-09 14:38:34 +02:00
parent a43ea09061
commit b33d9927ca
5 changed files with 53 additions and 1 deletions
@@ -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();}