Index: dart/lib/compiler/implementation/resolver.dart |
diff --git a/dart/lib/compiler/implementation/resolver.dart b/dart/lib/compiler/implementation/resolver.dart |
index b169bec2a9c83dda9449d0ca5dba4e8385e75278..8a88fda0ddf2046b977253cf544a7c59b9012239 100644 |
--- a/dart/lib/compiler/implementation/resolver.dart |
+++ b/dart/lib/compiler/implementation/resolver.dart |
@@ -429,6 +429,14 @@ class InitializerResolver { |
return node.receiver.asIdentifier().isThis(); |
} |
+ void checkForDuplicateInitializers(SourceString name, Node init) { |
+ if (initialized.containsKey(name)) { |
+ error(init, MessageKind.DUPLICATE_INITIALIZER, [name]); |
+ warning(initialized[name], MessageKind.ALREADY_INITIALIZED, [name]); |
+ } |
+ initialized[name] = init; |
+ } |
+ |
void resolveFieldInitializer(FunctionElement constructor, SendSet init) { |
// init is of the form [this.]field = value. |
final Node selector = init.selector; |
@@ -450,12 +458,7 @@ class InitializerResolver { |
} |
visitor.useElement(init, target); |
visitor.world.registerStaticUse(target); |
- // Check for duplicate initializers. |
- if (initialized.containsKey(name)) { |
- error(init, MessageKind.DUPLICATE_INITIALIZER, [name]); |
- warning(initialized[name], MessageKind.ALREADY_INITIALIZED, [name]); |
- } |
- initialized[name] = init; |
+ checkForDuplicateInitializers(name, init); |
// Resolve initializing value. |
visitor.visitInStaticContext(init.arguments.head); |
} |
@@ -554,6 +557,17 @@ class InitializerResolver { |
*/ |
FunctionElement resolveInitializers(FunctionElement constructor, |
FunctionExpression functionNode) { |
+ // Keep track of all "this.param" parameters specified for constructor so |
+ // that we can ensure that fields are initialized only once. |
+ FunctionSignature functionParameters = |
+ constructor.computeSignature(visitor.compiler); |
+ functionParameters.forEachParameter((Element element) { |
+ if (element.kind === ElementKind.FIELD_PARAMETER) { |
+ checkForDuplicateInitializers(element.name, |
+ element.parseNode(visitor.compiler)); |
+ } |
+ }); |
+ |
if (functionNode.initializers === null) { |
initializers = const EmptyLink<Node>(); |
} else { |