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 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
164 DartType _inferExpression( | 164 DartType _inferExpression( |
165 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 165 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
166 typeNeeded = | 166 typeNeeded = |
167 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded; | 167 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded; |
168 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; | 168 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; |
169 inferrer.listener.boolLiteralExit(this, inferredType); | 169 inferrer.listener.boolLiteralExit(this, inferredType); |
170 return inferredType; | 170 return inferredType; |
171 } | 171 } |
172 } | 172 } |
173 | 173 |
| 174 /// Concrete shadow object representing a break or continue statement in kernel |
| 175 /// form. |
| 176 class KernelBreakStatement extends BreakStatement implements KernelStatement { |
| 177 KernelBreakStatement(LabeledStatement target) : super(target); |
| 178 |
| 179 @override |
| 180 void _inferStatement(KernelTypeInferrer inferrer) { |
| 181 inferrer.listener.breakStatementEnter(this); |
| 182 // No inference needs to be done. |
| 183 inferrer.listener.breakStatementExit(this); |
| 184 } |
| 185 } |
| 186 |
174 /// Concrete shadow object representing a cascade expression. | 187 /// Concrete shadow object representing a cascade expression. |
175 /// | 188 /// |
176 /// A cascade expression of the form `a..b()..c()` is represented as the kernel | 189 /// A cascade expression of the form `a..b()..c()` is represented as the kernel |
177 /// expression: | 190 /// expression: |
178 /// | 191 /// |
179 /// let v = a in | 192 /// let v = a in |
180 /// let _ = v.b() in | 193 /// let _ = v.b() in |
181 /// let _ = v.c() in | 194 /// let _ = v.c() in |
182 /// v | 195 /// v |
183 /// | 196 /// |
(...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
493 typeNeeded, | 506 typeNeeded, |
494 fileOffset, | 507 fileOffset, |
495 _initialTarget.function.functionType, | 508 _initialTarget.function.functionType, |
496 computeConstructorReturnType(_initialTarget), | 509 computeConstructorReturnType(_initialTarget), |
497 arguments); | 510 arguments); |
498 inferrer.listener.constructorInvocationExit(this, inferredType); | 511 inferrer.listener.constructorInvocationExit(this, inferredType); |
499 return inferredType; | 512 return inferredType; |
500 } | 513 } |
501 } | 514 } |
502 | 515 |
| 516 /// Concrete shadow object representing a continue statement from a switch |
| 517 /// statement, in kernel form. |
| 518 class KernelContinueSwitchStatement extends ContinueSwitchStatement |
| 519 implements KernelStatement { |
| 520 KernelContinueSwitchStatement(SwitchCase target) : super(target); |
| 521 |
| 522 @override |
| 523 void _inferStatement(KernelTypeInferrer inferrer) { |
| 524 inferrer.listener.continueSwitchStatementEnter(this); |
| 525 // No inference needs to be done. |
| 526 inferrer.listener.continueSwitchStatementExit(this); |
| 527 } |
| 528 } |
| 529 |
503 /// Concrete implementation of [DependencyCollector] specialized to work with | 530 /// Concrete implementation of [DependencyCollector] specialized to work with |
504 /// kernel objects. | 531 /// kernel objects. |
505 class KernelDependencyCollector extends DependencyCollectorImpl { | 532 class KernelDependencyCollector extends DependencyCollectorImpl { |
506 @override | 533 @override |
507 void collectDependencies(Expression expression) { | 534 void collectDependencies(Expression expression) { |
508 if (expression is KernelExpression) { | 535 if (expression is KernelExpression) { |
509 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind | 536 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind |
510 // of type inference is correct for this kind of statement. | 537 // of type inference is correct for this kind of statement. |
511 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 538 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
512 // so that the type hierarchy will be simpler (which may speed up "is" | 539 // so that the type hierarchy will be simpler (which may speed up "is" |
(...skipping 1819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2332 } | 2359 } |
2333 | 2360 |
2334 transformChildren(v) { | 2361 transformChildren(v) { |
2335 return internalError("Internal error: Unsupported operation."); | 2362 return internalError("Internal error: Unsupported operation."); |
2336 } | 2363 } |
2337 | 2364 |
2338 visitChildren(v) { | 2365 visitChildren(v) { |
2339 return internalError("Internal error: Unsupported operation."); | 2366 return internalError("Internal error: Unsupported operation."); |
2340 } | 2367 } |
2341 } | 2368 } |
OLD | NEW |