This commit is contained in:
Svetlana Isakova
2012-05-28 13:00:47 +04:00
parent dfbd9922d9
commit 468052c3a5
3 changed files with 21 additions and 21 deletions
@@ -52,7 +52,7 @@ public class JetFlowInformationProvider {
private final JetDeclaration subroutine; private final JetDeclaration subroutine;
private final Pseudocode pseudocode; private final Pseudocode pseudocode;
private final PseudocodeVariablesData pseudocodeData; private final PseudocodeVariablesData pseudocodeVariablesData;
private BindingTrace trace; private BindingTrace trace;
public JetFlowInformationProvider( public JetFlowInformationProvider(
@@ -62,7 +62,7 @@ public class JetFlowInformationProvider {
subroutine = declaration; subroutine = declaration;
this.trace = trace; this.trace = trace;
pseudocode = new JetControlFlowProcessor(trace).generatePseudocode(declaration); pseudocode = new JetControlFlowProcessor(trace).generatePseudocode(declaration);
pseudocodeData = new PseudocodeVariablesData(pseudocode, trace.getBindingContext()); pseudocodeVariablesData = new PseudocodeVariablesData(pseudocode, trace.getBindingContext());
} }
private void collectReturnExpressions(@NotNull final Collection<JetElement> returnedExpressions) { private void collectReturnExpressions(@NotNull final Collection<JetElement> returnedExpressions) {
@@ -187,16 +187,15 @@ public class JetFlowInformationProvider {
final Collection<VariableDescriptor> varWithValReassignErrorGenerated = Sets.newHashSet(); final Collection<VariableDescriptor> varWithValReassignErrorGenerated = Sets.newHashSet();
final boolean processClassOrObject = subroutine instanceof JetClassOrObject; final boolean processClassOrObject = subroutine instanceof JetClassOrObject;
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitializers>>> initializers = pseudocodeData.getVariableInitializers(); Map<Instruction, Edges<Map<VariableDescriptor,VariableInitializers>>> initializers = pseudocodeVariablesData.getVariableInitializers();
final Set<VariableDescriptor> declaredVariables = pseudocodeData.getDeclaredVariables(pseudocode); final Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode);
PseudocodeTraverser.traverse(pseudocode, true, true, initializers, new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableInitializers>>() { PseudocodeTraverser.traverse(pseudocode, true, true, initializers, new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableInitializers>>() {
@Override @Override
public void execute(@NotNull Instruction instruction, public void execute(@NotNull Instruction instruction,
@Nullable Map<VariableDescriptor, VariableInitializers> in, @Nullable Map<VariableDescriptor, VariableInitializers> in,
@Nullable Map<VariableDescriptor, VariableInitializers> out) { @Nullable Map<VariableDescriptor, VariableInitializers> out) {
assert in != null && out != null; assert in != null && out != null;
VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, trace.getBindingContext());
trace.getBindingContext());
if (variableDescriptor == null) return; if (variableDescriptor == null) return;
if (!(instruction instanceof ReadValueInstruction) && !(instruction instanceof WriteValueInstruction)) return; if (!(instruction instanceof ReadValueInstruction) && !(instruction instanceof WriteValueInstruction)) return;
VariableInitializers outInitializers = out.get(variableDescriptor); VariableInitializers outInitializers = out.get(variableDescriptor);
@@ -224,7 +223,7 @@ public class JetFlowInformationProvider {
} }
}); });
Pseudocode pseudocode = pseudocodeData.getPseudocode(); Pseudocode pseudocode = pseudocodeVariablesData.getPseudocode();
recordInitializedVariables(pseudocode, initializers); recordInitializedVariables(pseudocode, initializers);
for (LocalDeclarationInstruction instruction : pseudocode.getLocalDeclarations()) { for (LocalDeclarationInstruction instruction : pseudocode.getLocalDeclarations()) {
recordInitializedVariables(instruction.getBody(), initializers); recordInitializedVariables(instruction.getBody(), initializers);
@@ -399,8 +398,8 @@ public class JetFlowInformationProvider {
private void recordInitializedVariables(@NotNull Pseudocode pseudocode, @NotNull Map<Instruction, Edges<Map<VariableDescriptor,VariableInitializers>>> initializersMap) { private void recordInitializedVariables(@NotNull Pseudocode pseudocode, @NotNull Map<Instruction, Edges<Map<VariableDescriptor,VariableInitializers>>> initializersMap) {
Edges<Map<VariableDescriptor, VariableInitializers>> initializers = initializersMap.get(pseudocode.getExitInstruction()); Edges<Map<VariableDescriptor, VariableInitializers>> initializers = initializersMap.get(pseudocode.getExitInstruction());
Set<VariableDescriptor> usedVariables = pseudocodeData.getUsedVariables(pseudocode); Set<VariableDescriptor> usedVariables = pseudocodeVariablesData.getUsedVariables(pseudocode);
Set<VariableDescriptor> declaredVariables = pseudocodeData.getDeclaredVariables(pseudocode); Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode);
for (VariableDescriptor variable : usedVariables) { for (VariableDescriptor variable : usedVariables) {
if (variable instanceof PropertyDescriptor && declaredVariables.contains(variable)) { if (variable instanceof PropertyDescriptor && declaredVariables.contains(variable)) {
VariableInitializers variableInitializers = initializers.in.get(variable); VariableInitializers variableInitializers = initializers.in.get(variable);
@@ -414,7 +413,7 @@ public class JetFlowInformationProvider {
// "Unused variable" & "unused value" analyses // "Unused variable" & "unused value" analyses
public void markUnusedVariables() { public void markUnusedVariables() {
Map<Instruction, Edges<Map<VariableDescriptor, VariableUseStatus>>> variableStatusData = pseudocodeData.getVariableUseStatusData(); Map<Instruction, Edges<Map<VariableDescriptor, VariableUseStatus>>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData();
InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseStatus>> variableStatusAnalyzeStrategy = InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseStatus>> variableStatusAnalyzeStrategy =
new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseStatus>>() { new InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseStatus>>() {
@Override @Override
@@ -423,7 +422,7 @@ public class JetFlowInformationProvider {
@Nullable Map<VariableDescriptor, VariableUseStatus> out) { @Nullable Map<VariableDescriptor, VariableUseStatus> out) {
assert in != null && out != null; assert in != null && out != null;
Set<VariableDescriptor> declaredVariables = pseudocodeData.getDeclaredVariables(instruction.getOwner()); Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(instruction.getOwner());
VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, false, VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, false,
trace.getBindingContext()); trace.getBindingContext());
if (variableDescriptor == null || !declaredVariables.contains(variableDescriptor) || if (variableDescriptor == null || !declaredVariables.contains(variableDescriptor) ||
@@ -37,7 +37,7 @@ public class PseudocodeTraverser {
return directOrder ? pseudocode.getEnterInstruction() : pseudocode.getSinkInstruction(); return directOrder ? pseudocode.getEnterInstruction() : pseudocode.getSinkInstruction();
} }
public static <D> Map<Instruction, Edges<D>> collectInformation( public static <D> Map<Instruction, Edges<D>> collectData(
@NotNull Pseudocode pseudocode, boolean directOrder, boolean lookInside, @NotNull Pseudocode pseudocode, boolean directOrder, boolean lookInside,
@NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction, @NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction,
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) { @NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy) {
@@ -50,8 +50,8 @@ public class PseudocodeTraverser {
changed[0] = true; changed[0] = true;
while (changed[0]) { while (changed[0]) {
changed[0] = false; changed[0] = false;
collectInformationFromSubgraph(pseudocode, directOrder, lookInside, edgesMap, instructionDataMergeStrategy, collectDataFromSubgraph(pseudocode, directOrder, lookInside, edgesMap, instructionDataMergeStrategy,
Collections.<Instruction>emptyList(), changed, false); Collections.<Instruction>emptyList(), changed, false);
} }
return edgesMap; return edgesMap;
} }
@@ -70,7 +70,7 @@ public class PseudocodeTraverser {
} }
} }
private static <D> void collectInformationFromSubgraph( private static <D> void collectDataFromSubgraph(
@NotNull Pseudocode pseudocode, boolean directOrder, boolean lookInside, @NotNull Pseudocode pseudocode, boolean directOrder, boolean lookInside,
@NotNull Map<Instruction, Edges<D>> edgesMap, @NotNull Map<Instruction, Edges<D>> edgesMap,
@NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy, @NotNull InstructionDataMergeStrategy<D> instructionDataMergeStrategy,
@@ -97,9 +97,9 @@ public class PseudocodeTraverser {
if (lookInside && instruction instanceof LocalDeclarationInstruction) { if (lookInside && instruction instanceof LocalDeclarationInstruction) {
Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody(); Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody();
collectInformationFromSubgraph(subroutinePseudocode, directOrder, lookInside, edgesMap, instructionDataMergeStrategy, collectDataFromSubgraph(subroutinePseudocode, directOrder, lookInside, edgesMap, instructionDataMergeStrategy,
previousInstructions, previousInstructions,
changed, true); changed, true);
Instruction lastInstruction = directOrder ? subroutinePseudocode.getSinkInstruction() : subroutinePseudocode.getEnterInstruction(); Instruction lastInstruction = directOrder ? subroutinePseudocode.getSinkInstruction() : subroutinePseudocode.getEnterInstruction();
Edges<D> previousValue = edgesMap.get(instruction); Edges<D> previousValue = edgesMap.get(instruction);
Edges<D> newValue = edgesMap.get(lastInstruction); Edges<D> newValue = edgesMap.get(lastInstruction);
@@ -118,7 +118,7 @@ public class PseudocodeVariablesData {
final Map<VariableDescriptor, VariableInitializers> initialMapForStartInstruction = prepareInitializersMapForStartInstruction( final Map<VariableDescriptor, VariableInitializers> initialMapForStartInstruction = prepareInitializersMapForStartInstruction(
usedVariables, declaredVariables); usedVariables, declaredVariables);
Map<Instruction, Edges<Map<VariableDescriptor, VariableInitializers>>> variableInitializersMap = PseudocodeTraverser.collectInformation( Map<Instruction, Edges<Map<VariableDescriptor, VariableInitializers>>> variableInitializersMap = PseudocodeTraverser.collectData(
pseudocode, /* directOrder = */ true, /* lookInside = */ false, pseudocode, /* directOrder = */ true, /* lookInside = */ false,
initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitializers>>() { initialMap, initialMapForStartInstruction, new PseudocodeTraverser.InstructionDataMergeStrategy<Map<VariableDescriptor, VariableInitializers>>() {
@Override @Override
@@ -275,8 +275,9 @@ public class PseudocodeVariablesData {
return Edges.create(enterResult, exitResult); return Edges.create(enterResult, exitResult);
} }
}; };
variableStatusMap = PseudocodeTraverser.collectInformation(pseudocode, false, true, variableStatusMap = PseudocodeTraverser.collectData(pseudocode, false, true,
Collections.<VariableDescriptor, VariableUseStatus>emptyMap(), sinkInstructionData, collectVariableUseStatusStrategy); Collections.<VariableDescriptor, VariableUseStatus>emptyMap(),
sinkInstructionData, collectVariableUseStatusStrategy);
} }
return variableStatusMap; return variableStatusMap;
} }