From f4839c89ea37ea0f674d2a2f63522fea1178ba5b Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 13 Jun 2018 11:10:57 +0700 Subject: [PATCH] BaseStreamApiMigration: when deleting the initializer replace type with explicit if possible Fixes IDEA-193618 Invalid code generated after "Can be replaced with 'collect' call" --- .../streamMigration/BaseStreamApiMigration.java | 11 ++++++++++- .../streamApiMigration/java10/afterVarJava10.java | 12 ++++++++++++ .../java10/beforeVarJava10.java | 15 +++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterVarJava10.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeVarJava10.java diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/BaseStreamApiMigration.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/BaseStreamApiMigration.java index ad0a397f8fbe..b94b0018623d 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/BaseStreamApiMigration.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/BaseStreamApiMigration.java @@ -17,6 +17,7 @@ package com.intellij.codeInspection.streamMigration; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.PsiTypesUtil; import com.siyeh.ig.psiutils.CommentTracker; import com.siyeh.ig.psiutils.ControlFlowUtils; import com.siyeh.ig.psiutils.ControlFlowUtils.InitializerUsageStatus; @@ -77,7 +78,15 @@ abstract class BaseStreamApiMigration { } else { if (status == ControlFlowUtils.InitializerUsageStatus.AT_WANTED_PLACE_ONLY) { - ct.delete(initializer); + PsiTypeElement typeElement = var.getTypeElement(); + if (typeElement != null && typeElement.isInferredType()) { + if (PsiTypesUtil.isDenotableType(typeElement.getType(), var)) { + PsiTypesUtil.replaceWithExplicitType(typeElement); + ct.delete(initializer); + } + } else { + ct.delete(initializer); + } } return ct.replaceAndRestoreComments(loopStatement, var.getName() + " = " + replacement + ";"); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterVarJava10.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterVarJava10.java new file mode 100644 index 000000000000..ee09bfbaf4d9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/afterVarJava10.java @@ -0,0 +1,12 @@ +// "Fix all 'Loop can be collapsed with Stream API' problems in file" "true" +import java.util.*; +import java.util.stream.Collectors; + +class Test { + public List someMethod() { + ArrayList listOfInteger; + Integer[] arrayOfInteger = {2, 4, 8}; + listOfInteger = Arrays.stream(arrayOfInteger).filter(number -> number >= 4).collect(Collectors.toCollection(ArrayList::new)); + return listOfInteger; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeVarJava10.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeVarJava10.java new file mode 100644 index 000000000000..d35f56e92469 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/java10/beforeVarJava10.java @@ -0,0 +1,15 @@ +// "Fix all 'Loop can be collapsed with Stream API' problems in file" "true" +import java.util.*; + +class Test { + public List someMethod() { + var listOfInteger = new ArrayList(); + Integer[] arrayOfInteger = {2, 4, 8}; + for (var number: arrayOfInteger) { + if (number >= 4) { + listOfInteger.add(number); + } + } + return listOfInteger; + } +} \ No newline at end of file