Index: lib/compiler/implementation/resolver.dart |
diff --git a/lib/compiler/implementation/resolver.dart b/lib/compiler/implementation/resolver.dart |
index 284387ffcc078d670f8a98e353c2c67fb0dd3c89..51b51a14cbdb7cb29489fd500cf47a77f8a608b3 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) { |
+ visitor.visit(body); |
+ } |
+ |
void resolveConstructorImplementation(FunctionElement constructor, |
FunctionExpression node) { |
if (constructor.defaultImplementation !== constructor) return; |
@@ -1947,11 +1951,22 @@ 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; |
kasperl
2012/07/06 12:40:41
Would it make sense to factor this code (the compu
Johnni Winther
2012/07/09 14:57:18
For clarity only. I don't think the computation is
|
+ var identifier = node.selector.asIdentifier(); |
+ if (identifier !== null) { |
+ // Normal parameter: [:Type name:]. |
+ name = identifier.source; |
+ } else { |
+ // Function type parameter: [:void name(Type arg):]. |
+ var functionExpression = node.selector.asFunctionExpression(); |
+ if (functionExpression !== null && |
+ functionExpression.name.asIdentifier() !== null) { |
+ name = functionExpression.name.asIdentifier().source; |
+ } else { |
+ cancel(node, |
+ 'internal error: unimplemented receiver on parameter send'); |
+ } |
} |
- SourceString name = node.selector.asIdentifier().source; |
Element fieldElement = currentClass.lookupLocalMember(name); |
if (fieldElement === null || fieldElement.kind !== ElementKind.FIELD) { |
error(node, MessageKind.NOT_A_FIELD, [name]); |
@@ -1960,7 +1975,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; |