find pseudocodeVariablesData lazily

This commit is contained in:
Svetlana Isakova
2013-11-29 19:26:52 +04:00
parent a9da88b425
commit 29acef7842
@@ -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<JetElement> returnedExpressions) {
@@ -188,6 +194,7 @@ public class JetFlowInformationProvider {
final Collection<VariableDescriptor> varWithValReassignErrorGenerated = Sets.newHashSet();
final boolean processClassOrObject = subroutine instanceof JetClassOrObject;
PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData();
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
final Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, true);
@@ -227,6 +234,7 @@ public class JetFlowInformationProvider {
}
public void recordInitializedVariables() {
PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData();
Pseudocode pseudocode = pseudocodeVariablesData.getPseudocode();
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
recordInitializedVariables(pseudocode, initializers);
@@ -424,7 +432,7 @@ public class JetFlowInformationProvider {
private void recordInitializedVariables(@NotNull Pseudocode pseudocode, @NotNull Map<Instruction, Edges<Map<VariableDescriptor,PseudocodeVariablesData.VariableInitState>>> initializersMap) {
Edges<Map<VariableDescriptor, VariableInitState>> initializers = initializersMap.get(pseudocode.getExitInstruction());
Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, false);
Set<VariableDescriptor> 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<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData();
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseState>> variableStatusAnalyzeStrategy =
@@ -521,7 +530,6 @@ public class JetFlowInformationProvider {
// "Unused literals" in block
public void markUnusedLiteralsInBlock() {
assert pseudocode != null;
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
PseudocodeTraverser.traverse(
pseudocode, FORWARD, new InstructionAnalyzeStrategy() {