Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Unified Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 2993883002: Implement type inference for named function expressions. (Closed)
Patch Set: Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 e7c14771223e7888abebdbc5479e212dde8e962d..3ed8879b3dab65e4afc4054c8148cdfb3fdcc36c 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
@@ -1334,6 +1334,39 @@ class KernelMethodInvocation extends MethodInvocation
}
}
+/// Concrete shadow object representing a named function expression.
+///
+/// Named function expressions are not legal in Dart, but they are accepted by
+/// the parser and BodyBuilder for error recovery purposes.
+///
+/// A named function expression of the form `f() { ... }` is represented as the
+/// kernel expression:
+///
+/// let f = () { ... } in f
+class KernelNamedFunctionExpression extends Let implements KernelExpression {
+ KernelNamedFunctionExpression(VariableDeclaration variable, Expression body)
+ : super(variable, body);
+
+ @override
+ void _collectDependencies(KernelDependencyCollector collector) {
+ collector.collectDependencies(variable.initializer);
+ }
+
+ @override
+ DartType _inferExpression(
+ KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
+ typeNeeded =
+ inferrer.listener.namedFunctionExpressionEnter(this, typeContext) ||
+ typeNeeded;
+ var inferredType =
+ inferrer.inferExpression(variable.initializer, typeContext, true);
+ if (inferrer.strongMode) variable.type = inferredType;
+ if (!typeNeeded) inferredType = null;
+ inferrer.listener.namedFunctionExpressionExit(this, inferredType);
+ return inferredType;
+ }
+}
+
/// Shadow object for [Not].
class KernelNot extends Not implements KernelExpression {
KernelNot(Expression operand) : super(operand);

Powered by Google App Engine
This is Rietveld 408576698