This commit is contained in:
svtk
2011-11-01 19:09:59 +04:00
parent a3ef9f9b50
commit 03e1e5dea6
@@ -304,8 +304,8 @@ public class JetFlowInformationProvider {
Collection<VariableDescriptor> declaredVariables = collectDeclaredVariables(subroutine); Collection<VariableDescriptor> declaredVariables = collectDeclaredVariables(subroutine);
Map<VariableDescriptor, InitializationPoints> initialMapForStartInstruction = Maps.newHashMap(); Map<VariableDescriptor, InitializationPoints> initialMapForStartInstruction = Maps.newHashMap();
InitializationPoints initialPointsForDeclaredVariable = new InitializationPoints(true); InitializationPoints initialPointsForDeclaredVariable = new InitializationPoints(false);
InitializationPoints initialPointsForExternalVariable = new InitializationPoints(false); InitializationPoints initialPointsForExternalVariable = new InitializationPoints(true);
for (VariableDescriptor variable : usedVariables) { for (VariableDescriptor variable : usedVariables) {
if (declaredVariables.contains(variable)) { if (declaredVariables.contains(variable)) {
@@ -337,13 +337,13 @@ public class JetFlowInformationProvider {
InitializationPoints exitInitializationPoints = exitData.get(variableDescriptor); InitializationPoints exitInitializationPoints = exitData.get(variableDescriptor);
assert exitInitializationPoints != null; assert exitInitializationPoints != null;
boolean canBeUnitialized = exitInitializationPoints.canBeUninitialized(); boolean isInitialized = exitInitializationPoints.isInitialized();
if (variableDescriptor instanceof PropertyDescriptor) { if (variableDescriptor instanceof PropertyDescriptor) {
if (!trace.get(BindingContext.BACKING_FIELD_REQUIRED, (PropertyDescriptor) variableDescriptor)) { if (!trace.get(BindingContext.BACKING_FIELD_REQUIRED, (PropertyDescriptor) variableDescriptor)) {
canBeUnitialized = false; isInitialized = true;
} }
} }
if (canBeUnitialized) { if (!isInitialized) {
trace.report(Errors.UNINITIALIZED_VARIABLE.on((JetSimpleNameExpression) element, variableDescriptor)); trace.report(Errors.UNINITIALIZED_VARIABLE.on((JetSimpleNameExpression) element, variableDescriptor));
} }
} }
@@ -357,19 +357,19 @@ public class JetFlowInformationProvider {
InitializationPoints exitInitializationPoints = exitData.get(variableDescriptor); InitializationPoints exitInitializationPoints = exitData.get(variableDescriptor);
assert exitInitializationPoints != null; assert exitInitializationPoints != null;
Set<JetElement> possiblePoints = enterInitializationPoints.getPossiblePoints(); Set<JetElement> possiblePoints = enterInitializationPoints.getPossiblePoints();
boolean hasAnotherInitializer = !possiblePoints.isEmpty() || !enterInitializationPoints.canBeUninitialized; boolean hasInitializer = !possiblePoints.isEmpty() || enterInitializationPoints.isInitialized();
if (possiblePoints.size() == 1) { if (possiblePoints.size() == 1) {
JetElement initializer = possiblePoints.iterator().next(); JetElement initializer = possiblePoints.iterator().next();
if (initializer == element.getParent()) { if (initializer == element.getParent()) {
hasAnotherInitializer = false; hasInitializer = false;
} }
} }
JetSimpleNameExpression expression = (JetSimpleNameExpression) element; JetSimpleNameExpression expression = (JetSimpleNameExpression) element;
if (hasAnotherInitializer && !variableDescriptor.isVar()) { if (hasInitializer && !variableDescriptor.isVar()) {
trace.report(Errors.VAL_REASSIGNMENT.on(expression, variableDescriptor)); trace.report(Errors.VAL_REASSIGNMENT.on(expression, variableDescriptor));
} }
if (inAnonymousInitializers && variableDescriptor instanceof PropertyDescriptor && if (inAnonymousInitializers && variableDescriptor instanceof PropertyDescriptor &&
enterInitializationPoints.canBeUninitialized && !exitInitializationPoints.canBeUninitialized) { !enterInitializationPoints.isInitialized() && exitInitializationPoints.isInitialized()) {
if (expression.getReferencedNameElementType() != JetTokens.FIELD_IDENTIFIER) { if (expression.getReferencedNameElementType() != JetTokens.FIELD_IDENTIFIER) {
trace.report(Errors.INITIALIZATION_USING_BACKING_FIELD.on(expression, variableDescriptor)); trace.report(Errors.INITIALIZATION_USING_BACKING_FIELD.on(expression, variableDescriptor));
} }
@@ -385,7 +385,7 @@ public class JetFlowInformationProvider {
VariableDescriptor variable = entry.getKey(); VariableDescriptor variable = entry.getKey();
if (variable instanceof PropertyDescriptor) { if (variable instanceof PropertyDescriptor) {
InitializationPoints initializationPoints = entry.getValue(); InitializationPoints initializationPoints = entry.getValue();
trace.record(BindingContext.IS_INITIALIZED, (PropertyDescriptor) variable, !initializationPoints.canBeUninitialized); trace.record(BindingContext.IS_INITIALIZED, (PropertyDescriptor) variable, initializationPoints.isInitialized());
} }
} }
} }
@@ -488,22 +488,22 @@ public class JetFlowInformationProvider {
private static class InitializationPoints { private static class InitializationPoints {
private Set<JetElement> possiblePoints = Sets.newHashSet(); private Set<JetElement> possiblePoints = Sets.newHashSet();
private boolean canBeUninitialized; private boolean isInitialized;
public InitializationPoints(boolean canBeUninitialized) { public InitializationPoints(boolean isInitialized) {
this.canBeUninitialized = canBeUninitialized; this.isInitialized = isInitialized;
} }
public InitializationPoints(JetElement element) { public InitializationPoints(JetElement element) {
canBeUninitialized = false; isInitialized = true;
possiblePoints.add(element); possiblePoints.add(element);
} }
public InitializationPoints(Set<InitializationPoints> edgesData) { public InitializationPoints(Set<InitializationPoints> edgesData) {
canBeUninitialized = false; isInitialized = true;
for (InitializationPoints edgeData : edgesData) { for (InitializationPoints edgeData : edgesData) {
if (edgeData.canBeUninitialized) { if (!edgeData.isInitialized) {
canBeUninitialized = true; isInitialized = false;
} }
possiblePoints.addAll(edgeData.possiblePoints); possiblePoints.addAll(edgeData.possiblePoints);
} }
@@ -513,8 +513,8 @@ public class JetFlowInformationProvider {
return possiblePoints; return possiblePoints;
} }
public boolean canBeUninitialized() { public boolean isInitialized() {
return canBeUninitialized; return isInitialized;
} }
@Override @Override
@@ -524,7 +524,7 @@ public class JetFlowInformationProvider {
InitializationPoints that = (InitializationPoints) o; InitializationPoints that = (InitializationPoints) o;
if (canBeUninitialized != that.canBeUninitialized) return false; if (isInitialized != that.isInitialized) return false;
if (possiblePoints != null ? !possiblePoints.equals(that.possiblePoints) : that.possiblePoints != null) { if (possiblePoints != null ? !possiblePoints.equals(that.possiblePoints) : that.possiblePoints != null) {
return false; return false;
} }
@@ -535,7 +535,7 @@ public class JetFlowInformationProvider {
@Override @Override
public int hashCode() { public int hashCode() {
int result = possiblePoints != null ? possiblePoints.hashCode() : 0; int result = possiblePoints != null ? possiblePoints.hashCode() : 0;
result = 31 * result + (canBeUninitialized ? 1 : 0); result = 31 * result + (isInitialized ? 1 : 0);
return result; return result;
} }
} }