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 ee6fb388162b..f6c71d3c5d8a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/StreamApiMigrationInspection.java @@ -495,18 +495,24 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo final PsiExpression qualifierExpression = methodCallExpression.getMethodExpression().getQualifierExpression(); if (qualifierExpression instanceof PsiReferenceExpression) { final PsiElement resolve = ((PsiReferenceExpression)qualifierExpression).resolve(); - if (resolve instanceof PsiVariable) { - if (resolve instanceof PsiLocalVariable && foreachStatement.equals(PsiTreeUtil.skipSiblingsForward(resolve.getParent(), PsiWhiteSpace.class, PsiComment.class))) { - final PsiExpression initializer = ((PsiVariable)resolve).getInitializer(); - if (initializer instanceof PsiNewExpression) { - final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList(); - if (argumentList != null && argumentList.getExpressions().length == 0) { - restoreComments(foreachStatement, body); - final String callText = builder.toString() + createInitializerReplacementText(((PsiVariable)resolve).getType(), initializer) + ")"; - result = initializer.replace(elementFactory.createExpressionFromText(callText, null)); - simplifyRedundantCast(result); - foreachStatement.delete(); - return; + if (resolve instanceof PsiLocalVariable) { + PsiLocalVariable var = (PsiLocalVariable)resolve; + PsiElement declaration = var.getParent(); + if (declaration instanceof PsiDeclarationStatement) { + PsiElement[] elements = ((PsiDeclarationStatement)declaration).getDeclaredElements(); + if (elements[elements.length - 1] == resolve && + foreachStatement.equals(PsiTreeUtil.skipSiblingsForward(declaration, PsiWhiteSpace.class, PsiComment.class))) { + final PsiExpression initializer = var.getInitializer(); + if (initializer instanceof PsiNewExpression) { + final PsiExpressionList argumentList = ((PsiNewExpression)initializer).getArgumentList(); + if (argumentList != null && argumentList.getExpressions().length == 0) { + restoreComments(foreachStatement, body); + final String callText = builder.toString() + createInitializerReplacementText(var.getType(), initializer) + ")"; + result = initializer.replace(elementFactory.createExpressionFromText(callText, null)); + simplifyRedundantCast(result); + foreachStatement.delete(); + return; + } } } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectArrayListCompoundDeclaration.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectArrayListCompoundDeclaration.java new file mode 100644 index 000000000000..1f86b4e27ac3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectArrayListCompoundDeclaration.java @@ -0,0 +1,16 @@ +// "Replace with collect" "true" +import java.util.*; +import java.util.stream.Collectors; + +public class Collect { + class Person { + String getName() { + return ""; + } + } + + void collectNames(List persons){ + List names = new ArrayList<>(), otherNames = new ArrayList<>(names); + names.addAll(persons.stream().map(Person::getName).collect(Collectors.toList())); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectArrayListCompoundDeclaration.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectArrayListCompoundDeclaration.java new file mode 100644 index 000000000000..3f03eab7760f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectArrayListCompoundDeclaration.java @@ -0,0 +1,17 @@ +// "Replace with collect" "true" +import java.util.*; + +public class Collect { + class Person { + String getName() { + return ""; + } + } + + void collectNames(List persons){ + List names = new ArrayList<>(), otherNames = new ArrayList<>(names); + for (Person person : persons) { + names.add(person.getName()); + } + } +}