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 d959c7e4ed10ba9370ee392a740c7d0b73ded450..962392eb9364ce30f6a4d667f0fdd7b73200bb33 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 |
@@ -90,9 +90,11 @@ class KernelBlock extends Block implements KernelStatement { |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.blockEnter(this); |
for (var statement in statements) { |
inferrer.inferStatement(statement); |
} |
+ inferrer.listener.blockExit(this); |
} |
} |
@@ -259,7 +261,9 @@ class KernelExpressionStatement extends ExpressionStatement |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.expressionStatementEnter(this); |
inferrer.inferExpression(expression, null, false); |
+ inferrer.listener.expressionStatementExit(this); |
} |
} |
@@ -304,10 +308,12 @@ class KernelFunctionDeclaration extends FunctionDeclaration |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.functionDeclarationEnter(this); |
var oldClosureContext = inferrer.closureContext; |
inferrer.closureContext = null; |
inferrer.inferStatement(function.body); |
inferrer.closureContext = oldClosureContext; |
+ inferrer.listener.functionDeclarationExit(this); |
} |
} |
@@ -489,10 +495,12 @@ class KernelIfStatement extends IfStatement implements KernelStatement { |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.ifStatementEnter(this); |
inferrer.inferExpression( |
condition, inferrer.coreTypes.boolClass.rawType, false); |
inferrer.inferStatement(then); |
if (otherwise != null) inferrer.inferStatement(otherwise); |
+ inferrer.listener.ifStatementExit(this); |
} |
} |
@@ -762,6 +770,7 @@ class KernelReturnStatement extends ReturnStatement implements KernelStatement { |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.returnStatementEnter(this); |
var closureContext = inferrer.closureContext; |
var typeContext = closureContext != null && !closureContext.isGenerator |
? closureContext.returnContext |
@@ -770,13 +779,13 @@ class KernelReturnStatement extends ReturnStatement implements KernelStatement { |
? inferrer.inferExpression( |
expression, typeContext, closureContext != null) |
: const VoidType(); |
- if (expression == null) { |
- // Analyzer treats bare `return` statements as having no effect on the |
- // inferred type of the closure. TODO(paulberry): is this what we want |
- // for Fasta? |
- return; |
+ // Analyzer treats bare `return` statements as having no effect on the |
+ // inferred type of the closure. TODO(paulberry): is this what we want |
+ // for Fasta? |
+ if (expression != null) { |
+ closureContext?.updateInferredReturnType(inferrer, inferredType); |
} |
- closureContext?.updateInferredReturnType(inferrer, inferredType); |
+ inferrer.listener.returnStatementExit(this); |
} |
} |
@@ -1229,15 +1238,18 @@ class KernelVariableDeclaration extends VariableDeclaration |
@override |
void _inferStatement(KernelTypeInferrer inferrer) { |
+ inferrer.listener.variableDeclarationEnter(this); |
var declaredType = _implicitlyTyped ? null : type; |
- if (initializer == null) return; |
- var inferredType = inferrer.inferDeclarationType( |
- inferrer.inferExpression(initializer, declaredType, _implicitlyTyped)); |
- if (inferrer.strongMode && _implicitlyTyped) { |
- inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
- 'type', new InstrumentationValueForType(inferredType)); |
- type = inferredType; |
+ if (initializer != null) { |
+ var inferredType = inferrer.inferDeclarationType(inferrer.inferExpression( |
+ initializer, declaredType, _implicitlyTyped)); |
+ if (inferrer.strongMode && _implicitlyTyped) { |
+ inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
+ 'type', new InstrumentationValueForType(inferredType)); |
+ type = inferredType; |
+ } |
} |
+ inferrer.listener.variableDeclarationExit(this); |
} |
/// Determine whether the given [KernelVariableDeclaration] had an implicit |