no different objects for VariableInitState
This commit is contained in:
@@ -449,7 +449,7 @@ public class JetFlowInformationProvider {
|
|||||||
if (element instanceof JetNamedDeclaration) {
|
if (element instanceof JetNamedDeclaration) {
|
||||||
PsiElement nameIdentifier = ((JetNamedDeclaration) element).getNameIdentifier();
|
PsiElement nameIdentifier = ((JetNamedDeclaration) element).getNameIdentifier();
|
||||||
if (nameIdentifier == null) return;
|
if (nameIdentifier == null) return;
|
||||||
if (variableUseState == null || variableUseState == UNUSED) {
|
if (!VariableUseState.isUsed(variableUseState)) {
|
||||||
if (element instanceof JetProperty) {
|
if (element instanceof JetProperty) {
|
||||||
trace.report(Errors.UNUSED_VARIABLE.on((JetProperty) element, variableDescriptor));
|
trace.report(Errors.UNUSED_VARIABLE.on((JetProperty) element, variableDescriptor));
|
||||||
}
|
}
|
||||||
@@ -467,7 +467,7 @@ public class JetFlowInformationProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (variableUseState == ONLY_WRITTEN_NEVER_READ &&element instanceof JetProperty) {
|
else if (variableUseState == ONLY_WRITTEN_NEVER_READ && element instanceof JetProperty) {
|
||||||
trace.report(Errors.ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE.on((JetNamedDeclaration) element, variableDescriptor));
|
trace.report(Errors.ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE.on((JetNamedDeclaration) element, variableDescriptor));
|
||||||
}
|
}
|
||||||
else if (variableUseState == LAST_WRITTEN && element instanceof JetProperty) {
|
else if (variableUseState == LAST_WRITTEN && element instanceof JetProperty) {
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ public class PseudocodeVariablesData {
|
|||||||
|
|
||||||
Map<VariableDescriptor, VariableInitState> enterInstructionData = mergeIncomingEdgesDataForInitializers(incomingEdgesData);
|
Map<VariableDescriptor, VariableInitState> enterInstructionData = mergeIncomingEdgesDataForInitializers(incomingEdgesData);
|
||||||
Map<VariableDescriptor, VariableInitState> exitInstructionData =
|
Map<VariableDescriptor, VariableInitState> exitInstructionData =
|
||||||
addVariableInitializerFromCurrentInstructionIfAny(instruction, enterInstructionData);
|
addVariableInitStateFromCurrentInstructionIfAny(instruction, enterInstructionData);
|
||||||
return Edges.create(enterInstructionData, exitInstructionData);
|
return Edges.create(enterInstructionData, exitInstructionData);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -154,8 +154,8 @@ public class PseudocodeVariablesData {
|
|||||||
@NotNull Collection<VariableDescriptor> declaredVariables) {
|
@NotNull Collection<VariableDescriptor> declaredVariables) {
|
||||||
|
|
||||||
Map<VariableDescriptor, VariableInitState> initialMapForStartInstruction = Maps.newHashMap();
|
Map<VariableDescriptor, VariableInitState> initialMapForStartInstruction = Maps.newHashMap();
|
||||||
VariableInitState initializedForExternalVariable = new VariableInitState(true);
|
VariableInitState initializedForExternalVariable = VariableInitState.create(true);
|
||||||
VariableInitState notInitializedForDeclaredVariable = new VariableInitState(false);
|
VariableInitState notInitializedForDeclaredVariable = VariableInitState.create(false);
|
||||||
|
|
||||||
for (VariableDescriptor variable : usedVariables) {
|
for (VariableDescriptor variable : usedVariables) {
|
||||||
if (declaredVariables.contains(variable)) {
|
if (declaredVariables.contains(variable)) {
|
||||||
@@ -186,13 +186,13 @@ public class PseudocodeVariablesData {
|
|||||||
edgesDataForVariable.add(initState);
|
edgesDataForVariable.add(initState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
enterInstructionData.put(variable, new VariableInitState(edgesDataForVariable));
|
enterInstructionData.put(variable, VariableInitState.create(edgesDataForVariable));
|
||||||
}
|
}
|
||||||
return enterInstructionData;
|
return enterInstructionData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private Map<VariableDescriptor, VariableInitState> addVariableInitializerFromCurrentInstructionIfAny(
|
private Map<VariableDescriptor, VariableInitState> addVariableInitStateFromCurrentInstructionIfAny(
|
||||||
@NotNull Instruction instruction, @NotNull Map<VariableDescriptor, VariableInitState> enterInstructionData) {
|
@NotNull Instruction instruction, @NotNull Map<VariableDescriptor, VariableInitState> enterInstructionData) {
|
||||||
|
|
||||||
if (!(instruction instanceof WriteValueInstruction) && !(instruction instanceof VariableDeclarationInstruction)) {
|
if (!(instruction instanceof WriteValueInstruction) && !(instruction instanceof VariableDeclarationInstruction)) {
|
||||||
@@ -206,21 +206,15 @@ public class PseudocodeVariablesData {
|
|||||||
if (instruction instanceof WriteValueInstruction) {
|
if (instruction instanceof WriteValueInstruction) {
|
||||||
VariableInitState enterInitState = enterInstructionData.get(variable);
|
VariableInitState enterInitState = enterInstructionData.get(variable);
|
||||||
VariableInitState initializationAtThisElement =
|
VariableInitState initializationAtThisElement =
|
||||||
new VariableInitState(((WriteValueInstruction) instruction).getElement() instanceof JetProperty, enterInitState);
|
VariableInitState.create(((WriteValueInstruction) instruction).getElement() instanceof JetProperty, enterInitState);
|
||||||
exitInstructionData.put(variable, initializationAtThisElement);
|
exitInstructionData.put(variable, initializationAtThisElement);
|
||||||
}
|
}
|
||||||
else { // instruction instanceof VariableDeclarationInstruction
|
else { // instruction instanceof VariableDeclarationInstruction
|
||||||
VariableInitState enterInitState = enterInstructionData.get(variable);
|
VariableInitState enterInitState = enterInstructionData.get(variable);
|
||||||
if (enterInitState == null || !enterInitState.isInitialized || !enterInitState.isDeclared) {
|
if (enterInitState == null || !enterInitState.isInitialized || !enterInitState.isDeclared) {
|
||||||
JetElement element = ((VariableDeclarationInstruction) instruction).getElement();
|
boolean isInitialized = enterInitState != null && enterInitState.isInitialized;
|
||||||
if (element instanceof JetProperty) {
|
VariableInitState variableDeclarationInfo = VariableInitState.create(isInitialized, true);
|
||||||
JetProperty property = (JetProperty) element;
|
exitInstructionData.put(variable, variableDeclarationInfo);
|
||||||
if (property.getInitializer() == null) {
|
|
||||||
boolean isInitialized = enterInitState != null && enterInitState.isInitialized;
|
|
||||||
VariableInitState variableDeclarationInfo = new VariableInitState(isInitialized, true);
|
|
||||||
exitInstructionData.put(variable, variableDeclarationInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return exitInstructionData;
|
return exitInstructionData;
|
||||||
@@ -287,21 +281,35 @@ public class PseudocodeVariablesData {
|
|||||||
public final boolean isInitialized;
|
public final boolean isInitialized;
|
||||||
public final boolean isDeclared;
|
public final boolean isDeclared;
|
||||||
|
|
||||||
public VariableInitState(boolean isInitialized) {
|
private VariableInitState(boolean isInitialized, boolean isDeclared) {
|
||||||
this(isInitialized, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public VariableInitState(boolean isInitialized, boolean isDeclared) {
|
|
||||||
this.isInitialized = isInitialized;
|
this.isInitialized = isInitialized;
|
||||||
this.isDeclared = isDeclared;
|
this.isDeclared = isDeclared;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VariableInitState(boolean isDeclaredHere, @Nullable VariableInitState mergedEdgesData) {
|
private static final VariableInitState VS_TT = new VariableInitState(true, true);
|
||||||
isInitialized = true;
|
private static final VariableInitState VS_TF = new VariableInitState(true, false);
|
||||||
isDeclared = isDeclaredHere || (mergedEdgesData != null && mergedEdgesData.isDeclared);
|
private static final VariableInitState VS_FT = new VariableInitState(false, true);
|
||||||
|
private static final VariableInitState VS_FF = new VariableInitState(false, false);
|
||||||
|
|
||||||
|
|
||||||
|
private static VariableInitState create(boolean isInitialized, boolean isDeclared) {
|
||||||
|
if (isInitialized) {
|
||||||
|
if (isDeclared) return VS_TT;
|
||||||
|
return VS_TF;
|
||||||
|
}
|
||||||
|
if (isDeclared) return VS_FT;
|
||||||
|
return VS_FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VariableInitState(@NotNull Set<VariableInitState> edgesData) {
|
private static VariableInitState create(boolean isInitialized) {
|
||||||
|
return create(isInitialized, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static VariableInitState create(boolean isDeclaredHere, @Nullable VariableInitState mergedEdgesData) {
|
||||||
|
return create(true, isDeclaredHere || (mergedEdgesData != null && mergedEdgesData.isDeclared));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static VariableInitState create(@NotNull Set<VariableInitState> edgesData) {
|
||||||
boolean isInitialized = true;
|
boolean isInitialized = true;
|
||||||
boolean isDeclared = true;
|
boolean isDeclared = true;
|
||||||
for (VariableInitState edgeData : edgesData) {
|
for (VariableInitState edgeData : edgesData) {
|
||||||
@@ -312,28 +320,7 @@ public class PseudocodeVariablesData {
|
|||||||
isDeclared = false;
|
isDeclared = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.isInitialized = isInitialized;
|
return create(isInitialized, isDeclared);
|
||||||
this.isDeclared = isDeclared;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object o) {
|
|
||||||
if (this == o) return true;
|
|
||||||
if (!(o instanceof VariableInitState)) return false;
|
|
||||||
|
|
||||||
VariableInitState that = (VariableInitState) o;
|
|
||||||
|
|
||||||
if (isDeclared != that.isDeclared) return false;
|
|
||||||
if (isInitialized != that.isInitialized) return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
int result = (isInitialized ? 1 : 0);
|
|
||||||
result = 31 * result + (isDeclared ? 1 : 0);
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,9 +336,13 @@ public class PseudocodeVariablesData {
|
|||||||
this.importance = importance;
|
this.importance = importance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public VariableUseState merge(@Nullable VariableUseState variableUseState) {
|
private VariableUseState merge(@Nullable VariableUseState variableUseState) {
|
||||||
if (variableUseState == null || importance > variableUseState.importance) return this;
|
if (variableUseState == null || importance > variableUseState.importance) return this;
|
||||||
return variableUseState;
|
return variableUseState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static boolean isUsed(@Nullable VariableUseState variableUseState) {
|
||||||
|
return variableUseState != null && variableUseState != UNUSED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user