From 7214316544798fa4d09e5e66592d37cb1f787f6d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 6 Sep 2016 12:08:23 +0700 Subject: [PATCH] IDEA-160778 Buggy replacement with collect when several variables are declared in the same statement --- .../StreamApiMigrationInspection.java | 30 +++++++++++-------- ...erCollectArrayListCompoundDeclaration.java | 16 ++++++++++ ...reCollectArrayListCompoundDeclaration.java | 17 +++++++++++ 3 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectArrayListCompoundDeclaration.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectArrayListCompoundDeclaration.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 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()); + } + } +}