From ffbe05e14d060fc5b4aded37275d6637ab27a57e Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 13 Jan 2015 20:08:21 +0100 Subject: [PATCH] stream migration: reject collection conversion if qualifier depends on loop parameter (IDEA-135104) --- .../codeInspection/StreamApiMigrationInspection.java | 11 ++++++++--- .../beforeCollectQualifierDependsOnLoopParameter.java | 10 ++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectQualifierDependsOnLoopParameter.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java index fe6605c27baa..668917c2533f 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java @@ -22,6 +22,7 @@ import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; @@ -105,7 +106,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo } if (ExceptionUtil.getThrownCheckedExceptions(new PsiElement[] {body}).isEmpty()) { - if (isCollectCall(body)) { + if (isCollectCall(body, statement.getIterationParameter())) { holder.registerProblem(iteratedValue, "Can be replaced with collect call", ProblemHighlightType.GENERIC_ERROR_OR_WARNING, new ReplaceWithCollectCallFix()); } else if (!isTrivial(body, statement.getIterationParameter())) { @@ -124,7 +125,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo }; } - private static boolean isCollectCall(PsiStatement body) { + private static boolean isCollectCall(PsiStatement body, final PsiParameter parameter) { PsiIfStatement ifStatement = extractIfStatement(body); final PsiMethodCallExpression methodCallExpression = extractAddCall(body, ifStatement); if (methodCallExpression != null) { @@ -132,8 +133,12 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); PsiClass qualifierClass = null; if (qualifierExpression instanceof PsiReferenceExpression) { + if (ReferencesSearch.search(parameter, new LocalSearchScope(qualifierExpression)).findFirst() != null) { + return false; + } qualifierClass = PsiUtil.resolveClassInType(qualifierExpression.getType()); - } else if (qualifierExpression == null) { + } + else if (qualifierExpression == null) { final PsiClass enclosingClass = PsiTreeUtil.getParentOfType(body, PsiClass.class); if (PsiUtil.getEnclosingStaticElement(body, enclosingClass) == null) { qualifierClass = enclosingClass; diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectQualifierDependsOnLoopParameter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectQualifierDependsOnLoopParameter.java new file mode 100644 index 000000000000..6b48b7d1ed61 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectQualifierDependsOnLoopParameter.java @@ -0,0 +1,10 @@ +// "Replace with collect" "false" +import java.util.List; + +class A { + void foo(List> list) { + for(List l: list) { + l.add(""); + } + } +} \ No newline at end of file