From 86872fa9a63b654f059320cb12089c1546fa0bf9 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 25 Oct 2012 16:44:17 +0200 Subject: [PATCH] anonym -> method ref: disable for method calls with qualifiers which ref params (IDEA-93473) --- .../LambdaCanBeMethReferenceInspection.java | 37 ++++++++++++++----- .../afterQualifierDoesntUseParams.java | 12 ++++++ .../beforeQualifierDoesntUseParams.java | 16 ++++++++ .../beforeQualifierUsesParams.java | 16 ++++++++ 4 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterQualifierDoesntUseParams.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierDoesntUseParams.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierUsesParams.java diff --git a/java/java-impl/src/com/intellij/codeInspection/LambdaCanBeMethReferenceInspection.java b/java/java-impl/src/com/intellij/codeInspection/LambdaCanBeMethReferenceInspection.java index e8e092214103..4cacb741f178 100644 --- a/java/java-impl/src/com/intellij/codeInspection/LambdaCanBeMethReferenceInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/LambdaCanBeMethReferenceInspection.java @@ -18,11 +18,13 @@ package com.intellij.codeInspection; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; +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.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.util.ArrayUtilRt; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -146,22 +148,37 @@ public class LambdaCanBeMethReferenceInspection extends BaseJavaLocalInspectionT if (parameters[i + offset] != resolve) return null; } + final PsiExpression qualifierExpression; + if (methodCall instanceof PsiMethodCallExpression) { + qualifierExpression = ((PsiMethodCallExpression)methodCall).getMethodExpression().getQualifierExpression(); + } + else if (methodCall instanceof PsiNewExpression) { + qualifierExpression = ((PsiNewExpression)methodCall).getQualifier(); + } + else { + qualifierExpression = null; + } if (offset > 0) { - final PsiExpression qualifierExpression; - if (methodCall instanceof PsiMethodCallExpression) { - qualifierExpression = ((PsiMethodCallExpression)methodCall).getMethodExpression().getQualifierExpression(); - } - else if (methodCall instanceof PsiNewExpression) { - qualifierExpression = ((PsiNewExpression)methodCall).getQualifier(); - } - else { - qualifierExpression = null; - } if (!(qualifierExpression instanceof PsiReferenceExpression) || ((PsiReferenceExpression)qualifierExpression).resolve() != parameters[0]) { return null; } } + else if (qualifierExpression != null) { + final Ref usedInQualifier = new Ref(false); + qualifierExpression.accept(new JavaRecursiveElementWalkingVisitor() { + @Override + public void visitReferenceExpression(PsiReferenceExpression expression) { + final PsiElement resolve = expression.resolve(); + if (resolve instanceof PsiParameter && ArrayUtilRt.find(parameters, resolve) > -1) { + usedInQualifier.set(true); + return; + } + super.visitReferenceExpression(expression); + } + }); + if (usedInQualifier.get()) return null; + } return methodCall; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterQualifierDoesntUseParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterQualifierDoesntUseParams.java new file mode 100644 index 000000000000..02d8ad5ed0fd --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterQualifierDoesntUseParams.java @@ -0,0 +1,12 @@ +// "Replace with method reference" "true" +interface Foo { + B f(A a); +} + +interface DeeBee { + A run(Void c) throws SQLException; + + DeeBee bind(final Foo> f) default { + return f.f(null)::run; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierDoesntUseParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierDoesntUseParams.java new file mode 100644 index 000000000000..6aa032f10471 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierDoesntUseParams.java @@ -0,0 +1,16 @@ +// "Replace with method reference" "true" +interface Foo { + B f(A a); +} + +interface DeeBee { + A run(Void c) throws SQLException; + + DeeBee bind(final Foo> f) default { + return new DeeBee () { + public B run(final Void c) throws SQLException { + return f.f(null).run(c); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierUsesParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierUsesParams.java new file mode 100644 index 000000000000..0526753c4b73 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeQualifierUsesParams.java @@ -0,0 +1,16 @@ +// "Replace with method reference" "false" +interface Foo { + B f(A a); +} + +interface DeeBee { + A run(Void c) throws SQLException; + + DeeBee bind(final Foo> f) default { + return new DeeBee () { + public B run(final Void c) throws SQLException { + return f.f(DeeBee.this.run(c)).run(c); + } + }; + } +} \ No newline at end of file