lambda -> meth ref: fix this qualifier in case of inheritance

(cherry picked from commit 5273314961f0fbf32c18ea3d602410c635caf03f)
This commit is contained in:
Anna Kozlova
2014-10-09 16:25:22 +02:00
parent 37776a90c9
commit 99f55229dc
3 changed files with 40 additions and 1 deletions

View File

@@ -22,6 +22,7 @@ import com.intellij.openapi.util.Ref;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.psi.util.TypeConversionUtil;
@@ -287,8 +288,12 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp
if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) {
methodRefText = getClassReferenceName(containingClass);
} else {
PsiClass treeContainingClass = PsiTreeUtil.getParentOfType(element, PsiClass.class);
while (!InheritanceUtil.isInheritorOrSelf(treeContainingClass, containingClass, true)) {
treeContainingClass = PsiTreeUtil.getParentOfType(treeContainingClass, PsiClass.class, true);
}
if (containingClass != PsiTreeUtil.getParentOfType(element, PsiClass.class) ) {
methodRefText = containingClass.getName() + ".this";
methodRefText = treeContainingClass.getName() + ".this";
} else {
methodRefText = "this";
}

View File

@@ -0,0 +1,17 @@
// "Replace lambda with method reference" "true"
class Example extends O {
void m(Runnable r) {}
class A {
class B {
{
m(Example.this::p);
}
}
}
}
class O {
void p() {}
}

View File

@@ -0,0 +1,17 @@
// "Replace lambda with method reference" "true"
class Example extends O {
void m(Runnable r) {}
class A {
class B {
{
m(() -> p<caret>());
}
}
}
}
class O {
void p() {}
}