find pseudocodeVariablesData lazily
This commit is contained in:
@@ -55,8 +55,8 @@ public class JetFlowInformationProvider {
|
|||||||
|
|
||||||
private final JetElement subroutine;
|
private final JetElement subroutine;
|
||||||
private final Pseudocode pseudocode;
|
private final Pseudocode pseudocode;
|
||||||
private final PseudocodeVariablesData pseudocodeVariablesData;
|
|
||||||
private final BindingTrace trace;
|
private final BindingTrace trace;
|
||||||
|
private PseudocodeVariablesData pseudocodeVariablesData;
|
||||||
|
|
||||||
public JetFlowInformationProvider(
|
public JetFlowInformationProvider(
|
||||||
@NotNull JetElement declaration,
|
@NotNull JetElement declaration,
|
||||||
@@ -65,7 +65,13 @@ 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);
|
||||||
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) {
|
private void collectReturnExpressions(@NotNull final Collection<JetElement> returnedExpressions) {
|
||||||
@@ -188,6 +194,7 @@ 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;
|
||||||
|
|
||||||
|
PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData();
|
||||||
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
|
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
|
||||||
final Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, true);
|
final Set<VariableDescriptor> declaredVariables = pseudocodeVariablesData.getDeclaredVariables(pseudocode, true);
|
||||||
|
|
||||||
@@ -227,6 +234,7 @@ public class JetFlowInformationProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void recordInitializedVariables() {
|
public void recordInitializedVariables() {
|
||||||
|
PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData();
|
||||||
Pseudocode pseudocode = pseudocodeVariablesData.getPseudocode();
|
Pseudocode pseudocode = pseudocodeVariablesData.getPseudocode();
|
||||||
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
|
Map<Instruction, Edges<Map<VariableDescriptor,VariableInitState>>> initializers = pseudocodeVariablesData.getVariableInitializers();
|
||||||
recordInitializedVariables(pseudocode, initializers);
|
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) {
|
private void recordInitializedVariables(@NotNull Pseudocode pseudocode, @NotNull Map<Instruction, Edges<Map<VariableDescriptor,PseudocodeVariablesData.VariableInitState>>> initializersMap) {
|
||||||
Edges<Map<VariableDescriptor, VariableInitState>> initializers = initializersMap.get(pseudocode.getExitInstruction());
|
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) {
|
for (VariableDescriptor variable : declaredVariables) {
|
||||||
if (variable instanceof PropertyDescriptor) {
|
if (variable instanceof PropertyDescriptor) {
|
||||||
PseudocodeVariablesData.VariableInitState variableInitState = initializers.in.get(variable);
|
PseudocodeVariablesData.VariableInitState variableInitState = initializers.in.get(variable);
|
||||||
@@ -438,6 +446,7 @@ public class JetFlowInformationProvider {
|
|||||||
// "Unused variable" & "unused value" analyses
|
// "Unused variable" & "unused value" analyses
|
||||||
|
|
||||||
public void markUnusedVariables() {
|
public void markUnusedVariables() {
|
||||||
|
final PseudocodeVariablesData pseudocodeVariablesData = getPseudocodeVariablesData();
|
||||||
Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData();
|
Map<Instruction, Edges<Map<VariableDescriptor, VariableUseState>>> variableStatusData = pseudocodeVariablesData.getVariableUseStatusData();
|
||||||
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
|
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
|
||||||
InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseState>> variableStatusAnalyzeStrategy =
|
InstructionDataAnalyzeStrategy<Map<VariableDescriptor, VariableUseState>> variableStatusAnalyzeStrategy =
|
||||||
@@ -521,7 +530,6 @@ public class JetFlowInformationProvider {
|
|||||||
// "Unused literals" in block
|
// "Unused literals" in block
|
||||||
|
|
||||||
public void markUnusedLiteralsInBlock() {
|
public void markUnusedLiteralsInBlock() {
|
||||||
assert pseudocode != null;
|
|
||||||
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
|
final Map<Instruction, DiagnosticFactory> reportedDiagnosticMap = Maps.newHashMap();
|
||||||
PseudocodeTraverser.traverse(
|
PseudocodeTraverser.traverse(
|
||||||
pseudocode, FORWARD, new InstructionAnalyzeStrategy() {
|
pseudocode, FORWARD, new InstructionAnalyzeStrategy() {
|
||||||
|
|||||||
Reference in New Issue
Block a user