diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.java index 5b43f99fdb7..53d26f96363 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeTraverser.java @@ -37,7 +37,7 @@ public class PseudocodeTraverser { public static enum TraversalOrder { FORWARD, - BACKWARD; + BACKWARD } @NotNull @@ -65,8 +65,17 @@ public class PseudocodeTraverser { : instruction instanceof SubroutineSinkInstruction; } + public static enum LookInsideStrategy { + ANALYSE_LOCAL_DECLARATIONS, + SKIP_LOCAL_DECLARATIONS + } + + private static boolean shouldLookInside(Instruction instruction, LookInsideStrategy lookInside) { + return lookInside == LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS && instruction instanceof LocalDeclarationInstruction; + } + public static Map> collectData( - @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside, + @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, LookInsideStrategy lookInside, @NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction, @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy) { @@ -85,21 +94,22 @@ public class PseudocodeTraverser { } private static void initializeEdgesMap( - @NotNull Pseudocode pseudocode, boolean lookInside, + @NotNull Pseudocode pseudocode, LookInsideStrategy lookInside, @NotNull Map> edgesMap, @NotNull D initialDataValue) { List instructions = pseudocode.getInstructions(); Edges initialEdge = Edges.create(initialDataValue, initialDataValue); for (Instruction instruction : instructions) { edgesMap.put(instruction, initialEdge); - if (lookInside && instruction instanceof LocalDeclarationInstruction) { + if (shouldLookInside(instruction, lookInside)) { initializeEdgesMap(((LocalDeclarationInstruction) instruction).getBody(), lookInside, edgesMap, initialDataValue); } } } private static void collectDataFromSubgraph( - @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside, + @NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, + LookInsideStrategy lookInside, @NotNull Map> edgesMap, @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy, @NotNull Collection previousSubGraphInstructions, @@ -123,7 +133,7 @@ public class PseudocodeTraverser { allPreviousInstructions = previousInstructions; } - if (lookInside && instruction instanceof LocalDeclarationInstruction) { + if (shouldLookInside(instruction, lookInside)) { Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody(); collectDataFromSubgraph(subroutinePseudocode, traversalOrder, lookInside, edgesMap, instructionDataMergeStrategy, previousInstructions, diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java index d5da09374da..eef35f381b4 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java @@ -33,6 +33,8 @@ import java.util.Collections; import java.util.Map; import java.util.Set; +import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.LookInsideStrategy.ANALYSE_LOCAL_DECLARATIONS; +import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.LookInsideStrategy.SKIP_LOCAL_DECLARATIONS; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.BACKWARD; import static org.jetbrains.jet.lang.cfg.PseudocodeTraverser.TraversalOrder.FORWARD; @@ -141,7 +143,7 @@ public class PseudocodeVariablesData { usedVariables, declaredVariables); Map>> variableInitializersMap = PseudocodeTraverser.collectData( - pseudocode, FORWARD, /* lookInside = */ false, + pseudocode, FORWARD, SKIP_LOCAL_DECLARATIONS, initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy>() { @Override public Edges> execute( @@ -292,7 +294,7 @@ public class PseudocodeVariablesData { return Edges.create(enterResult, exitResult); } }; - variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, true, + variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS, Collections.emptyMap(), sinkInstructionData, collectVariableUseStatusStrategy); }