Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart |
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart |
index ffe3b5e2476fe564f8ab1cfb27b2222635cf9ed6..fd76bd70f3f49cfb08fe0cac6e6511787dcb62bb 100644 |
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart |
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart |
@@ -572,6 +572,16 @@ class KernelFunctionDeclaration extends FunctionDeclaration |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
inferrer.listener.functionDeclarationEnter(this); |
+ for (var parameter in function.positionalParameters) { |
+ if (parameter.initializer != null) { |
+ inferrer.inferExpression(parameter.initializer, parameter.type, false); |
+ } |
+ } |
+ for (var parameter in function.namedParameters) { |
+ if (parameter.initializer != null) { |
+ inferrer.inferExpression(parameter.initializer, parameter.type, false); |
+ } |
+ } |
var oldClosureContext = inferrer.closureContext; |
inferrer.closureContext = |
new ClosureContext(inferrer, function.asyncMarker, function.returnType); |
@@ -613,7 +623,21 @@ class KernelFunctionExpression extends FunctionExpression |
KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
typeNeeded = inferrer.listener.functionExpressionEnter(this, typeContext) || |
typeNeeded; |
- // TODO(paulberry): do we also need to visit default parameter values? |
+ |
+ if (!inferrer.isTopLevel) { |
+ for (var parameter in function.positionalParameters) { |
+ if (parameter.initializer != null) { |
+ inferrer.inferExpression( |
+ parameter.initializer, parameter.type, false); |
+ } |
+ } |
+ for (var parameter in function.namedParameters) { |
+ if (parameter.initializer != null) { |
+ inferrer.inferExpression( |
+ parameter.initializer, parameter.type, false); |
+ } |
+ } |
+ } |
// Let `<T0, ..., Tn>` be the set of type parameters of the closure (with |
// `n`=0 if there are no type parameters). |