From 9cdb5a70af6097c6b3af9ee0f931820e48b3ac60 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Fri, 8 Apr 2016 18:23:26 +0200 Subject: [PATCH] trivial method ref: check if qualifier is of assignable type (IDEA-154422) --- .../TrivialMethodReferenceInspection.java | 19 +++++++++++++------ .../beforeOnUnassignable.java | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/trivialMethodReference/beforeOnUnassignable.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/TrivialMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/TrivialMethodReferenceInspection.java index b66674135de7..5978a899105b 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/TrivialMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/TrivialMethodReferenceInspection.java @@ -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()); + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/trivialMethodReference/beforeOnUnassignable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/trivialMethodReference/beforeOnUnassignable.java new file mode 100644 index 000000000000..b69cd789483e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/trivialMethodReference/beforeOnUnassignable.java @@ -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::m); + } +} \ No newline at end of file