From f14159a85270a0ab3ea58dd9b807524806cdad75 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 21 Mar 2016 12:38:29 +0100 Subject: [PATCH] disable replace with collect for raw collection substitutors (IDEA-153325) --- .../StreamApiMigrationInspection.java | 19 +++++++++--------- .../beforeRawCollectionSubstitution.java | 20 +++++++++++++++++++ 2 files changed, 30 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeRawCollectionSubstitution.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 4fec55781590..ddbc38ac6337 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java @@ -32,10 +32,7 @@ import com.intellij.psi.controlFlow.*; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; -import com.intellij.psi.util.InheritanceUtil; -import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.psi.util.PsiUtil; -import com.intellij.psi.util.RedundantCastUtil; +import com.intellij.psi.util.*; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.IntArrayList; import org.jetbrains.annotations.Nls; @@ -103,9 +100,9 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo final PsiStatement body = statement.getBody(); if (iteratedValue != null && body != null) { final PsiType iteratedValueType = iteratedValue.getType(); - if (InheritanceUtil.isInheritor(iteratedValueType, CommonClassNames.JAVA_UTIL_COLLECTION)) { - final PsiClass iteratorClass = PsiUtil.resolveClassInType(iteratedValueType); - LOG.assertTrue(iteratorClass != null); + final PsiClass iteratorClass = PsiUtil.resolveClassInType(iteratedValueType); + final PsiClass collectionClass = JavaPsiFacade.getInstance(body.getProject()).findClass(CommonClassNames.JAVA_UTIL_COLLECTION, statement.getResolveScope()); + if (collectionClass != null && InheritanceUtil.isInheritorOrSelf(iteratorClass, collectionClass, true)) { try { final ControlFlow controlFlow = ControlFlowFactory.getInstance(holder.getProject()) .getControlFlow(body, LocalsOrMyInstanceFieldsControlFlowPolicy.getInstance()); @@ -124,8 +121,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo } if (ExceptionUtil.getThrownCheckedExceptions(new PsiElement[] {body}).isEmpty()) { - if (!(iteratedValueType instanceof PsiClassType && ((PsiClassType)iteratedValueType).isRaw()) && - isCollectCall(body, statement.getIterationParameter())) { + if (!isRawSubstitution(iteratedValueType, collectionClass) && isCollectCall(body, statement.getIterationParameter())) { boolean addAll = isAddAllCall(statement, body); holder.registerProblem(iteratedValue, "Can be replaced with " + (addAll ? "addAll call" : "collect call"), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, @@ -151,6 +147,11 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo } } } + + private boolean isRawSubstitution(PsiType iteratedValueType, PsiClass collectionClass) { + return iteratedValueType instanceof PsiClassType && PsiUtil + .isRawSubstitutor(collectionClass, TypeConversionUtil.getSuperClassSubstitutor(collectionClass, (PsiClassType)iteratedValueType)); + } }; } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeRawCollectionSubstitution.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeRawCollectionSubstitution.java new file mode 100644 index 000000000000..fdb4d9617ef5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeRawCollectionSubstitution.java @@ -0,0 +1,20 @@ +// "Replace with collect" "false" + +import java.util.ArrayList; +import java.util.List; + +class Main2 { + public static void main(String[] args) { + MyList list = new MyList(); + List integerList = new ArrayList<>(); + for (Object element : list) { + if (element instanceof Integer) { + integerList.add((Integer) element); + } + } + } + + public static class MyList extends ArrayList { + + } +}