trivial method ref: check if qualifier is of assignable type (IDEA-154422)

This commit is contained in:
Anna.Kozlova
2016-04-08 18:44:25 +02:00
parent 216d319f84
commit 9cdb5a70af
2 changed files with 27 additions and 6 deletions
@@ -19,6 +19,7 @@ import com.intellij.codeInsight.FileModificationService;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.MethodSignatureUtil;
import com.intellij.psi.util.TypeConversionUtil;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -32,12 +33,18 @@ public class TrivialMethodReferenceInspection extends BaseJavaBatchLocalInspecti
final PsiExpression qualifierExpression = expression.getQualifierExpression();
final PsiElement referenceNameElement = expression.getReferenceNameElement();
if (qualifierExpression != null && referenceNameElement != null) {
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(expression);
if (interfaceMethod != null) {
final PsiElement resolve = expression.resolve();
if (resolve instanceof PsiMethod &&
(interfaceMethod == resolve || MethodSignatureUtil.isSuperMethod(interfaceMethod, (PsiMethod)resolve))) {
holder.registerProblem(referenceNameElement, "Method reference can be replaced with qualifier", new ReplaceMethodRefWithQualifierFix());
final PsiType qualifierType = qualifierExpression.getType();
if (qualifierType != null) {
final PsiType functionalInterfaceType = expression.getFunctionalInterfaceType();
final PsiMethod interfaceMethod = LambdaUtil.getFunctionalInterfaceMethod(functionalInterfaceType);
if (interfaceMethod != null) {
final PsiElement resolve = expression.resolve();
if (resolve instanceof PsiMethod &&
(interfaceMethod == resolve || MethodSignatureUtil.isSuperMethod(interfaceMethod, (PsiMethod)resolve)) &&
TypeConversionUtil.isAssignable(functionalInterfaceType, qualifierType)) {
holder.registerProblem(referenceNameElement, "Method reference can be replaced with qualifier",
new ReplaceMethodRefWithQualifierFix());
}
}
}
}
@@ -0,0 +1,14 @@
// "Replace with qualifier" "false"
class Test {
nterface A {
void m();
}
interface B extends A {}
void foo(B b) {}
void bar(A a){
foo(a::<caret>m);
}
}