From aff7104a99322c461709bd716ee4a1dd2f428b04 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 24 Oct 2016 10:26:20 +0700 Subject: [PATCH] Stream API migration: add narrowing cast if necessary when replacing += with sum() --- .../streamMigration/ReplaceWithSumFix.java | 7 +++++++ .../quickFix/streamApiMigration/afterSumNarrowing.java | 9 +++++++++ .../streamApiMigration/afterSumNarrowingParens.java | 9 +++++++++ .../streamApiMigration/beforeSumNarrowing.java | 10 ++++++++++ .../streamApiMigration/beforeSumNarrowingParens.java | 10 ++++++++++ 5 files changed, 45 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowing.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowingParens.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowing.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowingParens.java diff --git a/java/java-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithSumFix.java b/java/java-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithSumFix.java index 63cf08b98b11..0d9b6f050925 100644 --- a/java/java-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithSumFix.java +++ b/java/java-impl/src/com/intellij/codeInspection/streamMigration/ReplaceWithSumFix.java @@ -18,6 +18,8 @@ package com.intellij.codeInspection.streamMigration; import com.intellij.codeInspection.streamMigration.StreamApiMigrationInspection.MapOp; import com.intellij.openapi.project.Project; import com.intellij.psi.*; +import com.intellij.psi.util.TypeConversionUtil; +import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.NotNull; /** @@ -48,6 +50,11 @@ class ReplaceWithSumFix extends MigrateToStreamFix { if (!type.equals(PsiType.DOUBLE) && !type.equals(PsiType.LONG)) { type = PsiType.INT; } + PsiType addendType = addend.getType(); + if(addendType != null && !TypeConversionUtil.isAssignable(type, addendType)) { + addend = JavaPsiFacade.getElementFactory(project).createExpressionFromText( + "(" + type.getCanonicalText() + ")" + ParenthesesUtils.getText(addend, ParenthesesUtils.MULTIPLICATIVE_PRECEDENCE), addend); + } StringBuilder builder = generateStream(new MapOp(tb.getLastOperation(), addend, tb.getVariable(), type)); builder.append(".sum()"); return replaceWithNumericAddition(project, loopStatement, var, builder, type); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowing.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowing.java new file mode 100644 index 000000000000..8c10427530b8 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowing.java @@ -0,0 +1,9 @@ +// "Replace with sum()" "true" + +import java.util.Arrays; + +public class Main { + public void test(long[] list) { + int sum = Arrays.stream(list).mapToInt(x -> (int) x).sum(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowingParens.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowingParens.java new file mode 100644 index 000000000000..35d621967d86 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterSumNarrowingParens.java @@ -0,0 +1,9 @@ +// "Replace with sum()" "true" + +import java.util.Arrays; + +public class Main { + public void test(double[] list) { + int sum = Arrays.stream(list).mapToInt(x -> (int) (x * x)).sum(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowing.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowing.java new file mode 100644 index 000000000000..d7b3a4c98457 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowing.java @@ -0,0 +1,10 @@ +// "Replace with sum()" "true" + +public class Main { + public void test(long[] list) { + int sum = 0; + for(long x : list) { + sum+=x; + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowingParens.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowingParens.java new file mode 100644 index 000000000000..09d08473f96a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeSumNarrowingParens.java @@ -0,0 +1,10 @@ +// "Replace with sum()" "true" + +public class Main { + public void test(double[] list) { + int sum = 0; + for(double x : list) { + sum+=x * x; + } + } +} \ No newline at end of file