From ea7ac9eec7695ece7a1a963c9b4978f8757a7ee5 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 26 Jul 2018 16:03:55 +0700 Subject: [PATCH] CFG: Missing boxing added (EA-125425 - ISE: DfaMemoryStateImpl.addToMap) --- .../intellij/codeInspection/dataFlow/CFGBuilder.java | 1 + .../dataFlow/inliner/StreamChainInliner.java | 4 +++- .../inspection/dataFlow/fixture/StreamInlining.java | 12 ++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CFGBuilder.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CFGBuilder.java index 8a2cac28af70..17456a2ea826 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CFGBuilder.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/CFGBuilder.java @@ -726,6 +726,7 @@ public class CFGBuilder { push(factory.getConstFactory().getSentinel()); for (PsiExpression expression : expressions) { pushExpression(expression); + boxUnbox(expression, targetVariable.getVariableType()); } // Revert order add(new SpliceInstruction(expressions.length, IntStreamEx.ofIndices(expressions).toArray())); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inliner/StreamChainInliner.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inliner/StreamChainInliner.java index de107041218d..73569a0e08ec 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inliner/StreamChainInliner.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/inliner/StreamChainInliner.java @@ -712,8 +712,10 @@ public class StreamChainInliner implements CallInliner { } if (single) { // exactly single element + PsiExpression arg = sourceCall.getArgumentList().getExpressions()[0]; builder - .pushExpression(sourceCall.getArgumentList().getExpressions()[0]) + .pushExpression(arg) + .boxUnbox(arg, inType) .chain(firstStep::before) .chain(firstStep::iteration); return; diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java b/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java index 12f61c7c0f70..5fa6afb5f8d8 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/StreamInlining.java @@ -238,4 +238,16 @@ public class StreamInlining { void testToArray(List list) { list.stream().toArray(size -> null); } + + Object testBoxingExplicit() { + return String.join("\n", + Stream.of(12, 22) + .map(Object::toString) + .collect(Collectors.toList()) + ); + } + + public static void testBoxingExplicit2() { + double s = Stream.of(1).mapToDouble(x -> x * x).sum(); + } }