From df36bfcf5f098c83dda597d1206f0118069e7f4a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 30 Sep 2016 16:52:35 +0700 Subject: [PATCH] IDEA-CR-14049 missing getType() added; support array initializers in Optional map --- .../ReplaceWithFindFirstFix.java | 12 +++++++----- .../StreamApiMigrationInspection.java | 2 +- .../afterFindFirstArray.java | 12 ++++++++++++ .../afterFindFirstAssignmentPrimitive.java | 11 +++++++++++ .../beforeFindFirstArray.java | 17 +++++++++++++++++ .../beforeFindFirstAssignmentPrimitive.java | 18 ++++++++++++++++++ .../beforeFindFirstAssignmentPrimitiveMap.java | 18 ++++++++++++++++++ 7 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstArray.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstAssignmentPrimitive.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstArray.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitive.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitiveMap.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java index 6eb0e9c86301..93f2fd48d1cc 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithFindFirstFix.java @@ -55,7 +55,7 @@ class ReplaceWithFindFirstFix extends MigrateToStreamFix { if (nextReturnStatement == null) return; PsiExpression orElseExpression = nextReturnStatement.getReturnValue(); if (!ExpressionUtils.isSimpleExpression(orElseExpression)) return; - stream = generateOptionalUnwrap(stream, tb, value, orElseExpression); + stream = generateOptionalUnwrap(stream, tb, value, orElseExpression, null); restoreComments(foreachStatement, body); boolean siblings = nextReturnStatement.getParent() == foreachStatement.getParent(); PsiElement result = foreachStatement.replace(elementFactory.createStatementFromText("return " + stream + ";", foreachStatement)); @@ -81,19 +81,19 @@ class ReplaceWithFindFirstFix extends MigrateToStreamFix { if (status != InitializerUsageStatus.UNKNOWN) { PsiExpression initializer = var.getInitializer(); if (initializer != null) { - String replacementText = generateOptionalUnwrap(stream, tb, value, initializer); + String replacementText = generateOptionalUnwrap(stream, tb, value, initializer, var.getType()); replaceInitializer(foreachStatement, var, initializer, replacementText, status); return; } } PsiElement result = foreachStatement.replace(elementFactory.createStatementFromText( - var.getName() + " = " + generateOptionalUnwrap(stream, tb, value, lValue) + ";", foreachStatement)); + var.getName() + " = " + generateOptionalUnwrap(stream, tb, value, lValue, var.getType()) + ";", foreachStatement)); simplifyAndFormat(project, result); } } private static String generateOptionalUnwrap(String stream, @NotNull StreamApiMigrationInspection.TerminalBlock tb, - PsiExpression trueExpression, PsiExpression falseExpression) { + PsiExpression trueExpression, PsiExpression falseExpression, PsiType targetType) { PsiVariable var = tb.getVariable(); if (!StreamApiMigrationInspection.isIdentityMapping(var, trueExpression)) { if(trueExpression instanceof PsiTypeCastExpression && ExpressionUtils.isNullLiteral(falseExpression)) { @@ -112,9 +112,11 @@ class ReplaceWithFindFirstFix extends MigrateToStreamFix { if(EquivalenceChecker.getCanonicalPsiEquivalence().expressionsAreEquivalent(falseExpression, condition.getElseExpression())) { return generateOptionalUnwrap( stream + ".filter(" + LambdaUtil.createLambda(var, condition.getCondition()) + ")", tb, - condition.getThenExpression(), falseExpression); + condition.getThenExpression(), falseExpression, var.getType()); } } + trueExpression = + targetType == null ? trueExpression : ExpressionUtils.convertInitializerToNormalExpression(trueExpression, targetType); stream += ".map(" + LambdaUtil.createLambda(var, trueExpression) + ")"; } stream += ".orElse(" + falseExpression.getText() + ")"; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java index d95117834659..410ac8377e07 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/streamMigration/StreamApiMigrationInspection.java @@ -586,7 +586,7 @@ public class StreamApiMigrationInspection extends BaseJavaBatchLocalInspectionTo if(!(var instanceof PsiVariable) || !nonFinalVariables.contains(var)) return; PsiExpression rValue = assignment.getRExpression(); if(rValue == null || isVariableReferenced((PsiVariable)var, rValue)) return; - if(tb.getVariable() instanceof PsiPrimitiveType && !isIdentityMapping(tb.getVariable(), rValue)) return; + if(tb.getVariable().getType() instanceof PsiPrimitiveType && !isIdentityMapping(tb.getVariable(), rValue)) return; registerProblem(statement, "findFirst", new ReplaceWithFindFirstFix()); } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstArray.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstArray.java new file mode 100644 index 000000000000..7697d705d9f6 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstArray.java @@ -0,0 +1,12 @@ +// "Replace with findFirst()" "true" + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class Main { + public int[] testMap(Map> map) throws Exception { + int[] arr = map.values().stream().filter(Objects::nonNull).findFirst().map(list -> new int[]{list.size()}).orElse(null); + return arr; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstAssignmentPrimitive.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstAssignmentPrimitive.java new file mode 100644 index 000000000000..32ac2fafe3c3 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterFindFirstAssignmentPrimitive.java @@ -0,0 +1,11 @@ +// "Replace with findFirst()" "true" + +import java.util.List; +import java.util.Map; + +public class Main { + public void testMap(Map> map) throws Exception { + int bigSize = map.values().stream().mapToInt(List::size).filter(size -> size > 10).findFirst().orElse(0); + System.out.println(bigSize); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstArray.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstArray.java new file mode 100644 index 000000000000..926869fd2f16 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstArray.java @@ -0,0 +1,17 @@ +// "Replace with findFirst()" "true" + +import java.util.List; +import java.util.Map; + +public class Main { + public int[] testMap(Map> map) throws Exception { + int[] arr = null; + for(List list : map.values()) { + if(list != null) { + arr = {list.size()}; + break; + } + } + return arr; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitive.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitive.java new file mode 100644 index 000000000000..4b21c7df02a9 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitive.java @@ -0,0 +1,18 @@ +// "Replace with findFirst()" "true" + +import java.util.List; +import java.util.Map; + +public class Main { + public void testMap(Map> map) throws Exception { + int bigSize = 0; + for(List list : map.values()) { + int size = list.size(); + if(size > 10) { + bigSize = size; + break; + } + } + System.out.println(bigSize); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitiveMap.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitiveMap.java new file mode 100644 index 000000000000..118ba7307dbf --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeFindFirstAssignmentPrimitiveMap.java @@ -0,0 +1,18 @@ +// "Replace with findFirst()" "false" + +import java.util.List; +import java.util.Map; + +public class Main { + public void testMap(Map> map) throws Exception { + int bigSize = 0; + for(List list : map.values()) { + int size = list.size(); + if(size > 10) { + bigSize = size*2; + break; + } + } + System.out.println(bigSize); + } +} \ No newline at end of file