diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index d6ca72602fc..fe059ae6b90 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -55,8 +55,8 @@ public class JetFlowInformationProvider { private final JetElement subroutine; private final Pseudocode pseudocode; - private final PseudocodeVariablesData pseudocodeVariablesData; private final BindingTrace trace; + private PseudocodeVariablesData pseudocodeVariablesData; public JetFlowInformationProvider( @NotNull JetElement declaration, @@ -65,7 +65,13 @@ public class JetFlowInformationProvider { subroutine = declaration; this.trace = trace; pseudocode = new JetControlFlowProcessor(trace).generatePseudocode(declaration); - pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode, trace.getBindingContext()); + } + + public PseudocodeVariablesData getPseudocodeVariablesData() { + if (pseudocodeVariablesData == null) { + pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode, trace.getBindingContext()); + } + return pseudocodeVariablesData; } private void collectReturnExpressions(@NotNull final Collection returnedExpressions) { @@ -188,6 +194,7 @@ public class JetFlowInformationProvider { final Collection varWithValReassignErrorGenerated = Sets.newHashSet(); final boolean processClassOrObject = subroutine instanceof JetClassOrObject; + PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData(); Map>> initializers = pseudocodeVariablesData.getVariableInitializers(); final Set declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, true); @@ -227,6 +234,7 @@ public class JetFlowInformationProvider { } public void recordInitializedVariables() { + PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData(); Pseudocode pseudocode = pseudocodeVariablesData.getPseudocode(); Map>> initializers = pseudocodeVariablesData.getVariableInitializers(); recordInitializedVariables(pseudocode, initializers); @@ -424,7 +432,7 @@ public class JetFlowInformationProvider { private void recordInitializedVariables(@NotNull Pseudocode pseudocode, @NotNull Map>> initializersMap) { Edges> initializers = initializersMap.get(pseudocode.getExitInstruction()); - Set declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, false); + Set declaredVariables = getPseudocodeVariablesData().getDeclaredVariables(pseudocode, false); for (VariableDescriptor variable : declaredVariables) { if (variable instanceof PropertyDescriptor) { PseudocodeVariablesData.VariableInitState variableInitState = initializers.in.get(variable); @@ -438,6 +446,7 @@ public class JetFlowInformationProvider { // "Unused variable" & "unused value" analyses public void markUnusedVariables() { + final PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData(); Map>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData(); final Map reportedDiagnosticMap = Maps.newHashMap(); InstructionDataAnalyzeStrategy> variableStatusAnalyzeStrategy = @@ -521,7 +530,6 @@ public class JetFlowInformationProvider { // "Unused literals" in block public void markUnusedLiteralsInBlock() { - assert pseudocode != null; final Map reportedDiagnosticMap = Maps.newHashMap(); PseudocodeTraverser.traverse( pseudocode, FORWARD, new InstructionAnalyzeStrategy() {