added LookInsideStrategy enum
This commit is contained in:
@@ -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 <D> Map<Instruction, Edges<D>> collectData(
|
||||
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside,
|
||||
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, LookInsideStrategy lookInside,
|
||||
@NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction,
|
||||
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) {
|
||||
|
||||
@@ -85,21 +94,22 @@ public class PseudocodeTraverser {
|
||||
}
|
||||
|
||||
private static <D> void initializeEdgesMap(
|
||||
@NotNull Pseudocode pseudocode, boolean lookInside,
|
||||
@NotNull Pseudocode pseudocode, LookInsideStrategy lookInside,
|
||||
@NotNull Map<Instruction, Edges<D>> edgesMap,
|
||||
@NotNull D initialDataValue) {
|
||||
List<Instruction> instructions = pseudocode.getInstructions();
|
||||
Edges<D> 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 <D> void collectDataFromSubgraph(
|
||||
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder, boolean lookInside,
|
||||
@NotNull Pseudocode pseudocode, TraversalOrder traversalOrder,
|
||||
LookInsideStrategy lookInside,
|
||||
@NotNull Map<Instruction, Edges<D>> edgesMap,
|
||||
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy,
|
||||
@NotNull Collection<Instruction> 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,
|
||||
|
||||
@@ -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<Instruction, Edges<Map<VariableDescriptor, VariableInitState>>> variableInitializersMap = PseudocodeTraverser.collectData(
|
||||
pseudocode, FORWARD, /* lookInside = */ false,
|
||||
pseudocode, FORWARD, SKIP_LOCAL_DECLARATIONS,
|
||||
initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitState>>() {
|
||||
@Override
|
||||
public Edges<Map<VariableDescriptor, VariableInitState>> 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.<VariableDescriptor, VariableUseState>emptyMap(),
|
||||
sinkInstructionData, collectVariableUseStatusStrategy);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user