From 4dfb7b9999f884b2d4884dbeff5d4bfda0523c92 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 24 Jul 2020 15:25:55 +0700 Subject: [PATCH] [java-dfa] toMap collector: Flush Map size on update GitOrigin-RevId: def13d95f991e7601682c03f5a2029ed332dc757 --- .../dataFlow/inliner/StreamChainInliner.java | 2 +- .../fixture/StreamToMapInlining2.java | 25 +++++++++++++++++++ .../DataFlowInspection8Test.java | 1 + 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/StreamToMapInlining2.java 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 eec017f8529f..ee65cfc12cfd 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 @@ -697,7 +697,7 @@ public class StreamChainInliner implements CallInliner { .end(); } // Actual addition of Map element is unnecessary for current analysis - builder.pop(); + builder.flush(SpecialField.COLLECTION_SIZE.createValue(builder.getFactory(), myResult)).pop(); } } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/StreamToMapInlining2.java b/java/java-tests/testData/inspection/dataFlow/fixture/StreamToMapInlining2.java new file mode 100644 index 000000000000..91958f9be9f9 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/StreamToMapInlining2.java @@ -0,0 +1,25 @@ +import java.util.*; +import java.util.stream.*; + +class Test { + // IDEA-246544 + public static void main(String[] args) { + List decimals = new ArrayList<>(Arrays.asList(1.2f, 4.4f, 2.7f, 2.5f)); + HashMap> decimalsGroupedByTheirIntegerParts = decimals.stream().collect(Collectors.toMap( + Float::intValue, + Collections::singletonList, + (subgroup1, subgroup2) -> Stream.concat(subgroup1.stream(), subgroup2.stream()).collect(Collectors.toList()), + () -> new HashMap<>() + )); + if (decimalsGroupedByTheirIntegerParts.isEmpty()) {} + + decimals.clear(); + HashMap> decimalsGroupedByTheirIntegerParts2 = decimals.stream().collect(Collectors.toMap( + Float::intValue, + Collections::singletonList, + (subgroup1, subgroup2) -> Stream.concat(subgroup1.stream(), subgroup2.stream()).collect(Collectors.toList()), + () -> new HashMap<>() + )); + if (decimalsGroupedByTheirIntegerParts2.isEmpty()) {} + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java index 6a20e38b98ae..14d02c868820 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -187,6 +187,7 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { public void testStreamInlining() { doTest(); } public void testStreamCollectorInlining() { doTest(); } public void testStreamToMapInlining() { doTest(); } + public void testStreamToMapInlining2() { doTest(); } public void testStreamToCollectionInlining() { doTest(); } public void testStreamComparatorInlining() { doTest(); } public void testStreamKnownSource() { doTest(); }