| 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 |