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