Chromium Code Reviews| Index: lib/compiler/implementation/resolver.dart |
| diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart |
| index 284387ffcc078d670f8a98e353c2c67fb0dd3c89..b811b8a4dff3ccd92b08d2d51a07bb6af365c785 100644 |
| --- a/lib/compiler/implementation/resolver.dart |
| +++ b/lib/compiler/implementation/resolver.dart |
| @@ -139,7 +139,7 @@ class ResolverTask extends CompilerTask { |
| } else if (tree.initializers != null) { |
| error(tree, MessageKind.FUNCTION_WITH_INITIALIZER); |
| } |
| - visitor.visit(tree.body); |
| + visitBody(visitor, tree.body); |
| // Resolve the type annotations encountered in the method. |
| while (!toResolve.isEmpty()) { |
| @@ -153,6 +153,10 @@ class ResolverTask extends CompilerTask { |
| }); |
| } |
| + void visitBody(ResolverVisitor visitor, Statement body) { |
|
ahe
2012/08/02 19:56:23
What is the purpose of this method?
|
| + visitor.visit(body); |
| + } |
| + |
| void resolveConstructorImplementation(FunctionElement constructor, |
| FunctionExpression node) { |
| if (constructor.defaultImplementation !== constructor) return; |
| @@ -1937,6 +1941,24 @@ class SignatureResolver extends CommonResolverVisitor<Element> { |
| ElementKind.PARAMETER, enclosingElement, node: node); |
| } |
| + SourceString getParameterName(Send node) { |
| + var identifier = node.selector.asIdentifier(); |
| + if (identifier !== null) { |
| + // Normal parameter: [:Type name:]. |
| + return identifier.source; |
| + } else { |
| + // Function type parameter: [:void name(Type arg):]. |
| + var functionExpression = node.selector.asFunctionExpression(); |
| + if (functionExpression !== null && |
| + functionExpression.name.asIdentifier() !== null) { |
| + return functionExpression.name.asIdentifier().source; |
| + } else { |
| + cancel(node, |
| + 'internal error: unimplemented receiver on parameter send'); |
| + } |
| + } |
| + } |
| + |
| // The only valid [Send] can be in constructors and must be of the form |
| // [:this.x:] (where [:x:] represents an instance field). |
| FieldParameterElement visitSend(Send node) { |
| @@ -1947,11 +1969,7 @@ class SignatureResolver extends CommonResolverVisitor<Element> { |
| } else if (enclosingElement.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) { |
| error(node, MessageKind.FIELD_PARAMETER_NOT_ALLOWED, []); |
| } else { |
| - if (node.selector.asIdentifier() == null) { |
| - cancel(node, |
| - 'internal error: unimplemented receiver on parameter send'); |
| - } |
| - SourceString name = node.selector.asIdentifier().source; |
| + SourceString name = getParameterName(node); |
| Element fieldElement = currentClass.lookupLocalMember(name); |
| if (fieldElement === null || fieldElement.kind !== ElementKind.FIELD) { |
| error(node, MessageKind.NOT_A_FIELD, [name]); |
| @@ -1960,7 +1978,7 @@ class SignatureResolver extends CommonResolverVisitor<Element> { |
| } |
| Element variables = new VariableListElement.node(currentDefinitions, |
| ElementKind.VARIABLE_LIST, enclosingElement); |
| - element = new FieldParameterElement(node.selector.asIdentifier().source, |
| + element = new FieldParameterElement(name, |
| fieldElement, variables, enclosingElement, node); |
| } |
| return element; |