Stream API migration: add narrowing cast if necessary when replacing += with sum()

This commit is contained in:
Tagir Valeev
2016-10-24 10:28:29 +07:00
parent 16a931688f
commit aff7104a99
5 changed files with 45 additions and 0 deletions
@@ -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);
@@ -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();
}
}
@@ -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();
}
}
@@ -0,0 +1,10 @@
// "Replace with sum()" "true"
public class Main {
public void test(long[] list) {
int sum = 0;
for(long x : li<caret>st) {
sum+=x;
}
}
}
@@ -0,0 +1,10 @@
// "Replace with sum()" "true"
public class Main {
public void test(double[] list) {
int sum = 0;
for(double x : li<caret>st) {
sum+=x * x;
}
}
}