diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index 2b0db143e9d8..5f281c95c040 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -39,6 +39,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.BiConsumer; public class DfaMemoryStateImpl implements DfaMemoryState { @@ -106,7 +107,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { public DfaMemoryStateImpl createClosureState() { DfaMemoryStateImpl copy = createCopy(); copy.flushFields(); - Set vars = new HashSet<>(copy.getVariableStates().keySet()); + Set vars = new HashSet<>(copy.myVariableStates.keySet()); for (DfaVariableValue value : vars) { copy.flushDependencies(value); } @@ -1206,9 +1207,8 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return state; } - @NotNull - Map getVariableStates() { - return myVariableStates; + void forVariableStates(BiConsumer consumer) { + myVariableStates.forEach(consumer); } @NotNull diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java index d44424c06bad..a722dee05e7a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java @@ -324,10 +324,8 @@ public class DfaUtil { PsiExpression place = instruction.getPlace(); if (place != null) { PlaceResult result = myResults.computeIfAbsent(place, __ -> new PlaceResult()); - final Map map = ((ValuableDataFlowRunner.MyDfaMemoryState)memState).getVariableStates(); - for (Map.Entry entry : map.entrySet()) { - ValuableDataFlowRunner.ValuableDfaVariableState state = (ValuableDataFlowRunner.ValuableDfaVariableState)entry.getValue(); - DfaVariableValue variableValue = entry.getKey(); + ((ValuableDataFlowRunner.MyDfaMemoryState)memState).forVariableStates((variableValue, value) -> { + ValuableDataFlowRunner.ValuableDfaVariableState state = (ValuableDataFlowRunner.ValuableDfaVariableState)value; final FList concatenation = state.myConcatenation; if (!concatenation.isEmpty() && variableValue.getQualifier() == null) { PsiModifierListOwner element = variableValue.getPsiVariable(); @@ -335,7 +333,7 @@ public class DfaUtil { result.myValues.put((PsiVariable)element, concatenation); } } - } + }); DfaValue value = instruction.getValue(); if (value instanceof DfaVariableValue && ((DfaVariableValue)value).getQualifier() == null) { PsiModifierListOwner element = ((DfaVariableValue)value).getPsiVariable(); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index 99ab239dccb3..3ad941c608c6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -265,8 +265,7 @@ class StateMerger { Map> ranges = new LinkedHashMap<>(); for (DfaMemoryStateImpl state : states) { ProgressManager.checkCanceled(); - Map variableStates = state.getVariableStates(); - variableStates.forEach((varValue, varState) -> { + state.forVariableStates((varValue, varState) -> { LongRangeSet range = varState.getFact(RANGE); if (range != null) { ranges.computeIfAbsent(varValue, k -> new HashMap<>()).put(range, range); @@ -378,12 +377,12 @@ class StateMerger { @NotNull private Set getFacts(@NotNull DfaMemoryStateImpl state) { - Set result = myFacts.get(state); - if (result != null) { - return result; - } - - result = ContainerUtil.newLinkedHashSet(); + return myFacts.computeIfAbsent(state, StateMerger::doGetFacts); + } + + @NotNull + private static Set doGetFacts(DfaMemoryStateImpl state) { + Set result = ContainerUtil.newLinkedHashSet(); IdentityHashMap classInfo = new IdentityHashMap<>(); @@ -426,10 +425,7 @@ class StateMerger { } } - Map states = state.getVariableStates(); - for (Map.Entry entry : states.entrySet()) { - DfaVariableValue var = entry.getKey(); - DfaVariableState variableState = entry.getValue(); + state.forVariableStates((var, variableState) -> { TypeConstraint typeConstraint = variableState.getTypeConstraint(); for (DfaPsiType type : typeConstraint.getInstanceofValues()) { result.add(new InstanceofFact(var, true, type)); @@ -437,9 +433,7 @@ class StateMerger { for (DfaPsiType type : typeConstraint.getNotInstanceofValues()) { result.add(new InstanceofFact(var, false, type)); } - } - - myFacts.put(state, result); + }); return result; }