OLD | NEW |
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`. |
(...skipping 19 matching lines...) Expand all Loading... |
30 void _inferStatement(KernelTypeInferrer inferrer) { | 30 void _inferStatement(KernelTypeInferrer inferrer) { |
31 // TODO(paulberry): implement. | 31 // TODO(paulberry): implement. |
32 } | 32 } |
33 } | 33 } |
34 | 34 |
35 /// Common base class for shadow objects representing expressions in kernel | 35 /// Common base class for shadow objects representing expressions in kernel |
36 /// form. | 36 /// form. |
37 abstract class KernelExpression implements Expression { | 37 abstract class KernelExpression implements Expression { |
38 /// Calls back to [inferrer] to perform type inference for whatever concrete | 38 /// Calls back to [inferrer] to perform type inference for whatever concrete |
39 /// type of [KernelExpression] this is. | 39 /// type of [KernelExpression] this is. |
40 DartType _inferExpression(DartType typeContext, bool typeNeeded); | 40 DartType _inferExpression( |
| 41 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); |
41 } | 42 } |
42 | 43 |
43 /// Concrete shadow object representing a function expression in kernel form. | 44 /// Concrete shadow object representing a function expression in kernel form. |
44 class KernelFunctionExpression extends FunctionExpression | 45 class KernelFunctionExpression extends FunctionExpression |
45 implements KernelExpression { | 46 implements KernelExpression { |
46 KernelFunctionExpression(FunctionNode function) : super(function); | 47 KernelFunctionExpression(FunctionNode function) : super(function); |
47 | 48 |
48 @override | 49 @override |
49 DartType _inferExpression(DartType typeContext, bool typeNeeded) { | 50 DartType _inferExpression( |
| 51 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
50 // TODO(paulberry): implement. | 52 // TODO(paulberry): implement. |
51 return typeNeeded ? const DynamicType() : null; | 53 return typeNeeded ? const DynamicType() : null; |
52 } | 54 } |
53 } | 55 } |
54 | 56 |
55 /// Concrete shadow object representing an integer literal in kernel form. | 57 /// Concrete shadow object representing an integer literal in kernel form. |
56 class KernelIntLiteral extends IntLiteral implements KernelExpression { | 58 class KernelIntLiteral extends IntLiteral implements KernelExpression { |
57 KernelIntLiteral(int value) : super(value); | 59 KernelIntLiteral(int value) : super(value); |
58 | 60 |
59 @override | 61 @override |
60 DartType _inferExpression(DartType typeContext, bool typeNeeded) { | 62 DartType _inferExpression( |
| 63 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
61 // TODO(paulberry): implement. | 64 // TODO(paulberry): implement. |
62 return typeNeeded ? const DynamicType() : null; | 65 return typeNeeded ? const DynamicType() : null; |
63 } | 66 } |
64 } | 67 } |
65 | 68 |
66 /// Concrete shadow object representing a list literal in kernel form. | 69 /// Concrete shadow object representing a list literal in kernel form. |
67 class KernelListLiteral extends ListLiteral implements KernelExpression { | 70 class KernelListLiteral extends ListLiteral implements KernelExpression { |
68 KernelListLiteral(List<KernelExpression> expressions, | 71 KernelListLiteral(List<KernelExpression> expressions, |
69 {DartType typeArgument, bool isConst: false}) | 72 {DartType typeArgument, bool isConst: false}) |
70 : super(expressions, typeArgument: typeArgument, isConst: isConst); | 73 : super(expressions, typeArgument: typeArgument, isConst: isConst); |
71 | 74 |
72 @override | 75 @override |
73 DartType _inferExpression(DartType typeContext, bool typeNeeded) { | 76 DartType _inferExpression( |
| 77 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
74 // TODO(paulberry): implement. | 78 // TODO(paulberry): implement. |
75 return typeNeeded ? const DynamicType() : null; | 79 return typeNeeded ? const DynamicType() : null; |
76 } | 80 } |
77 } | 81 } |
78 | 82 |
79 /// Concrete shadow object representing a null literal in kernel form. | 83 /// Concrete shadow object representing a null literal in kernel form. |
80 class KernelNullLiteral extends NullLiteral implements KernelExpression { | 84 class KernelNullLiteral extends NullLiteral implements KernelExpression { |
81 @override | 85 @override |
82 DartType _inferExpression(DartType typeContext, bool typeNeeded) { | 86 DartType _inferExpression( |
| 87 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
83 // TODO(paulberry): implement. | 88 // TODO(paulberry): implement. |
84 return typeNeeded ? const DynamicType() : null; | 89 return typeNeeded ? const DynamicType() : null; |
85 } | 90 } |
86 } | 91 } |
87 | 92 |
88 /// Concrete shadow object representing a return statement in kernel form. | 93 /// Concrete shadow object representing a return statement in kernel form. |
89 class KernelReturnStatement extends ReturnStatement implements KernelStatement { | 94 class KernelReturnStatement extends ReturnStatement implements KernelStatement { |
90 KernelReturnStatement([KernelExpression expression]) : super(expression); | 95 KernelReturnStatement([KernelExpression expression]) : super(expression); |
91 | 96 |
92 @override | 97 @override |
(...skipping 19 matching lines...) Expand all Loading... |
112 | 117 |
113 @override | 118 @override |
114 DartType inferExpression( | 119 DartType inferExpression( |
115 Expression expression, DartType typeContext, bool typeNeeded) { | 120 Expression expression, DartType typeContext, bool typeNeeded) { |
116 if (expression is KernelExpression) { | 121 if (expression is KernelExpression) { |
117 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind | 122 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind |
118 // of type inference is correct for this kind of statement. | 123 // of type inference is correct for this kind of statement. |
119 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 124 // 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" | 125 // so that the type hierarchy will be simpler (which may speed up "is" |
121 // checks). | 126 // checks). |
122 return expression._inferExpression(typeContext, typeNeeded); | 127 return expression._inferExpression(this, typeContext, typeNeeded); |
123 } else { | 128 } else { |
124 // Encountered an expression type for which type inference is not yet | 129 // Encountered an expression type for which type inference is not yet |
125 // implemented, so just infer dynamic for now. | 130 // implemented, so just infer dynamic for now. |
126 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 131 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
127 // everything, this case should no longer be needed. | 132 // everything, this case should no longer be needed. |
128 return typeNeeded ? const DynamicType() : null; | 133 return typeNeeded ? const DynamicType() : null; |
129 } | 134 } |
130 } | 135 } |
131 | 136 |
132 @override | 137 @override |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 // TODO(paulberry): implement. | 171 // TODO(paulberry): implement. |
167 } | 172 } |
168 } | 173 } |
169 | 174 |
170 /// Concrete shadow object representing a read from a variable in kernel form. | 175 /// Concrete shadow object representing a read from a variable in kernel form. |
171 class KernelVariableGet extends VariableGet implements KernelExpression { | 176 class KernelVariableGet extends VariableGet implements KernelExpression { |
172 KernelVariableGet(VariableDeclaration variable, [DartType promotedType]) | 177 KernelVariableGet(VariableDeclaration variable, [DartType promotedType]) |
173 : super(variable, promotedType); | 178 : super(variable, promotedType); |
174 | 179 |
175 @override | 180 @override |
176 DartType _inferExpression(DartType typeContext, bool typeNeeded) { | 181 DartType _inferExpression( |
| 182 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
177 // TODO(paulberry): implement. | 183 // TODO(paulberry): implement. |
178 return typeNeeded ? const DynamicType() : null; | 184 return typeNeeded ? const DynamicType() : null; |
179 } | 185 } |
180 } | 186 } |
OLD | NEW |