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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// This file declares a "shadow hierarchy" of concrete classes which extend 5 /// This file declares a "shadow hierarchy" of concrete classes which extend
6 /// the kernel class hierarchy, adding methods and fields needed by the 6 /// the kernel class hierarchy, adding methods and fields needed by the
7 /// BodyBuilder. 7 /// BodyBuilder.
8 /// 8 ///
9 /// Instances of these classes may be created using the factory methods in 9 /// Instances of these classes may be created using the factory methods in
10 /// `ast_factory.dart`. 10 /// `ast_factory.dart`.
11 /// 11 ///
12 /// Note that these classes represent the Dart language prior to desugaring. 12 /// Note that these classes represent the Dart language prior to desugaring.
13 /// When a single Dart construct desugars to a tree containing multiple kernel 13 /// When a single Dart construct desugars to a tree containing multiple kernel
14 /// AST nodes, the shadow class extends the kernel object at the top of the 14 /// AST nodes, the shadow class extends the kernel object at the top of the
15 /// desugared tree. 15 /// desugared tree.
16 /// 16 ///
17 /// This means that in some cases multiple shadow classes may extend the same 17 /// This means that in some cases multiple shadow classes may extend the same
18 /// kernel class, because multiple constructs in Dart may desugar to a tree 18 /// kernel class, because multiple constructs in Dart may desugar to a tree
19 /// with the same kind of root node. 19 /// with the same kind of root node.
20 import 'package:front_end/src/fasta/type_inference/type_inferrer.dart';
ahe 2017/04/18 15:49:59 Relative?
20 import 'package:kernel/ast.dart'; 21 import 'package:kernel/ast.dart';
22 import 'package:kernel/class_hierarchy.dart';
23 import 'package:kernel/core_types.dart';
21 24
22 /// Concrete shadow object representing a statement block in kernel form. 25 /// Concrete shadow object representing a statement block in kernel form.
23 class KernelBlock extends Block implements KernelStatement { 26 class KernelBlock extends Block implements KernelStatement {
24 KernelBlock(List<KernelStatement> statements) : super(statements); 27 KernelBlock(List<KernelStatement> statements) : super(statements);
28
29 @override
30 void _inferStatement(KernelTypeInferrer inferrer) {
31 // TODO(paulberry): implement.
32 }
25 } 33 }
26 34
27 /// Common base class for shadow objects representing expressions in kernel 35 /// Common base class for shadow objects representing expressions in kernel
28 /// form. 36 /// form.
29 abstract class KernelExpression implements Expression {} 37 abstract class KernelExpression implements Expression {
38 /// 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:
39 /// type of [KernelExpression] this is.
40 DartType _inferExpression(DartType typeContext, bool typeNeeded);
41 }
30 42
31 /// Concrete shadow object representing a function expression in kernel form. 43 /// Concrete shadow object representing a function expression in kernel form.
32 class KernelFunctionExpression extends FunctionExpression 44 class KernelFunctionExpression extends FunctionExpression
33 implements KernelExpression { 45 implements KernelExpression {
34 KernelFunctionExpression(FunctionNode function) : super(function); 46 KernelFunctionExpression(FunctionNode function) : super(function);
47
48 @override
49 DartType _inferExpression(DartType typeContext, bool typeNeeded) {
50 // TODO(paulberry): implement.
51 return typeNeeded ? const DynamicType() : null;
52 }
35 } 53 }
36 54
37 /// Concrete shadow object representing an integer literal in kernel form. 55 /// Concrete shadow object representing an integer literal in kernel form.
38 class KernelIntLiteral extends IntLiteral implements KernelExpression { 56 class KernelIntLiteral extends IntLiteral implements KernelExpression {
39 KernelIntLiteral(int value) : super(value); 57 KernelIntLiteral(int value) : super(value);
58
59 @override
60 DartType _inferExpression(DartType typeContext, bool typeNeeded) {
61 // TODO(paulberry): implement.
62 return typeNeeded ? const DynamicType() : null;
63 }
40 } 64 }
41 65
42 /// Concrete shadow object representing a list literal in kernel form. 66 /// Concrete shadow object representing a list literal in kernel form.
43 class KernelListLiteral extends ListLiteral implements KernelExpression { 67 class KernelListLiteral extends ListLiteral implements KernelExpression {
44 KernelListLiteral(List<KernelExpression> expressions, 68 KernelListLiteral(List<KernelExpression> expressions,
45 {DartType typeArgument, bool isConst: false}) 69 {DartType typeArgument, bool isConst: false})
46 : super(expressions, typeArgument: typeArgument, isConst: isConst); 70 : super(expressions, typeArgument: typeArgument, isConst: isConst);
71
72 @override
73 DartType _inferExpression(DartType typeContext, bool typeNeeded) {
74 // TODO(paulberry): implement.
75 return typeNeeded ? const DynamicType() : null;
76 }
47 } 77 }
48 78
49 /// Concrete shadow object representing a null literal in kernel form. 79 /// Concrete shadow object representing a null literal in kernel form.
50 class KernelNullLiteral extends NullLiteral implements KernelExpression {} 80 class KernelNullLiteral extends NullLiteral implements KernelExpression {
81 @override
82 DartType _inferExpression(DartType typeContext, bool typeNeeded) {
83 // TODO(paulberry): implement.
84 return typeNeeded ? const DynamicType() : null;
85 }
86 }
51 87
52 /// Concrete shadow object representing a return statement in kernel form. 88 /// Concrete shadow object representing a return statement in kernel form.
53 class KernelReturnStatement extends ReturnStatement implements KernelStatement { 89 class KernelReturnStatement extends ReturnStatement implements KernelStatement {
54 KernelReturnStatement([KernelExpression expression]) : super(expression); 90 KernelReturnStatement([KernelExpression expression]) : super(expression);
91
92 @override
93 void _inferStatement(KernelTypeInferrer inferrer) {
94 // TODO(paulberry): implement.
95 }
55 } 96 }
56 97
57 /// Common base class for shadow objects representing statements in kernel 98 /// Common base class for shadow objects representing statements in kernel
58 /// form. 99 /// form.
59 abstract class KernelStatement extends Statement {} 100 abstract class KernelStatement extends Statement {
101 /// Calls back to [inferrer] to perform type inference for whatever concrete
102 /// type of [KernelStatement] this is.
103 void _inferStatement(KernelTypeInferrer inferrer);
104 }
105
106 /// Concrete implementation of [TypeInferrer] specialized to work with kernel
107 /// objects.
108 class KernelTypeInferrer extends TypeInferrer<Statement, Expression,
109 KernelVariableDeclaration, Field> {
110 KernelTypeInferrer(CoreTypes coreTypes, ClassHierarchy classHierarchy)
111 : super(coreTypes, classHierarchy);
112
113 @override
114 DartType inferExpression(
115 Expression expression, DartType typeContext, bool typeNeeded) {
116 if (expression is KernelExpression) {
117 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind
118 // of type inference is correct for this kind of statement.
119 // TODO(paulberry): experiment to see if dynamic dispatch would be better,
120 // so that the type hierarchy will be simpler (which may speed up "is"
121 // checks).
122 return expression._inferExpression(typeContext, typeNeeded);
123 } else {
124 // Encountered an expression type for which type inference is not yet
125 // implemented, so just infer dynamic for now.
126 // TODO(paulberry): once the BodyBuilder uses shadow classes for
127 // everything, this case should no longer be needed.
128 return typeNeeded ? const DynamicType() : null;
129 }
130 }
131
132 @override
133 void inferStatement(Statement statement) {
134 if (statement is KernelStatement) {
135 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind
136 // of type inference is correct for this kind of statement.
137 // TODO(paulberry): experiment to see if dynamic dispatch would be better,
138 // so that the type hierarchy will be simpler (which may speed up "is"
139 // checks).
140 return statement._inferStatement(this);
141 } else {
142 // Encountered a statement type for which type inference is not yet
143 // implemented, so just skip it for now.
144 // TODO(paulberry): once the BodyBuilder uses shadow classes for
145 // everything, this case should no longer be needed.
146 }
147 }
148 }
60 149
61 /// Concrete shadow object representing a variable declaration in kernel form. 150 /// Concrete shadow object representing a variable declaration in kernel form.
62 class KernelVariableDeclaration extends VariableDeclaration 151 class KernelVariableDeclaration extends VariableDeclaration
63 implements KernelStatement { 152 implements KernelStatement {
64 KernelVariableDeclaration(String name, 153 KernelVariableDeclaration(String name,
65 {KernelExpression initializer, 154 {KernelExpression initializer,
66 DartType type, 155 DartType type,
67 bool isFinal: false, 156 bool isFinal: false,
68 bool isConst: false}) 157 bool isConst: false})
69 : super(name, 158 : super(name,
70 initializer: initializer, 159 initializer: initializer,
71 type: type, 160 type: type,
72 isFinal: isFinal, 161 isFinal: isFinal,
73 isConst: isConst); 162 isConst: isConst);
163
164 @override
165 void _inferStatement(KernelTypeInferrer inferrer) {
166 // TODO(paulberry): implement.
167 }
74 } 168 }
75 169
76 /// Concrete shadow object representing a read from a variable in kernel form. 170 /// Concrete shadow object representing a read from a variable in kernel form.
77 class KernelVariableGet extends VariableGet implements KernelExpression { 171 class KernelVariableGet extends VariableGet implements KernelExpression {
78 KernelVariableGet(VariableDeclaration variable, [DartType promotedType]) 172 KernelVariableGet(VariableDeclaration variable, [DartType promotedType])
79 : super(variable, promotedType); 173 : super(variable, promotedType);
174
175 @override
176 DartType _inferExpression(DartType typeContext, bool typeNeeded) {
177 // TODO(paulberry): implement.
178 return typeNeeded ? const DynamicType() : null;
179 }
80 } 180 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698