Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Unified Diff: compiler/java/com/google/dart/compiler/resolver/Resolver.java

Issue 9166006: Issue 1105: Duplicate initialization should have a compile error (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Nit Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: compiler/java/com/google/dart/compiler/resolver/Resolver.java
diff --git a/compiler/java/com/google/dart/compiler/resolver/Resolver.java b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
index 745c0080484c74e2cfef17fef21b49f53645531d..0444d9afd41aab07c9478d6e93ad9ca75c0a6612 100644
--- a/compiler/java/com/google/dart/compiler/resolver/Resolver.java
+++ b/compiler/java/com/google/dart/compiler/resolver/Resolver.java
@@ -177,7 +177,7 @@ public class Resolver {
private LabelElement currentLabel;
private Set<LabelElement> referencedLabels = Sets.newHashSet();
private Set<LabelElement> labelsInScopes = Sets.newHashSet();
- private Set<String> finalsNeedingInitializing = Sets.newHashSet();
+ private Set<FieldElement> finalsNeedingInitializing = Sets.newHashSet();
@VisibleForTesting
public ResolveElementsVisitor(ResolutionContext context,
@@ -559,7 +559,7 @@ public class Resolver {
DartFunction functionNode = node.getFunction();
List<DartParameter> parameters = functionNode.getParams();
- Set<String> initalizedFinals = Sets.newHashSet();
+ Set<FieldElement> initializedFields = Sets.newHashSet();
// First declare all normal parameters in the scope, putting them in the
// scope of the default expressions so we can report better errors.
@@ -567,9 +567,6 @@ public class Resolver {
assert parameter.getSymbol() != null;
if (parameter.getQualifier() instanceof DartThisExpression) {
checkParameterInitializer(node, parameter);
- if (!initalizedFinals.add(parameter.getParameterName())) {
- onError(parameter, ResolverErrorCode.DUPLICATE_PARAMETER, parameter.getName());
- }
} else {
getContext().declare(
parameter.getSymbol(),
@@ -580,6 +577,10 @@ public class Resolver {
for (DartParameter parameter : parameters) {
// Then resolve the default values.
resolve(parameter.getDefaultExpr());
+ if (parameter.getQualifier() instanceof DartThisExpression && parameter.getSymbol() != null
+ && !initializedFields.add(parameter.getSymbol().getParameterInitializerElement())) {
+ onError(parameter, ResolverErrorCode.DUPLICATE_INITIALIZATION, parameter.getName());
+ }
}
if ((functionNode.getBody() == null)
@@ -591,13 +592,13 @@ public class Resolver {
resolve(functionNode.getBody());
if (Elements.isNonFactoryConstructor(member)) {
- resolveInitializers(node, initalizedFinals);
+ resolveInitializers(node, initializedFields);
// Test for missing final initialized fields
- if (!this.currentHolder.isInterface() && !member.getModifiers().isRedirectedConstructor()
- && !finalsNeedingInitializing.equals(initalizedFinals)) {
- for (String field : this.finalsNeedingInitializing) {
- if (!initalizedFinals.contains(field)) {
- onError(node.getName(), ResolverErrorCode.FINAL_FIELD_MUST_BE_INITIALIZED, field);
+ if (!this.currentHolder.isInterface() && !member.getModifiers().isRedirectedConstructor()) {
+ for (FieldElement finalField : this.finalsNeedingInitializing) {
+ if (!initializedFields.contains(finalField)) {
+ onError(node.getName(), ResolverErrorCode.FINAL_FIELD_MUST_BE_INITIALIZED,
+ finalField.getName());
}
}
}
@@ -697,7 +698,7 @@ public class Resolver {
} else {
// If a final instance field wasn't initialized at declaration, we must check
// at construction time.
- this.finalsNeedingInitializing.add(node.getName().getTargetName());
+ this.finalsNeedingInitializing.add(node.getSymbol());
}
}
@@ -1733,7 +1734,7 @@ public class Resolver {
}
}
- private void resolveInitializers(DartMethodDefinition node, Set<String> intializedFields) {
+ private void resolveInitializers(DartMethodDefinition node, Set<FieldElement> intializedFields) {
Iterator<DartInitializer> initializers = node.getInitializers().iterator();
ConstructorElement constructorElement = null;
while (initializers.hasNext()) {
@@ -1743,9 +1744,8 @@ public class Resolver {
constructorElement = (ConstructorElement) element;
} else if (initializer.getName() != null && initializer.getName().getSymbol() != null
&& initializer.getName().getSymbol().getModifiers() != null
- && initializer.getName().getSymbol().getModifiers().isFinal()
- && !intializedFields.add(initializer.getName().getTargetName())) {
- onError(initializer, ResolverErrorCode.DUPLICATE_PARAMETER, initializer.getName());
+ && !intializedFields.add((FieldElement)initializer.getName().getTargetSymbol())) {
+ onError(initializer, ResolverErrorCode.DUPLICATE_INITIALIZATION, initializer.getName());
}
}
« no previous file with comments | « no previous file | compiler/java/com/google/dart/compiler/resolver/ResolverErrorCode.java » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698