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 eb486e47ee56..f77886cb2e8e 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 @@ -452,6 +452,19 @@ public class CFGBuilder { return add(new FlushFieldsInstruction()); } + /** + * Generate instruction to flush given value if it's variable. + * + * @param value value to flush + * @return this builder + */ + public CFGBuilder flush(DfaValue value) { + if (value instanceof DfaVariableValue) { + add(new FlushVariableInstruction((DfaVariableValue)value)); + } + return this; + } + /** * Generate instructions to assign top stack value to the second stack value * (usually pushed via {@link #pushForWrite(DfaVariableValue)}). 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 1521d39ec3c4..ffd0dea31dbe 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 @@ -600,7 +600,7 @@ public class StreamChainInliner implements CallInliner { void iteration(CFGBuilder builder) { // do nothing currently: we can emulate calling collection.add, // but it's unnecessary for current analysis - builder.pop(); + builder.flush(SpecialField.COLLECTION_SIZE.createValue(builder.getFactory(), myResult)).pop(); } @Override diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/StreamToCollectionInlining.java b/java/java-tests/testData/inspection/dataFlow/fixture/StreamToCollectionInlining.java new file mode 100644 index 000000000000..e3c818a6da1f --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/StreamToCollectionInlining.java @@ -0,0 +1,16 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +class Main2 { + // IDEA-221210 + public static void main(String[] args) { + List originalList = new ArrayList<>(); + originalList.add(1); + final List newList = originalList.stream() + .collect(Collectors.toCollection(() -> new ArrayList<>(1))); + + boolean empty = newList.isEmpty(); + } + +} 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 8b169da081ff..c3ced503f896 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -174,6 +174,7 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { public void testStreamInlining() { doTest(); } public void testStreamCollectorInlining() { doTest(); } public void testStreamToMapInlining() { doTest(); } + public void testStreamToCollectionInlining() { doTest(); } public void testStreamComparatorInlining() { doTest(); } public void testStreamKnownSource() { doTest(); } public void testStreamTypeAnnoInlining() {