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

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

Issue 2823243002: Introduce initial plumbing for type inference in fasta. (Closed)
Patch Set: Created 3 years, 8 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 8f05a215a28aa2a1992ccb27dd85847a5df730a4..31c6f8c16ce37d0d3c3bc29b4143579f92a5ceb9 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
@@ -17,26 +17,50 @@
/// This means that in some cases multiple shadow classes may extend the same
/// kernel class, because multiple constructs in Dart may desugar to a tree
/// with the same kind of root node.
+import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
ahe 2017/04/18 15:49:59 Relative?
import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/core_types.dart';
/// Concrete shadow object representing a statement block in kernel form.
class KernelBlock extends Block implements KernelStatement {
KernelBlock(List<KernelStatement> statements) : super(statements);
+
+ @override
+ void _inferStatement(KernelTypeInferrer inferrer) {
+ // TODO(paulberry): implement.
+ }
}
/// Common base class for shadow objects representing expressions in kernel
/// form.
-abstract class KernelExpression implements Expression {}
+abstract class KernelExpression implements Expression {
+ /// Calls back to [inferrer] to perform type inference for whatever concrete
scheglov 2017/04/18 20:09:48 The reference [inferrer] is not resolved here.
Paul Berry 2017/04/18 22:49:13 Good catch, thanks. I meant the signature to be:
+ /// type of [KernelExpression] this is.
+ DartType _inferExpression(DartType typeContext, bool typeNeeded);
+}
/// Concrete shadow object representing a function expression in kernel form.
class KernelFunctionExpression extends FunctionExpression
implements KernelExpression {
KernelFunctionExpression(FunctionNode function) : super(function);
+
+ @override
+ DartType _inferExpression(DartType typeContext, bool typeNeeded) {
+ // TODO(paulberry): implement.
+ return typeNeeded ? const DynamicType() : null;
+ }
}
/// Concrete shadow object representing an integer literal in kernel form.
class KernelIntLiteral extends IntLiteral implements KernelExpression {
KernelIntLiteral(int value) : super(value);
+
+ @override
+ DartType _inferExpression(DartType typeContext, bool typeNeeded) {
+ // TODO(paulberry): implement.
+ return typeNeeded ? const DynamicType() : null;
+ }
}
/// Concrete shadow object representing a list literal in kernel form.
@@ -44,19 +68,84 @@ class KernelListLiteral extends ListLiteral implements KernelExpression {
KernelListLiteral(List<KernelExpression> expressions,
{DartType typeArgument, bool isConst: false})
: super(expressions, typeArgument: typeArgument, isConst: isConst);
+
+ @override
+ DartType _inferExpression(DartType typeContext, bool typeNeeded) {
+ // TODO(paulberry): implement.
+ return typeNeeded ? const DynamicType() : null;
+ }
}
/// Concrete shadow object representing a null literal in kernel form.
-class KernelNullLiteral extends NullLiteral implements KernelExpression {}
+class KernelNullLiteral extends NullLiteral implements KernelExpression {
+ @override
+ DartType _inferExpression(DartType typeContext, bool typeNeeded) {
+ // TODO(paulberry): implement.
+ return typeNeeded ? const DynamicType() : null;
+ }
+}
/// Concrete shadow object representing a return statement in kernel form.
class KernelReturnStatement extends ReturnStatement implements KernelStatement {
KernelReturnStatement([KernelExpression expression]) : super(expression);
+
+ @override
+ void _inferStatement(KernelTypeInferrer inferrer) {
+ // TODO(paulberry): implement.
+ }
}
/// Common base class for shadow objects representing statements in kernel
/// form.
-abstract class KernelStatement extends Statement {}
+abstract class KernelStatement extends Statement {
+ /// Calls back to [inferrer] to perform type inference for whatever concrete
+ /// type of [KernelStatement] this is.
+ void _inferStatement(KernelTypeInferrer inferrer);
+}
+
+/// Concrete implementation of [TypeInferrer] specialized to work with kernel
+/// objects.
+class KernelTypeInferrer extends TypeInferrer<Statement, Expression,
+ KernelVariableDeclaration, Field> {
+ KernelTypeInferrer(CoreTypes coreTypes, ClassHierarchy classHierarchy)
+ : super(coreTypes, classHierarchy);
+
+ @override
+ DartType inferExpression(
+ Expression expression, DartType typeContext, bool typeNeeded) {
+ if (expression is KernelExpression) {
+ // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
+ // of type inference is correct for this kind of statement.
+ // TODO(paulberry): experiment to see if dynamic dispatch would be better,
+ // so that the type hierarchy will be simpler (which may speed up "is"
+ // checks).
+ return expression._inferExpression(typeContext, typeNeeded);
+ } else {
+ // Encountered an expression type for which type inference is not yet
+ // implemented, so just infer dynamic for now.
+ // TODO(paulberry): once the BodyBuilder uses shadow classes for
+ // everything, this case should no longer be needed.
+ return typeNeeded ? const DynamicType() : null;
+ }
+ }
+
+ @override
+ void inferStatement(Statement statement) {
+ if (statement is KernelStatement) {
+ // Use polymorphic dispatch on [KernelStatement] to perform whatever kind
+ // of type inference is correct for this kind of statement.
+ // TODO(paulberry): experiment to see if dynamic dispatch would be better,
+ // so that the type hierarchy will be simpler (which may speed up "is"
+ // checks).
+ return statement._inferStatement(this);
+ } else {
+ // Encountered a statement type for which type inference is not yet
+ // implemented, so just skip it for now.
+ // TODO(paulberry): once the BodyBuilder uses shadow classes for
+ // everything, this case should no longer be needed.
+ }
+ }
+}
/// Concrete shadow object representing a variable declaration in kernel form.
class KernelVariableDeclaration extends VariableDeclaration
@@ -71,10 +160,21 @@ class KernelVariableDeclaration extends VariableDeclaration
type: type,
isFinal: isFinal,
isConst: isConst);
+
+ @override
+ void _inferStatement(KernelTypeInferrer inferrer) {
+ // TODO(paulberry): implement.
+ }
}
/// Concrete shadow object representing a read from a variable in kernel form.
class KernelVariableGet extends VariableGet implements KernelExpression {
KernelVariableGet(VariableDeclaration variable, [DartType promotedType])
: super(variable, promotedType);
+
+ @override
+ DartType _inferExpression(DartType typeContext, bool typeNeeded) {
+ // TODO(paulberry): implement.
+ return typeNeeded ? const DynamicType() : null;
+ }
}

Powered by Google App Engine
This is Rietveld 408576698