diff --git a/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java index b3b218b41634..f58631d84bbe 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/LambdaRefactoringUtil.java @@ -26,6 +26,7 @@ import com.intellij.psi.codeStyle.JavaCodeStyleManager; import com.intellij.psi.codeStyle.SuggestedNameInfo; import com.intellij.psi.codeStyle.VariableKind; import com.intellij.psi.util.MethodSignature; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.RedundantCastUtil; import com.intellij.refactoring.introduceField.ElementToWorkOn; @@ -121,14 +122,9 @@ public class LambdaRefactoringUtil { if (!PsiType.VOID.equals(interfaceMethod.getReturnType())) { buf.append("return "); } + final PsiMethodReferenceUtil.QualifierResolveResult qualifierResolveResult = PsiMethodReferenceUtil.getQualifierResolveResult(referenceExpression); final PsiElement qualifier = referenceExpression.getQualifier(); - PsiClass containingClass = null; - if (resolveElement instanceof PsiMethod) { - containingClass = ((PsiMember)resolveElement).getContainingClass(); - LOG.assertTrue(containingClass != null); - } else if (resolveElement instanceof PsiClass) { - containingClass = (PsiClass)resolveElement; - } + PsiClass containingClass = qualifierResolveResult.getContainingClass(); final boolean onArrayRef = elementFactory.getArrayClass(PsiUtil.getLanguageLevel(referenceExpression)) == containingClass; @@ -141,9 +137,13 @@ public class LambdaRefactoringUtil { if (qualifier instanceof PsiTypeElement) { final PsiJavaCodeReferenceElement referenceElement = ((PsiTypeElement)qualifier).getInnermostComponentReferenceElement(); LOG.assertTrue(referenceElement != null); - buf.append(referenceElement.getReferenceName()).append("."); + if (!PsiTreeUtil.isAncestor(containingClass, referenceExpression, false)) { + buf.append(referenceElement.getReferenceName()).append("."); + } } - else if (qualifier != null && !(qualifier instanceof PsiThisExpression && ((PsiThisExpression)qualifier).getQualifier() == null)) { + else if (qualifier != null && + !(qualifier instanceof PsiReferenceExpression && ((PsiReferenceExpression)qualifier).getQualifier() == null && PsiTreeUtil.isAncestor(containingClass, referenceExpression, false) || + qualifier instanceof PsiQualifiedExpression && ((PsiQualifiedExpression)qualifier).getQualifier() == null)) { buf.append(qualifier.getText()).append("."); } } diff --git a/java/java-tests/testData/refactoring/changeSignature/ExpandMethodReferenceToDeleteParameter_after.java b/java/java-tests/testData/refactoring/changeSignature/ExpandMethodReferenceToDeleteParameter_after.java index 020ae8f8af17..d8dbadc02635 100644 --- a/java/java-tests/testData/refactoring/changeSignature/ExpandMethodReferenceToDeleteParameter_after.java +++ b/java/java-tests/testData/refactoring/changeSignature/ExpandMethodReferenceToDeleteParameter_after.java @@ -7,7 +7,7 @@ interface P { class A { public static void print() { - List someNumbers = A.returnAllNumbers((a) -> A.alwaysTrue()); + List someNumbers = A.returnAllNumbers((a) -> alwaysTrue()); } private static List returnAllNumbers(P predicate) { diff --git a/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java index bbb2740317b2..ef0d64e5292a 100644 --- a/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java +++ b/java/java-tests/testData/refactoring/introduceParameter/afterExpandMethodReference.java @@ -4,7 +4,7 @@ interface I { class A { { - I predicate = (a) -> A.alwaysTrue(a, ""); + I predicate = (a) -> alwaysTrue(a, ""); } private static boolean alwaysTrue(int a, String anObject) { diff --git a/java/java-tests/testData/refactoring/invertBoolean/methodRefs.conflicts.txt b/java/java-tests/testData/refactoring/invertBoolean/methodRefs.conflicts.txt index 815060f6552f..a03547c4d4f3 100644 --- a/java/java-tests/testData/refactoring/invertBoolean/methodRefs.conflicts.txt +++ b/java/java-tests/testData/refactoring/invertBoolean/methodRefs.conflicts.txt @@ -1 +1 @@ -Method is used in method reference expression. Proceeding would result in conversion to lambda expression \ No newline at end of file +Method is used in method reference. Proceeding would result in conversion to lambda expression \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/safeDelete/ParameterInMethodUsedInMethodReference_after.java b/java/java-tests/testData/refactoring/safeDelete/ParameterInMethodUsedInMethodReference_after.java index e47a09c87201..be29ca873f04 100644 --- a/java/java-tests/testData/refactoring/safeDelete/ParameterInMethodUsedInMethodReference_after.java +++ b/java/java-tests/testData/refactoring/safeDelete/ParameterInMethodUsedInMethodReference_after.java @@ -4,7 +4,7 @@ interface I { class A { { - I predicate = (a) -> A.alwaysTrue(); + I predicate = (a) -> alwaysTrue(); } private static boolean alwaysTrue() { diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java index 2d27aef15301..1148785ca874 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/Ambiguity_after.java @@ -14,6 +14,6 @@ public class MyTest { static void call(int i, I2 s) {} public static void main(String[] args) { - call(1, (i) -> MyTest.m(i)); + call(1, (i) -> m(i)); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/StaticMethodRef_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/StaticMethodRef_after.java index e88888254742..419afbc398dc 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/StaticMethodRef_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/types/methodRefs2lambda/StaticMethodRef_after.java @@ -7,6 +7,6 @@ public class MyTest { } static { - I sam = (i) -> MyTest.print(i); + I sam = (i) -> print(i); } } \ No newline at end of file