| 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) {
|
| + 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;
|
|
|