Index: pkg/compiler/lib/src/resolution/signatures.dart |
diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart |
index ac7b6d847833a9eef77a2036176213907bb5d8ad..58e9177e091aa199f43d04501bd2fb865e2d9bf5 100644 |
--- a/pkg/compiler/lib/src/resolution/signatures.dart |
+++ b/pkg/compiler/lib/src/resolution/signatures.dart |
@@ -93,7 +93,9 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
reporter.internalError(node, 'function type parameters not supported'); |
} |
currentDefinitions = node; |
- FormalElementX element = definition.accept(this); |
+ FormalElementX element = definition == null |
+ ? createUnnamedParameter() // This happens in function types. |
+ : definition.accept(this); |
if (currentDefinitions.metadata != null) { |
element.metadataInternal = |
resolution.resolver.resolveMetadata(element, node); |
@@ -112,7 +114,8 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
void computeParameterType(FormalElementX element, |
[VariableElement fieldElement]) { |
- void computeFunctionType(FunctionExpression functionExpression) { |
+ // Function-type as in `foo(int bar(String x))` |
+ void computeInlineFunctionType(FunctionExpression functionExpression) { |
FunctionSignature functionSignature = SignatureResolver.analyze( |
resolution, |
scope, |
@@ -134,13 +137,14 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
assert(invariant(currentDefinitions, link.tail.isEmpty)); |
if (link.head.asFunctionExpression() != null) { |
// Inline function typed parameter, like `void m(int f(String s))`. |
- computeFunctionType(link.head); |
+ computeInlineFunctionType(link.head); |
} else if (link.head.asSend() != null && |
link.head.asSend().selector.asFunctionExpression() != null) { |
// Inline function typed initializing formal or |
// parameter with default value, like `C(int this.f(String s))` or |
// `void m([int f(String s) = null])`. |
- computeFunctionType(link.head.asSend().selector.asFunctionExpression()); |
+ computeInlineFunctionType( |
+ link.head.asSend().selector.asFunctionExpression()); |
} else { |
assert(invariant(currentDefinitions, |
link.head.asIdentifier() != null || link.head.asSend() != null)); |
@@ -197,6 +201,15 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
return parameter; |
} |
+ FormalElementX createUnnamedParameter() { |
+ FormalElementX parameter; |
+ assert(!createRealParameters); |
+ parameter = new FormalElementX.unnamed( |
+ ElementKind.PARAMETER, enclosingElement, currentDefinitions); |
+ computeParameterType(parameter); |
+ return parameter; |
+ } |
+ |
InitializingFormalElementX createFieldParameter( |
Send node, Expression initializer) { |
InitializingFormalElementX element; |
@@ -426,7 +439,7 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
List<Element> orderedOptionalParameters = |
visitor.optionalParameters.toList(); |
if (visitor.optionalParametersAreNamed) { |
- // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
+ // TODO(karlklose); replace when [visitor.optionalParameters] is a [List]. |
orderedOptionalParameters.sort((Element a, Element b) { |
return a.name.compareTo(b.name); |
}); |
@@ -441,7 +454,7 @@ class SignatureResolver extends MappingVisitor<FormalElementX> { |
namedParameterTypes = |
namedParameterTypesBuilder.toLink().toList(growable: false); |
} else { |
- // TODO(karlklose); replace when [visitor.optinalParameters] is a [List]. |
+ // TODO(karlklose); replace when [visitor.optionalParameters] is a [List]. |
LinkBuilder<ResolutionDartType> optionalParameterTypesBuilder = |
new LinkBuilder<ResolutionDartType>(); |
for (FormalElement parameter in visitor.optionalParameters) { |