| 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 24 matching lines...) Expand all Loading... |
| 35 /// Computes the return type of a (possibly factory) constructor. | 35 /// Computes the return type of a (possibly factory) constructor. |
| 36 InterfaceType computeConstructorReturnType(Member constructor) { | 36 InterfaceType computeConstructorReturnType(Member constructor) { |
| 37 if (constructor is Constructor) { | 37 if (constructor is Constructor) { |
| 38 return constructor.enclosingClass.thisType; | 38 return constructor.enclosingClass.thisType; |
| 39 } else { | 39 } else { |
| 40 return constructor.function.returnType; | 40 return constructor.function.returnType; |
| 41 } | 41 } |
| 42 } | 42 } |
| 43 | 43 |
| 44 List<DartType> getExplicitTypeArguments(Arguments arguments) { | 44 List<DartType> getExplicitTypeArguments(Arguments arguments) { |
| 45 if (arguments is KernelArguments) { | 45 if (arguments is ShadowArguments) { |
| 46 return arguments._hasExplicitTypeArguments ? arguments.types : null; | 46 return arguments._hasExplicitTypeArguments ? arguments.types : null; |
| 47 } else { | 47 } else { |
| 48 // This code path should only be taken in situations where there are no | 48 // This code path should only be taken in situations where there are no |
| 49 // type arguments at all, e.g. calling a user-definable operator. | 49 // type arguments at all, e.g. calling a user-definable operator. |
| 50 assert(arguments.types.isEmpty); | 50 assert(arguments.types.isEmpty); |
| 51 return null; | 51 return null; |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 /// Concrete shadow object representing a set of invocation arguments. | 55 /// Concrete shadow object representing a set of invocation arguments. |
| 56 class KernelArguments extends Arguments { | 56 class ShadowArguments extends Arguments { |
| 57 bool _hasExplicitTypeArguments; | 57 bool _hasExplicitTypeArguments; |
| 58 | 58 |
| 59 KernelArguments(List<Expression> positional, | 59 ShadowArguments(List<Expression> positional, |
| 60 {List<DartType> types, List<NamedExpression> named}) | 60 {List<DartType> types, List<NamedExpression> named}) |
| 61 : _hasExplicitTypeArguments = types != null && types.isNotEmpty, | 61 : _hasExplicitTypeArguments = types != null && types.isNotEmpty, |
| 62 super(positional, types: types, named: named); | 62 super(positional, types: types, named: named); |
| 63 | 63 |
| 64 static void setExplicitArgumentTypes( | 64 static void setExplicitArgumentTypes( |
| 65 KernelArguments arguments, List<DartType> types) { | 65 ShadowArguments arguments, List<DartType> types) { |
| 66 arguments.types.clear(); | 66 arguments.types.clear(); |
| 67 arguments.types.addAll(types); | 67 arguments.types.addAll(types); |
| 68 arguments._hasExplicitTypeArguments = true; | 68 arguments._hasExplicitTypeArguments = true; |
| 69 } | 69 } |
| 70 } | 70 } |
| 71 | 71 |
| 72 /// Shadow object for [AsExpression]. | 72 /// Shadow object for [AsExpression]. |
| 73 class KernelAsExpression extends AsExpression implements KernelExpression { | 73 class ShadowAsExpression extends AsExpression implements ShadowExpression { |
| 74 KernelAsExpression(Expression operand, DartType type) : super(operand, type); | 74 ShadowAsExpression(Expression operand, DartType type) : super(operand, type); |
| 75 | 75 |
| 76 @override | 76 @override |
| 77 void _collectDependencies(KernelDependencyCollector collector) { | 77 void _collectDependencies(ShadowDependencyCollector collector) { |
| 78 // No inference dependencies. | 78 // No inference dependencies. |
| 79 } | 79 } |
| 80 | 80 |
| 81 @override | 81 @override |
| 82 DartType _inferExpression( | 82 DartType _inferExpression( |
| 83 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 83 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 84 typeNeeded = | 84 typeNeeded = |
| 85 inferrer.listener.asExpressionEnter(this, typeContext) || typeNeeded; | 85 inferrer.listener.asExpressionEnter(this, typeContext) || typeNeeded; |
| 86 inferrer.inferExpression(operand, null, false); | 86 inferrer.inferExpression(operand, null, false); |
| 87 var inferredType = typeNeeded ? type : null; | 87 var inferredType = typeNeeded ? type : null; |
| 88 inferrer.listener.asExpressionExit(this, inferredType); | 88 inferrer.listener.asExpressionExit(this, inferredType); |
| 89 return inferredType; | 89 return inferredType; |
| 90 } | 90 } |
| 91 } | 91 } |
| 92 | 92 |
| 93 /// Concrete shadow object representing an assert initializer in kernel form. | 93 /// Concrete shadow object representing an assert initializer in kernel form. |
| 94 class KernelAssertInitializer extends LocalInitializer | 94 class ShadowAssertInitializer extends LocalInitializer |
| 95 implements KernelInitializer { | 95 implements ShadowInitializer { |
| 96 /// The assert statement performing the check | 96 /// The assert statement performing the check |
| 97 AssertStatement _statement; | 97 AssertStatement _statement; |
| 98 | 98 |
| 99 KernelAssertInitializer(VariableDeclaration variable, this._statement) | 99 ShadowAssertInitializer(VariableDeclaration variable, this._statement) |
| 100 : super(variable); | 100 : super(variable); |
| 101 | 101 |
| 102 @override | 102 @override |
| 103 void _inferInitializer(KernelTypeInferrer inferrer) { | 103 void _inferInitializer(ShadowTypeInferrer inferrer) { |
| 104 inferrer.listener.assertInitializerEnter(this); | 104 inferrer.listener.assertInitializerEnter(this); |
| 105 inferrer.inferStatement(_statement); | 105 inferrer.inferStatement(_statement); |
| 106 inferrer.listener.assertInitializerExit(this); | 106 inferrer.listener.assertInitializerExit(this); |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 | 109 |
| 110 /// Concrete shadow object representing an assertion statement in kernel form. | 110 /// Concrete shadow object representing an assertion statement in kernel form. |
| 111 class KernelAssertStatement extends AssertStatement implements KernelStatement { | 111 class ShadowAssertStatement extends AssertStatement implements ShadowStatement { |
| 112 KernelAssertStatement(Expression condition, | 112 ShadowAssertStatement(Expression condition, |
| 113 {Expression message, int conditionStartOffset, int conditionEndOffset}) | 113 {Expression message, int conditionStartOffset, int conditionEndOffset}) |
| 114 : super(condition, | 114 : super(condition, |
| 115 message: message, | 115 message: message, |
| 116 conditionStartOffset: conditionStartOffset, | 116 conditionStartOffset: conditionStartOffset, |
| 117 conditionEndOffset: conditionEndOffset); | 117 conditionEndOffset: conditionEndOffset); |
| 118 | 118 |
| 119 @override | 119 @override |
| 120 void _inferStatement(KernelTypeInferrer inferrer) { | 120 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 121 inferrer.listener.assertStatementEnter(this); | 121 inferrer.listener.assertStatementEnter(this); |
| 122 inferrer.inferExpression( | 122 inferrer.inferExpression( |
| 123 condition, inferrer.coreTypes.boolClass.rawType, false); | 123 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 124 if (message != null) { | 124 if (message != null) { |
| 125 inferrer.inferExpression(message, null, false); | 125 inferrer.inferExpression(message, null, false); |
| 126 } | 126 } |
| 127 inferrer.listener.assertStatementExit(this); | 127 inferrer.listener.assertStatementExit(this); |
| 128 } | 128 } |
| 129 } | 129 } |
| 130 | 130 |
| 131 /// Shadow object for [AwaitExpression]. | 131 /// Shadow object for [AwaitExpression]. |
| 132 class KernelAwaitExpression extends AwaitExpression | 132 class ShadowAwaitExpression extends AwaitExpression |
| 133 implements KernelExpression { | 133 implements ShadowExpression { |
| 134 KernelAwaitExpression(Expression operand) : super(operand); | 134 ShadowAwaitExpression(Expression operand) : super(operand); |
| 135 | 135 |
| 136 @override | 136 @override |
| 137 void _collectDependencies(KernelDependencyCollector collector) { | 137 void _collectDependencies(ShadowDependencyCollector collector) { |
| 138 // Inference dependencies are the dependencies of the awaited expression. | 138 // Inference dependencies are the dependencies of the awaited expression. |
| 139 collector.collectDependencies(operand); | 139 collector.collectDependencies(operand); |
| 140 } | 140 } |
| 141 | 141 |
| 142 @override | 142 @override |
| 143 DartType _inferExpression( | 143 DartType _inferExpression( |
| 144 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 144 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 145 typeNeeded = | 145 typeNeeded = |
| 146 inferrer.listener.awaitExpressionEnter(this, typeContext) || typeNeeded; | 146 inferrer.listener.awaitExpressionEnter(this, typeContext) || typeNeeded; |
| 147 if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) { | 147 if (!inferrer.typeSchemaEnvironment.isEmptyContext(typeContext)) { |
| 148 typeContext = inferrer.wrapFutureOrType(typeContext); | 148 typeContext = inferrer.wrapFutureOrType(typeContext); |
| 149 } | 149 } |
| 150 var inferredType = | 150 var inferredType = |
| 151 inferrer.inferExpression(operand, typeContext, typeNeeded); | 151 inferrer.inferExpression(operand, typeContext, typeNeeded); |
| 152 inferredType = inferrer.typeSchemaEnvironment.flattenFutures(inferredType); | 152 inferredType = inferrer.typeSchemaEnvironment.flattenFutures(inferredType); |
| 153 inferrer.listener.awaitExpressionExit(this, inferredType); | 153 inferrer.listener.awaitExpressionExit(this, inferredType); |
| 154 return inferredType; | 154 return inferredType; |
| 155 } | 155 } |
| 156 } | 156 } |
| 157 | 157 |
| 158 /// Concrete shadow object representing a statement block in kernel form. | 158 /// Concrete shadow object representing a statement block in kernel form. |
| 159 class KernelBlock extends Block implements KernelStatement { | 159 class ShadowBlock extends Block implements ShadowStatement { |
| 160 KernelBlock(List<Statement> statements) : super(statements); | 160 ShadowBlock(List<Statement> statements) : super(statements); |
| 161 | 161 |
| 162 @override | 162 @override |
| 163 void _inferStatement(KernelTypeInferrer inferrer) { | 163 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 164 inferrer.listener.blockEnter(this); | 164 inferrer.listener.blockEnter(this); |
| 165 for (var statement in statements) { | 165 for (var statement in statements) { |
| 166 inferrer.inferStatement(statement); | 166 inferrer.inferStatement(statement); |
| 167 } | 167 } |
| 168 inferrer.listener.blockExit(this); | 168 inferrer.listener.blockExit(this); |
| 169 } | 169 } |
| 170 } | 170 } |
| 171 | 171 |
| 172 /// Concrete shadow object representing a boolean literal in kernel form. | 172 /// Concrete shadow object representing a boolean literal in kernel form. |
| 173 class KernelBoolLiteral extends BoolLiteral implements KernelExpression { | 173 class ShadowBoolLiteral extends BoolLiteral implements ShadowExpression { |
| 174 KernelBoolLiteral(bool value) : super(value); | 174 ShadowBoolLiteral(bool value) : super(value); |
| 175 | 175 |
| 176 @override | 176 @override |
| 177 void _collectDependencies(KernelDependencyCollector collector) { | 177 void _collectDependencies(ShadowDependencyCollector collector) { |
| 178 // No inference dependencies. | 178 // No inference dependencies. |
| 179 } | 179 } |
| 180 | 180 |
| 181 @override | 181 @override |
| 182 DartType _inferExpression( | 182 DartType _inferExpression( |
| 183 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 183 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 184 typeNeeded = | 184 typeNeeded = |
| 185 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded; | 185 inferrer.listener.boolLiteralEnter(this, typeContext) || typeNeeded; |
| 186 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; | 186 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; |
| 187 inferrer.listener.boolLiteralExit(this, inferredType); | 187 inferrer.listener.boolLiteralExit(this, inferredType); |
| 188 return inferredType; | 188 return inferredType; |
| 189 } | 189 } |
| 190 } | 190 } |
| 191 | 191 |
| 192 /// Concrete shadow object representing a break or continue statement in kernel | 192 /// Concrete shadow object representing a break or continue statement in kernel |
| 193 /// form. | 193 /// form. |
| 194 class KernelBreakStatement extends BreakStatement implements KernelStatement { | 194 class ShadowBreakStatement extends BreakStatement implements ShadowStatement { |
| 195 KernelBreakStatement(LabeledStatement target) : super(target); | 195 ShadowBreakStatement(LabeledStatement target) : super(target); |
| 196 | 196 |
| 197 @override | 197 @override |
| 198 void _inferStatement(KernelTypeInferrer inferrer) { | 198 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 199 inferrer.listener.breakStatementEnter(this); | 199 inferrer.listener.breakStatementEnter(this); |
| 200 // No inference needs to be done. | 200 // No inference needs to be done. |
| 201 inferrer.listener.breakStatementExit(this); | 201 inferrer.listener.breakStatementExit(this); |
| 202 } | 202 } |
| 203 } | 203 } |
| 204 | 204 |
| 205 /// Concrete shadow object representing a cascade expression. | 205 /// Concrete shadow object representing a cascade expression. |
| 206 /// | 206 /// |
| 207 /// A cascade expression of the form `a..b()..c()` is represented as the kernel | 207 /// A cascade expression of the form `a..b()..c()` is represented as the kernel |
| 208 /// expression: | 208 /// expression: |
| 209 /// | 209 /// |
| 210 /// let v = a in | 210 /// let v = a in |
| 211 /// let _ = v.b() in | 211 /// let _ = v.b() in |
| 212 /// let _ = v.c() in | 212 /// let _ = v.c() in |
| 213 /// v | 213 /// v |
| 214 /// | 214 /// |
| 215 /// In the documentation that follows, `v` is referred to as the "cascade | 215 /// In the documentation that follows, `v` is referred to as the "cascade |
| 216 /// variable"--this is the variable that remembers the value of the expression | 216 /// variable"--this is the variable that remembers the value of the expression |
| 217 /// preceding the first `..` while the cascades are being evaluated. | 217 /// preceding the first `..` while the cascades are being evaluated. |
| 218 /// | 218 /// |
| 219 /// After constructing a [KernelCascadeExpression], the caller should | 219 /// After constructing a [ShadowCascadeExpression], the caller should |
| 220 /// call [finalize] with an expression representing the expression after the | 220 /// call [finalize] with an expression representing the expression after the |
| 221 /// `..`. If a further `..` follows that expression, the caller should call | 221 /// `..`. If a further `..` follows that expression, the caller should call |
| 222 /// [extend] followed by [finalize] for each subsequent cascade. | 222 /// [extend] followed by [finalize] for each subsequent cascade. |
| 223 class KernelCascadeExpression extends Let implements KernelExpression { | 223 class ShadowCascadeExpression extends Let implements ShadowExpression { |
| 224 /// Pointer to the last "let" expression in the cascade. | 224 /// Pointer to the last "let" expression in the cascade. |
| 225 Let nextCascade; | 225 Let nextCascade; |
| 226 | 226 |
| 227 /// Creates a [KernelCascadeExpression] using [variable] as the cascade | 227 /// Creates a [ShadowCascadeExpression] using [variable] as the cascade |
| 228 /// variable. Caller is responsible for ensuring that [variable]'s | 228 /// variable. Caller is responsible for ensuring that [variable]'s |
| 229 /// initializer is the expression preceding the first `..` of the cascade | 229 /// initializer is the expression preceding the first `..` of the cascade |
| 230 /// expression. | 230 /// expression. |
| 231 KernelCascadeExpression(KernelVariableDeclaration variable) | 231 ShadowCascadeExpression(ShadowVariableDeclaration variable) |
| 232 : super( | 232 : super( |
| 233 variable, | 233 variable, |
| 234 makeLet(new VariableDeclaration.forValue(new _UnfinishedCascade()), | 234 makeLet(new VariableDeclaration.forValue(new _UnfinishedCascade()), |
| 235 new VariableGet(variable))) { | 235 new VariableGet(variable))) { |
| 236 nextCascade = body; | 236 nextCascade = body; |
| 237 } | 237 } |
| 238 | 238 |
| 239 /// Adds a new unfinalized section to the end of the cascade. Should be | 239 /// Adds a new unfinalized section to the end of the cascade. Should be |
| 240 /// called after the previous cascade section has been finalized. | 240 /// called after the previous cascade section has been finalized. |
| 241 void extend() { | 241 void extend() { |
| 242 assert(nextCascade.variable.initializer is! _UnfinishedCascade); | 242 assert(nextCascade.variable.initializer is! _UnfinishedCascade); |
| 243 Let newCascade = makeLet( | 243 Let newCascade = makeLet( |
| 244 new VariableDeclaration.forValue(new _UnfinishedCascade()), | 244 new VariableDeclaration.forValue(new _UnfinishedCascade()), |
| 245 nextCascade.body); | 245 nextCascade.body); |
| 246 nextCascade.body = newCascade; | 246 nextCascade.body = newCascade; |
| 247 newCascade.parent = nextCascade; | 247 newCascade.parent = nextCascade; |
| 248 nextCascade = newCascade; | 248 nextCascade = newCascade; |
| 249 } | 249 } |
| 250 | 250 |
| 251 /// Finalizes the last cascade section with the given [expression]. | 251 /// Finalizes the last cascade section with the given [expression]. |
| 252 void finalize(Expression expression) { | 252 void finalize(Expression expression) { |
| 253 assert(nextCascade.variable.initializer is _UnfinishedCascade); | 253 assert(nextCascade.variable.initializer is _UnfinishedCascade); |
| 254 nextCascade.variable.initializer = expression; | 254 nextCascade.variable.initializer = expression; |
| 255 expression.parent = nextCascade.variable; | 255 expression.parent = nextCascade.variable; |
| 256 } | 256 } |
| 257 | 257 |
| 258 @override | 258 @override |
| 259 void _collectDependencies(KernelDependencyCollector collector) { | 259 void _collectDependencies(ShadowDependencyCollector collector) { |
| 260 // The inference dependencies are the inference dependencies of the cascade | 260 // The inference dependencies are the inference dependencies of the cascade |
| 261 // target. | 261 // target. |
| 262 collector.collectDependencies(variable.initializer); | 262 collector.collectDependencies(variable.initializer); |
| 263 } | 263 } |
| 264 | 264 |
| 265 @override | 265 @override |
| 266 DartType _inferExpression( | 266 DartType _inferExpression( |
| 267 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 267 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 268 typeNeeded = inferrer.listener.cascadeExpressionEnter(this, typeContext) || | 268 typeNeeded = inferrer.listener.cascadeExpressionEnter(this, typeContext) || |
| 269 typeNeeded; | 269 typeNeeded; |
| 270 var lhsType = inferrer.inferExpression( | 270 var lhsType = inferrer.inferExpression( |
| 271 variable.initializer, typeContext, typeNeeded || inferrer.strongMode); | 271 variable.initializer, typeContext, typeNeeded || inferrer.strongMode); |
| 272 if (inferrer.strongMode) { | 272 if (inferrer.strongMode) { |
| 273 variable.type = lhsType; | 273 variable.type = lhsType; |
| 274 } | 274 } |
| 275 Let section = body; | 275 Let section = body; |
| 276 while (true) { | 276 while (true) { |
| 277 inferrer.inferExpression(section.variable.initializer, null, false); | 277 inferrer.inferExpression(section.variable.initializer, null, false); |
| 278 if (section.body is! Let) break; | 278 if (section.body is! Let) break; |
| 279 section = section.body; | 279 section = section.body; |
| 280 } | 280 } |
| 281 inferrer.listener.cascadeExpressionExit(this, lhsType); | 281 inferrer.listener.cascadeExpressionExit(this, lhsType); |
| 282 return lhsType; | 282 return lhsType; |
| 283 } | 283 } |
| 284 } | 284 } |
| 285 | 285 |
| 286 /// Abstract shadow object representing a complex assignment in kernel form. | 286 /// Abstract shadow object representing a complex assignment in kernel form. |
| 287 /// | 287 /// |
| 288 /// Since there are many forms a complex assignment might have been desugared | 288 /// Since there are many forms a complex assignment might have been desugared |
| 289 /// to, this class wraps the desugared assignment rather than extending it. | 289 /// to, this class wraps the desugared assignment rather than extending it. |
| 290 /// | 290 /// |
| 291 /// TODO(paulberry): once we know exactly what constitutes a "complex | 291 /// TODO(paulberry): once we know exactly what constitutes a "complex |
| 292 /// assignment", document it here. | 292 /// assignment", document it here. |
| 293 abstract class KernelComplexAssignment extends KernelSyntheticExpression { | 293 abstract class ShadowComplexAssignment extends ShadowSyntheticExpression { |
| 294 /// In a compound assignment, the expression that reads the old value, or | 294 /// In a compound assignment, the expression that reads the old value, or |
| 295 /// `null` if this is not a compound assignment. | 295 /// `null` if this is not a compound assignment. |
| 296 Expression read; | 296 Expression read; |
| 297 | 297 |
| 298 /// The expression appearing on the RHS of the assignment. | 298 /// The expression appearing on the RHS of the assignment. |
| 299 final Expression rhs; | 299 final Expression rhs; |
| 300 | 300 |
| 301 /// The expression that performs the write (e.g. `a.[]=(b, a.[](b) + 1)` in | 301 /// The expression that performs the write (e.g. `a.[]=(b, a.[](b) + 1)` in |
| 302 /// `++a[b]`). | 302 /// `++a[b]`). |
| 303 Expression write; | 303 Expression write; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 318 ConditionalExpression nullAwareCombiner; | 318 ConditionalExpression nullAwareCombiner; |
| 319 | 319 |
| 320 /// Indicates whether the expression arose from a post-increment or | 320 /// Indicates whether the expression arose from a post-increment or |
| 321 /// post-decrement. | 321 /// post-decrement. |
| 322 bool isPostIncDec = false; | 322 bool isPostIncDec = false; |
| 323 | 323 |
| 324 /// Indicates whether the expression arose from a pre-increment or | 324 /// Indicates whether the expression arose from a pre-increment or |
| 325 /// pre-decrement. | 325 /// pre-decrement. |
| 326 bool isPreIncDec = false; | 326 bool isPreIncDec = false; |
| 327 | 327 |
| 328 KernelComplexAssignment(this.rhs) : super(null); | 328 ShadowComplexAssignment(this.rhs) : super(null); |
| 329 | 329 |
| 330 String toString() { | 330 String toString() { |
| 331 var parts = _getToStringParts(); | 331 var parts = _getToStringParts(); |
| 332 return '${runtimeType}(${parts.join(', ')})'; | 332 return '${runtimeType}(${parts.join(', ')})'; |
| 333 } | 333 } |
| 334 | 334 |
| 335 @override | 335 @override |
| 336 void _collectDependencies(KernelDependencyCollector collector) { | 336 void _collectDependencies(ShadowDependencyCollector collector) { |
| 337 // Assignment expressions are not immediately evident expressions. | 337 // Assignment expressions are not immediately evident expressions. |
| 338 collector.recordNotImmediatelyEvident(fileOffset); | 338 collector.recordNotImmediatelyEvident(fileOffset); |
| 339 } | 339 } |
| 340 | 340 |
| 341 List<String> _getToStringParts() { | 341 List<String> _getToStringParts() { |
| 342 List<String> parts = []; | 342 List<String> parts = []; |
| 343 if (desugared != null) parts.add('desugared=$desugared'); | 343 if (desugared != null) parts.add('desugared=$desugared'); |
| 344 if (read != null) parts.add('read=$read'); | 344 if (read != null) parts.add('read=$read'); |
| 345 if (rhs != null) parts.add('rhs=$rhs'); | 345 if (rhs != null) parts.add('rhs=$rhs'); |
| 346 if (write != null) parts.add('write=$write'); | 346 if (write != null) parts.add('write=$write'); |
| 347 if (combiner != null) parts.add('combiner=$combiner'); | 347 if (combiner != null) parts.add('combiner=$combiner'); |
| 348 if (nullAwareCombiner != null) { | 348 if (nullAwareCombiner != null) { |
| 349 parts.add('nullAwareCombiner=$nullAwareCombiner'); | 349 parts.add('nullAwareCombiner=$nullAwareCombiner'); |
| 350 } | 350 } |
| 351 if (isPostIncDec) parts.add('isPostIncDec=true'); | 351 if (isPostIncDec) parts.add('isPostIncDec=true'); |
| 352 if (isPreIncDec) parts.add('isPreIncDec=true'); | 352 if (isPreIncDec) parts.add('isPreIncDec=true'); |
| 353 return parts; | 353 return parts; |
| 354 } | 354 } |
| 355 | 355 |
| 356 DartType _inferRhs(KernelTypeInferrer inferrer, DartType writeContext) { | 356 DartType _inferRhs(ShadowTypeInferrer inferrer, DartType writeContext) { |
| 357 DartType inferredType = writeContext ?? const DynamicType(); | 357 DartType inferredType = writeContext ?? const DynamicType(); |
| 358 if (nullAwareCombiner != null) { | 358 if (nullAwareCombiner != null) { |
| 359 var rhsType = inferrer.inferExpression(rhs, writeContext, true); | 359 var rhsType = inferrer.inferExpression(rhs, writeContext, true); |
| 360 MethodInvocation equalsInvocation = nullAwareCombiner.condition; | 360 MethodInvocation equalsInvocation = nullAwareCombiner.condition; |
| 361 inferrer.findMethodInvocationMember(writeContext, equalsInvocation, | 361 inferrer.findMethodInvocationMember(writeContext, equalsInvocation, |
| 362 silent: true); | 362 silent: true); |
| 363 return inferrer.typeSchemaEnvironment | 363 return inferrer.typeSchemaEnvironment |
| 364 .getLeastUpperBound(inferredType, rhsType); | 364 .getLeastUpperBound(inferredType, rhsType); |
| 365 } else if (combiner != null) { | 365 } else if (combiner != null) { |
| 366 bool isOverloadedArithmeticOperator = false; | 366 bool isOverloadedArithmeticOperator = false; |
| (...skipping 26 matching lines...) Expand all Loading... |
| 393 } | 393 } |
| 394 } | 394 } |
| 395 } else { | 395 } else { |
| 396 return inferrer.inferExpression(rhs, writeContext, true); | 396 return inferrer.inferExpression(rhs, writeContext, true); |
| 397 } | 397 } |
| 398 } | 398 } |
| 399 } | 399 } |
| 400 | 400 |
| 401 /// Abstract shadow object representing a complex assignment involving a | 401 /// Abstract shadow object representing a complex assignment involving a |
| 402 /// receiver. | 402 /// receiver. |
| 403 abstract class KernelComplexAssignmentWithReceiver | 403 abstract class ShadowComplexAssignmentWithReceiver |
| 404 extends KernelComplexAssignment { | 404 extends ShadowComplexAssignment { |
| 405 /// The receiver of the assignment target (e.g. `a` in `a[b] = c`). | 405 /// The receiver of the assignment target (e.g. `a` in `a[b] = c`). |
| 406 final Expression receiver; | 406 final Expression receiver; |
| 407 | 407 |
| 408 /// Indicates whether this assignment uses `super`. | 408 /// Indicates whether this assignment uses `super`. |
| 409 final bool isSuper; | 409 final bool isSuper; |
| 410 | 410 |
| 411 KernelComplexAssignmentWithReceiver( | 411 ShadowComplexAssignmentWithReceiver( |
| 412 this.receiver, Expression rhs, this.isSuper) | 412 this.receiver, Expression rhs, this.isSuper) |
| 413 : super(rhs); | 413 : super(rhs); |
| 414 | 414 |
| 415 @override | 415 @override |
| 416 List<String> _getToStringParts() { | 416 List<String> _getToStringParts() { |
| 417 var parts = super._getToStringParts(); | 417 var parts = super._getToStringParts(); |
| 418 if (receiver != null) parts.add('receiver=$receiver'); | 418 if (receiver != null) parts.add('receiver=$receiver'); |
| 419 if (isSuper) parts.add('isSuper=true'); | 419 if (isSuper) parts.add('isSuper=true'); |
| 420 return parts; | 420 return parts; |
| 421 } | 421 } |
| 422 | 422 |
| 423 DartType _inferReceiver(KernelTypeInferrer inferrer) { | 423 DartType _inferReceiver(ShadowTypeInferrer inferrer) { |
| 424 if (receiver != null) { | 424 if (receiver != null) { |
| 425 return inferrer.inferExpression(receiver, null, true); | 425 return inferrer.inferExpression(receiver, null, true); |
| 426 } else if (isSuper) { | 426 } else if (isSuper) { |
| 427 return inferrer.classHierarchy.getTypeAsInstanceOf( | 427 return inferrer.classHierarchy.getTypeAsInstanceOf( |
| 428 inferrer.thisType, inferrer.thisType.classNode.supertype.classNode); | 428 inferrer.thisType, inferrer.thisType.classNode.supertype.classNode); |
| 429 } else { | 429 } else { |
| 430 return inferrer.thisType; | 430 return inferrer.thisType; |
| 431 } | 431 } |
| 432 } | 432 } |
| 433 } | 433 } |
| 434 | 434 |
| 435 /// Concrete shadow object representing a conditional expression in kernel form. | 435 /// Concrete shadow object representing a conditional expression in kernel form. |
| 436 /// Shadow object for [ConditionalExpression]. | 436 /// Shadow object for [ConditionalExpression]. |
| 437 class KernelConditionalExpression extends ConditionalExpression | 437 class ShadowConditionalExpression extends ConditionalExpression |
| 438 implements KernelExpression { | 438 implements ShadowExpression { |
| 439 KernelConditionalExpression( | 439 ShadowConditionalExpression( |
| 440 Expression condition, Expression then, Expression otherwise) | 440 Expression condition, Expression then, Expression otherwise) |
| 441 : super(condition, then, otherwise, null); | 441 : super(condition, then, otherwise, null); |
| 442 | 442 |
| 443 @override | 443 @override |
| 444 void _collectDependencies(KernelDependencyCollector collector) { | 444 void _collectDependencies(ShadowDependencyCollector collector) { |
| 445 // Inference dependencies are the union of the inference dependencies of the | 445 // Inference dependencies are the union of the inference dependencies of the |
| 446 // two returned sub-expressions. | 446 // two returned sub-expressions. |
| 447 collector.collectDependencies(then); | 447 collector.collectDependencies(then); |
| 448 collector.collectDependencies(otherwise); | 448 collector.collectDependencies(otherwise); |
| 449 } | 449 } |
| 450 | 450 |
| 451 @override | 451 @override |
| 452 DartType _inferExpression( | 452 DartType _inferExpression( |
| 453 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 453 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 454 typeNeeded = | 454 typeNeeded = |
| 455 inferrer.listener.conditionalExpressionEnter(this, typeContext) || | 455 inferrer.listener.conditionalExpressionEnter(this, typeContext) || |
| 456 typeNeeded; | 456 typeNeeded; |
| 457 if (!inferrer.isTopLevel || | 457 if (!inferrer.isTopLevel || |
| 458 TypeInferenceEngineImpl.expandedTopLevelInference) { | 458 TypeInferenceEngineImpl.expandedTopLevelInference) { |
| 459 inferrer.inferExpression( | 459 inferrer.inferExpression( |
| 460 condition, inferrer.coreTypes.boolClass.rawType, false); | 460 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 461 } | 461 } |
| 462 DartType thenType = inferrer.inferExpression(then, typeContext, true); | 462 DartType thenType = inferrer.inferExpression(then, typeContext, true); |
| 463 DartType otherwiseType = | 463 DartType otherwiseType = |
| 464 inferrer.inferExpression(otherwise, typeContext, true); | 464 inferrer.inferExpression(otherwise, typeContext, true); |
| 465 DartType type = inferrer.typeSchemaEnvironment | 465 DartType type = inferrer.typeSchemaEnvironment |
| 466 .getLeastUpperBound(thenType, otherwiseType); | 466 .getLeastUpperBound(thenType, otherwiseType); |
| 467 if (inferrer.strongMode) { | 467 if (inferrer.strongMode) { |
| 468 staticType = type; | 468 staticType = type; |
| 469 } | 469 } |
| 470 var inferredType = typeNeeded ? type : null; | 470 var inferredType = typeNeeded ? type : null; |
| 471 inferrer.listener.conditionalExpressionExit(this, inferredType); | 471 inferrer.listener.conditionalExpressionExit(this, inferredType); |
| 472 return inferredType; | 472 return inferredType; |
| 473 } | 473 } |
| 474 } | 474 } |
| 475 | 475 |
| 476 /// Shadow object for [ConstructorInvocation]. | 476 /// Shadow object for [ConstructorInvocation]. |
| 477 class KernelConstructorInvocation extends ConstructorInvocation | 477 class ShadowConstructorInvocation extends ConstructorInvocation |
| 478 implements KernelExpression { | 478 implements ShadowExpression { |
| 479 final Member _initialTarget; | 479 final Member _initialTarget; |
| 480 | 480 |
| 481 KernelConstructorInvocation( | 481 ShadowConstructorInvocation( |
| 482 Constructor target, this._initialTarget, Arguments arguments, | 482 Constructor target, this._initialTarget, Arguments arguments, |
| 483 {bool isConst: false}) | 483 {bool isConst: false}) |
| 484 : super(target, arguments, isConst: isConst); | 484 : super(target, arguments, isConst: isConst); |
| 485 | 485 |
| 486 @override | 486 @override |
| 487 void _collectDependencies(KernelDependencyCollector collector) { | 487 void _collectDependencies(ShadowDependencyCollector collector) { |
| 488 // No inference dependencies. | 488 // No inference dependencies. |
| 489 } | 489 } |
| 490 | 490 |
| 491 @override | 491 @override |
| 492 DartType _inferExpression( | 492 DartType _inferExpression( |
| 493 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 493 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 494 typeNeeded = | 494 typeNeeded = |
| 495 inferrer.listener.constructorInvocationEnter(this, typeContext) || | 495 inferrer.listener.constructorInvocationEnter(this, typeContext) || |
| 496 typeNeeded; | 496 typeNeeded; |
| 497 var inferredType = inferrer.inferInvocation( | 497 var inferredType = inferrer.inferInvocation( |
| 498 typeContext, | 498 typeContext, |
| 499 typeNeeded, | 499 typeNeeded, |
| 500 fileOffset, | 500 fileOffset, |
| 501 _initialTarget.function.functionType, | 501 _initialTarget.function.functionType, |
| 502 computeConstructorReturnType(_initialTarget), | 502 computeConstructorReturnType(_initialTarget), |
| 503 arguments); | 503 arguments); |
| 504 inferrer.listener.constructorInvocationExit(this, inferredType); | 504 inferrer.listener.constructorInvocationExit(this, inferredType); |
| 505 return inferredType; | 505 return inferredType; |
| 506 } | 506 } |
| 507 } | 507 } |
| 508 | 508 |
| 509 /// Concrete shadow object representing a continue statement from a switch | 509 /// Concrete shadow object representing a continue statement from a switch |
| 510 /// statement, in kernel form. | 510 /// statement, in kernel form. |
| 511 class KernelContinueSwitchStatement extends ContinueSwitchStatement | 511 class ShadowContinueSwitchStatement extends ContinueSwitchStatement |
| 512 implements KernelStatement { | 512 implements ShadowStatement { |
| 513 KernelContinueSwitchStatement(SwitchCase target) : super(target); | 513 ShadowContinueSwitchStatement(SwitchCase target) : super(target); |
| 514 | 514 |
| 515 @override | 515 @override |
| 516 void _inferStatement(KernelTypeInferrer inferrer) { | 516 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 517 inferrer.listener.continueSwitchStatementEnter(this); | 517 inferrer.listener.continueSwitchStatementEnter(this); |
| 518 // No inference needs to be done. | 518 // No inference needs to be done. |
| 519 inferrer.listener.continueSwitchStatementExit(this); | 519 inferrer.listener.continueSwitchStatementExit(this); |
| 520 } | 520 } |
| 521 } | 521 } |
| 522 | 522 |
| 523 /// Concrete implementation of [DependencyCollector] specialized to work with | 523 /// Concrete implementation of [DependencyCollector] specialized to work with |
| 524 /// kernel objects. | 524 /// kernel objects. |
| 525 class KernelDependencyCollector extends DependencyCollectorImpl { | 525 class ShadowDependencyCollector extends DependencyCollectorImpl { |
| 526 @override | 526 @override |
| 527 void collectDependencies(Expression expression) { | 527 void collectDependencies(Expression expression) { |
| 528 if (expression is KernelExpression) { | 528 if (expression is ShadowExpression) { |
| 529 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind | 529 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind |
| 530 // of type inference is correct for this kind of statement. | 530 // of type inference is correct for this kind of statement. |
| 531 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 531 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 532 // so that the type hierarchy will be simpler (which may speed up "is" | 532 // so that the type hierarchy will be simpler (which may speed up "is" |
| 533 // checks). | 533 // checks). |
| 534 expression._collectDependencies(this); | 534 expression._collectDependencies(this); |
| 535 } else { | 535 } else { |
| 536 // Encountered an expression type for which type inference is not yet | 536 // Encountered an expression type for which type inference is not yet |
| 537 // implemented, so just assume the expression does not have an immediately | 537 // implemented, so just assume the expression does not have an immediately |
| 538 // evident type for now. | 538 // evident type for now. |
| 539 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 539 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 540 // everything, this case should no longer be needed. | 540 // everything, this case should no longer be needed. |
| 541 recordNotImmediatelyEvident(expression.fileOffset); | 541 recordNotImmediatelyEvident(expression.fileOffset); |
| 542 } | 542 } |
| 543 } | 543 } |
| 544 } | 544 } |
| 545 | 545 |
| 546 /// Shadow object for [DirectMethodInvocation]. | 546 /// Shadow object for [DirectMethodInvocation]. |
| 547 class KernelDirectMethodInvocation extends DirectMethodInvocation | 547 class ShadowDirectMethodInvocation extends DirectMethodInvocation |
| 548 implements KernelExpression { | 548 implements ShadowExpression { |
| 549 KernelDirectMethodInvocation( | 549 ShadowDirectMethodInvocation( |
| 550 Expression receiver, Procedure target, Arguments arguments) | 550 Expression receiver, Procedure target, Arguments arguments) |
| 551 : super(receiver, target, arguments); | 551 : super(receiver, target, arguments); |
| 552 | 552 |
| 553 @override | 553 @override |
| 554 void _collectDependencies(KernelDependencyCollector collector) { | 554 void _collectDependencies(ShadowDependencyCollector collector) { |
| 555 // DirectMethodInvocation can only occur as a result of a use of `super`, | 555 // DirectMethodInvocation can only occur as a result of a use of `super`, |
| 556 // and `super` can't appear inside a field initializer. So this code should | 556 // and `super` can't appear inside a field initializer. So this code should |
| 557 // never be reached. | 557 // never be reached. |
| 558 unsupported( | 558 unsupported( |
| 559 "DirectMethodInvocation._collectDependencies", fileOffset, null); | 559 "DirectMethodInvocation._collectDependencies", fileOffset, null); |
| 560 } | 560 } |
| 561 | 561 |
| 562 @override | 562 @override |
| 563 DartType _inferExpression( | 563 DartType _inferExpression( |
| 564 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 564 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 565 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, | 565 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
| 566 'target', new InstrumentationValueForMember(target)); | 566 'target', new InstrumentationValueForMember(target)); |
| 567 return inferrer.inferMethodInvocation( | 567 return inferrer.inferMethodInvocation( |
| 568 this, receiver, fileOffset, false, typeContext, typeNeeded, | 568 this, receiver, fileOffset, false, typeContext, typeNeeded, |
| 569 interfaceMember: target, methodName: target.name, arguments: arguments); | 569 interfaceMember: target, methodName: target.name, arguments: arguments); |
| 570 } | 570 } |
| 571 } | 571 } |
| 572 | 572 |
| 573 /// Shadow object for [DirectPropertyGet]. | 573 /// Shadow object for [DirectPropertyGet]. |
| 574 class KernelDirectPropertyGet extends DirectPropertyGet | 574 class ShadowDirectPropertyGet extends DirectPropertyGet |
| 575 implements KernelExpression { | 575 implements ShadowExpression { |
| 576 KernelDirectPropertyGet(Expression receiver, Member target) | 576 ShadowDirectPropertyGet(Expression receiver, Member target) |
| 577 : super(receiver, target); | 577 : super(receiver, target); |
| 578 | 578 |
| 579 @override | 579 @override |
| 580 void _collectDependencies(KernelDependencyCollector collector) { | 580 void _collectDependencies(ShadowDependencyCollector collector) { |
| 581 // DirectPropertyGet can only occur as a result of a use of `super`, and | 581 // DirectPropertyGet can only occur as a result of a use of `super`, and |
| 582 // `super` can't appear inside a field initializer. So this code should | 582 // `super` can't appear inside a field initializer. So this code should |
| 583 // never be reached. | 583 // never be reached. |
| 584 unsupported("DirectPropertyGet._collectDependencies", fileOffset, null); | 584 unsupported("DirectPropertyGet._collectDependencies", fileOffset, null); |
| 585 } | 585 } |
| 586 | 586 |
| 587 @override | 587 @override |
| 588 DartType _inferExpression( | 588 DartType _inferExpression( |
| 589 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 589 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 590 return inferrer.inferPropertyGet( | 590 return inferrer.inferPropertyGet( |
| 591 this, receiver, fileOffset, typeContext, typeNeeded, | 591 this, receiver, fileOffset, typeContext, typeNeeded, |
| 592 propertyName: target.name); | 592 propertyName: target.name); |
| 593 } | 593 } |
| 594 } | 594 } |
| 595 | 595 |
| 596 /// Concrete shadow object representing a do loop in kernel form. | 596 /// Concrete shadow object representing a do loop in kernel form. |
| 597 class KernelDoStatement extends DoStatement implements KernelStatement { | 597 class ShadowDoStatement extends DoStatement implements ShadowStatement { |
| 598 KernelDoStatement(Statement body, Expression condition) | 598 ShadowDoStatement(Statement body, Expression condition) |
| 599 : super(body, condition); | 599 : super(body, condition); |
| 600 | 600 |
| 601 @override | 601 @override |
| 602 void _inferStatement(KernelTypeInferrer inferrer) { | 602 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 603 inferrer.listener.doStatementEnter(this); | 603 inferrer.listener.doStatementEnter(this); |
| 604 inferrer.inferStatement(body); | 604 inferrer.inferStatement(body); |
| 605 inferrer.inferExpression( | 605 inferrer.inferExpression( |
| 606 condition, inferrer.coreTypes.boolClass.rawType, false); | 606 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 607 inferrer.listener.doStatementExit(this); | 607 inferrer.listener.doStatementExit(this); |
| 608 } | 608 } |
| 609 } | 609 } |
| 610 | 610 |
| 611 /// Concrete shadow object representing a double literal in kernel form. | 611 /// Concrete shadow object representing a double literal in kernel form. |
| 612 class KernelDoubleLiteral extends DoubleLiteral implements KernelExpression { | 612 class ShadowDoubleLiteral extends DoubleLiteral implements ShadowExpression { |
| 613 KernelDoubleLiteral(double value) : super(value); | 613 ShadowDoubleLiteral(double value) : super(value); |
| 614 | 614 |
| 615 @override | 615 @override |
| 616 void _collectDependencies(KernelDependencyCollector collector) { | 616 void _collectDependencies(ShadowDependencyCollector collector) { |
| 617 // No inference dependencies. | 617 // No inference dependencies. |
| 618 } | 618 } |
| 619 | 619 |
| 620 @override | 620 @override |
| 621 DartType _inferExpression( | 621 DartType _inferExpression( |
| 622 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 622 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 623 typeNeeded = | 623 typeNeeded = |
| 624 inferrer.listener.doubleLiteralEnter(this, typeContext) || typeNeeded; | 624 inferrer.listener.doubleLiteralEnter(this, typeContext) || typeNeeded; |
| 625 var inferredType = | 625 var inferredType = |
| 626 typeNeeded ? inferrer.coreTypes.doubleClass.rawType : null; | 626 typeNeeded ? inferrer.coreTypes.doubleClass.rawType : null; |
| 627 inferrer.listener.doubleLiteralExit(this, inferredType); | 627 inferrer.listener.doubleLiteralExit(this, inferredType); |
| 628 return inferredType; | 628 return inferredType; |
| 629 } | 629 } |
| 630 } | 630 } |
| 631 | 631 |
| 632 /// Common base class for shadow objects representing expressions in kernel | 632 /// Common base class for shadow objects representing expressions in kernel |
| 633 /// form. | 633 /// form. |
| 634 abstract class KernelExpression implements Expression { | 634 abstract class ShadowExpression implements Expression { |
| 635 /// Collects any dependencies of [expression], and reports errors if the | 635 /// Collects any dependencies of [expression], and reports errors if the |
| 636 /// expression does not have an immediately evident type. | 636 /// expression does not have an immediately evident type. |
| 637 void _collectDependencies(KernelDependencyCollector collector); | 637 void _collectDependencies(ShadowDependencyCollector collector); |
| 638 | 638 |
| 639 /// Calls back to [inferrer] to perform type inference for whatever concrete | 639 /// Calls back to [inferrer] to perform type inference for whatever concrete |
| 640 /// type of [KernelExpression] this is. | 640 /// type of [ShadowExpression] this is. |
| 641 DartType _inferExpression( | 641 DartType _inferExpression( |
| 642 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded); | 642 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded); |
| 643 } | 643 } |
| 644 | 644 |
| 645 /// Concrete shadow object representing an expression statement in kernel form. | 645 /// Concrete shadow object representing an expression statement in kernel form. |
| 646 class KernelExpressionStatement extends ExpressionStatement | 646 class ShadowExpressionStatement extends ExpressionStatement |
| 647 implements KernelStatement { | 647 implements ShadowStatement { |
| 648 KernelExpressionStatement(Expression expression) : super(expression); | 648 ShadowExpressionStatement(Expression expression) : super(expression); |
| 649 | 649 |
| 650 @override | 650 @override |
| 651 void _inferStatement(KernelTypeInferrer inferrer) { | 651 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 652 inferrer.listener.expressionStatementEnter(this); | 652 inferrer.listener.expressionStatementEnter(this); |
| 653 inferrer.inferExpression(expression, null, false); | 653 inferrer.inferExpression(expression, null, false); |
| 654 inferrer.listener.expressionStatementExit(this); | 654 inferrer.listener.expressionStatementExit(this); |
| 655 } | 655 } |
| 656 } | 656 } |
| 657 | 657 |
| 658 /// Shadow object for [StaticInvocation] when the procedure being invoked is a | 658 /// Shadow object for [StaticInvocation] when the procedure being invoked is a |
| 659 /// factory constructor. | 659 /// factory constructor. |
| 660 class KernelFactoryConstructorInvocation extends StaticInvocation | 660 class ShadowFactoryConstructorInvocation extends StaticInvocation |
| 661 implements KernelExpression { | 661 implements ShadowExpression { |
| 662 final Member _initialTarget; | 662 final Member _initialTarget; |
| 663 | 663 |
| 664 KernelFactoryConstructorInvocation( | 664 ShadowFactoryConstructorInvocation( |
| 665 Procedure target, this._initialTarget, Arguments arguments, | 665 Procedure target, this._initialTarget, Arguments arguments, |
| 666 {bool isConst: false}) | 666 {bool isConst: false}) |
| 667 : super(target, arguments, isConst: isConst); | 667 : super(target, arguments, isConst: isConst); |
| 668 | 668 |
| 669 @override | 669 @override |
| 670 void _collectDependencies(KernelDependencyCollector collector) { | 670 void _collectDependencies(ShadowDependencyCollector collector) { |
| 671 // No inference dependencies. | 671 // No inference dependencies. |
| 672 } | 672 } |
| 673 | 673 |
| 674 @override | 674 @override |
| 675 DartType _inferExpression( | 675 DartType _inferExpression( |
| 676 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 676 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 677 typeNeeded = | 677 typeNeeded = |
| 678 inferrer.listener.constructorInvocationEnter(this, typeContext) || | 678 inferrer.listener.constructorInvocationEnter(this, typeContext) || |
| 679 typeNeeded; | 679 typeNeeded; |
| 680 var inferredType = inferrer.inferInvocation( | 680 var inferredType = inferrer.inferInvocation( |
| 681 typeContext, | 681 typeContext, |
| 682 typeNeeded, | 682 typeNeeded, |
| 683 fileOffset, | 683 fileOffset, |
| 684 _initialTarget.function.functionType, | 684 _initialTarget.function.functionType, |
| 685 computeConstructorReturnType(_initialTarget), | 685 computeConstructorReturnType(_initialTarget), |
| 686 arguments); | 686 arguments); |
| 687 inferrer.listener.constructorInvocationExit(this, inferredType); | 687 inferrer.listener.constructorInvocationExit(this, inferredType); |
| 688 return inferredType; | 688 return inferredType; |
| 689 } | 689 } |
| 690 } | 690 } |
| 691 | 691 |
| 692 /// Concrete shadow object representing a field in kernel form. | 692 /// Concrete shadow object representing a field in kernel form. |
| 693 class KernelField extends Field implements KernelMember { | 693 class ShadowField extends Field implements ShadowMember { |
| 694 @override | 694 @override |
| 695 AccessorNode _accessorNode; | 695 AccessorNode _accessorNode; |
| 696 | 696 |
| 697 @override | 697 @override |
| 698 KernelTypeInferrer _typeInferrer; | 698 ShadowTypeInferrer _typeInferrer; |
| 699 | 699 |
| 700 KernelField(Name name, {String fileUri}) : super(name, fileUri: fileUri) {} | 700 ShadowField(Name name, {String fileUri}) : super(name, fileUri: fileUri) {} |
| 701 | 701 |
| 702 @override | 702 @override |
| 703 void setInferredType( | 703 void setInferredType( |
| 704 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { | 704 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { |
| 705 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', | 705 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', |
| 706 new InstrumentationValueForType(inferredType)); | 706 new InstrumentationValueForType(inferredType)); |
| 707 type = inferredType; | 707 type = inferredType; |
| 708 } | 708 } |
| 709 } | 709 } |
| 710 | 710 |
| 711 /// Concrete shadow object representing a field initializer in kernel form. | 711 /// Concrete shadow object representing a field initializer in kernel form. |
| 712 class KernelFieldInitializer extends FieldInitializer | 712 class ShadowFieldInitializer extends FieldInitializer |
| 713 implements KernelInitializer { | 713 implements ShadowInitializer { |
| 714 KernelFieldInitializer(Field field, Expression value) : super(field, value); | 714 ShadowFieldInitializer(Field field, Expression value) : super(field, value); |
| 715 | 715 |
| 716 @override | 716 @override |
| 717 void _inferInitializer(KernelTypeInferrer inferrer) { | 717 void _inferInitializer(ShadowTypeInferrer inferrer) { |
| 718 inferrer.listener.fieldInitializerEnter(this); | 718 inferrer.listener.fieldInitializerEnter(this); |
| 719 inferrer.inferExpression(value, field.type, false); | 719 inferrer.inferExpression(value, field.type, false); |
| 720 inferrer.listener.fieldInitializerExit(this); | 720 inferrer.listener.fieldInitializerExit(this); |
| 721 } | 721 } |
| 722 } | 722 } |
| 723 | 723 |
| 724 /// Concrete shadow object representing a for-in loop in kernel form. | 724 /// Concrete shadow object representing a for-in loop in kernel form. |
| 725 class KernelForInStatement extends ForInStatement implements KernelStatement { | 725 class ShadowForInStatement extends ForInStatement implements ShadowStatement { |
| 726 final bool _declaresVariable; | 726 final bool _declaresVariable; |
| 727 | 727 |
| 728 KernelForInStatement(VariableDeclaration variable, Expression iterable, | 728 ShadowForInStatement(VariableDeclaration variable, Expression iterable, |
| 729 Statement body, this._declaresVariable, | 729 Statement body, this._declaresVariable, |
| 730 {bool isAsync: false}) | 730 {bool isAsync: false}) |
| 731 : super(variable, iterable, body, isAsync: isAsync); | 731 : super(variable, iterable, body, isAsync: isAsync); |
| 732 | 732 |
| 733 @override | 733 @override |
| 734 void _inferStatement(KernelTypeInferrer inferrer) { | 734 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 735 inferrer.listener.forInStatementEnter(this); | 735 inferrer.listener.forInStatementEnter(this); |
| 736 var iterableClass = isAsync | 736 var iterableClass = isAsync |
| 737 ? inferrer.coreTypes.streamClass | 737 ? inferrer.coreTypes.streamClass |
| 738 : inferrer.coreTypes.iterableClass; | 738 : inferrer.coreTypes.iterableClass; |
| 739 DartType context; | 739 DartType context; |
| 740 bool typeNeeded = false; | 740 bool typeNeeded = false; |
| 741 KernelVariableDeclaration variable; | 741 ShadowVariableDeclaration variable; |
| 742 if (_declaresVariable) { | 742 if (_declaresVariable) { |
| 743 variable = this.variable; | 743 variable = this.variable; |
| 744 if (inferrer.strongMode && variable._implicitlyTyped) { | 744 if (inferrer.strongMode && variable._implicitlyTyped) { |
| 745 typeNeeded = true; | 745 typeNeeded = true; |
| 746 // TODO(paulberry): In this case, should the context be `Iterable<?>`? | 746 // TODO(paulberry): In this case, should the context be `Iterable<?>`? |
| 747 } else { | 747 } else { |
| 748 context = inferrer.wrapType(variable.type, iterableClass); | 748 context = inferrer.wrapType(variable.type, iterableClass); |
| 749 } | 749 } |
| 750 } else { | 750 } else { |
| 751 // TODO(paulberry): In this case, should the context be based on the | 751 // TODO(paulberry): In this case, should the context be based on the |
| (...skipping 21 matching lines...) Expand all Loading... |
| 773 'type', | 773 'type', |
| 774 new InstrumentationValueForType(inferredType)); | 774 new InstrumentationValueForType(inferredType)); |
| 775 variable.type = inferredType; | 775 variable.type = inferredType; |
| 776 } | 776 } |
| 777 inferrer.inferStatement(body); | 777 inferrer.inferStatement(body); |
| 778 inferrer.listener.forInStatementExit(this); | 778 inferrer.listener.forInStatementExit(this); |
| 779 } | 779 } |
| 780 } | 780 } |
| 781 | 781 |
| 782 /// Concrete shadow object representing a classic for loop in kernel form. | 782 /// Concrete shadow object representing a classic for loop in kernel form. |
| 783 class KernelForStatement extends ForStatement implements KernelStatement { | 783 class ShadowForStatement extends ForStatement implements ShadowStatement { |
| 784 KernelForStatement(List<VariableDeclaration> variables, Expression condition, | 784 ShadowForStatement(List<VariableDeclaration> variables, Expression condition, |
| 785 List<Expression> updates, Statement body) | 785 List<Expression> updates, Statement body) |
| 786 : super(variables, condition, updates, body); | 786 : super(variables, condition, updates, body); |
| 787 | 787 |
| 788 @override | 788 @override |
| 789 void _inferStatement(KernelTypeInferrer inferrer) { | 789 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 790 inferrer.listener.forStatementEnter(this); | 790 inferrer.listener.forStatementEnter(this); |
| 791 variables.forEach(inferrer.inferStatement); | 791 variables.forEach(inferrer.inferStatement); |
| 792 if (condition != null) { | 792 if (condition != null) { |
| 793 inferrer.inferExpression( | 793 inferrer.inferExpression( |
| 794 condition, inferrer.coreTypes.boolClass.rawType, false); | 794 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 795 } | 795 } |
| 796 for (var update in updates) { | 796 for (var update in updates) { |
| 797 inferrer.inferExpression(update, null, false); | 797 inferrer.inferExpression(update, null, false); |
| 798 } | 798 } |
| 799 inferrer.inferStatement(body); | 799 inferrer.inferStatement(body); |
| 800 inferrer.listener.forStatementExit(this); | 800 inferrer.listener.forStatementExit(this); |
| 801 } | 801 } |
| 802 } | 802 } |
| 803 | 803 |
| 804 /// Concrete shadow object representing a local function declaration in kernel | 804 /// Concrete shadow object representing a local function declaration in kernel |
| 805 /// form. | 805 /// form. |
| 806 class KernelFunctionDeclaration extends FunctionDeclaration | 806 class ShadowFunctionDeclaration extends FunctionDeclaration |
| 807 implements KernelStatement { | 807 implements ShadowStatement { |
| 808 bool _hasImplicitReturnType = false; | 808 bool _hasImplicitReturnType = false; |
| 809 | 809 |
| 810 KernelFunctionDeclaration(VariableDeclaration variable, FunctionNode function) | 810 ShadowFunctionDeclaration(VariableDeclaration variable, FunctionNode function) |
| 811 : super(variable, function); | 811 : super(variable, function); |
| 812 | 812 |
| 813 @override | 813 @override |
| 814 void _inferStatement(KernelTypeInferrer inferrer) { | 814 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 815 inferrer.listener.functionDeclarationEnter(this); | 815 inferrer.listener.functionDeclarationEnter(this); |
| 816 inferrer.inferLocalFunction(function, null, false, fileOffset, | 816 inferrer.inferLocalFunction(function, null, false, fileOffset, |
| 817 _hasImplicitReturnType ? null : function.returnType); | 817 _hasImplicitReturnType ? null : function.returnType); |
| 818 variable.type = function.functionType; | 818 variable.type = function.functionType; |
| 819 inferrer.listener.functionDeclarationExit(this); | 819 inferrer.listener.functionDeclarationExit(this); |
| 820 } | 820 } |
| 821 | 821 |
| 822 static void setHasImplicitReturnType( | 822 static void setHasImplicitReturnType( |
| 823 KernelFunctionDeclaration declaration, bool hasImplicitReturnType) { | 823 ShadowFunctionDeclaration declaration, bool hasImplicitReturnType) { |
| 824 declaration._hasImplicitReturnType = hasImplicitReturnType; | 824 declaration._hasImplicitReturnType = hasImplicitReturnType; |
| 825 } | 825 } |
| 826 } | 826 } |
| 827 | 827 |
| 828 /// Concrete shadow object representing a function expression in kernel form. | 828 /// Concrete shadow object representing a function expression in kernel form. |
| 829 class KernelFunctionExpression extends FunctionExpression | 829 class ShadowFunctionExpression extends FunctionExpression |
| 830 implements KernelExpression { | 830 implements ShadowExpression { |
| 831 KernelFunctionExpression(FunctionNode function) : super(function); | 831 ShadowFunctionExpression(FunctionNode function) : super(function); |
| 832 | 832 |
| 833 @override | 833 @override |
| 834 void _collectDependencies(KernelDependencyCollector collector) { | 834 void _collectDependencies(ShadowDependencyCollector collector) { |
| 835 for (KernelVariableDeclaration parameter in function.positionalParameters) { | 835 for (ShadowVariableDeclaration parameter in function.positionalParameters) { |
| 836 if (parameter._implicitlyTyped) { | 836 if (parameter._implicitlyTyped) { |
| 837 collector.recordNotImmediatelyEvident(parameter.fileOffset); | 837 collector.recordNotImmediatelyEvident(parameter.fileOffset); |
| 838 } | 838 } |
| 839 } | 839 } |
| 840 for (KernelVariableDeclaration parameter in function.namedParameters) { | 840 for (ShadowVariableDeclaration parameter in function.namedParameters) { |
| 841 if (parameter._implicitlyTyped) { | 841 if (parameter._implicitlyTyped) { |
| 842 collector.recordNotImmediatelyEvident(parameter.fileOffset); | 842 collector.recordNotImmediatelyEvident(parameter.fileOffset); |
| 843 } | 843 } |
| 844 } | 844 } |
| 845 var body = function.body; | 845 var body = function.body; |
| 846 if (body is ReturnStatement) { | 846 if (body is ReturnStatement) { |
| 847 // The inference dependencies are the inference dependencies of the return | 847 // The inference dependencies are the inference dependencies of the return |
| 848 // expression. | 848 // expression. |
| 849 collector.collectDependencies(body.expression); | 849 collector.collectDependencies(body.expression); |
| 850 } else { | 850 } else { |
| 851 collector.recordNotImmediatelyEvident(fileOffset); | 851 collector.recordNotImmediatelyEvident(fileOffset); |
| 852 } | 852 } |
| 853 } | 853 } |
| 854 | 854 |
| 855 @override | 855 @override |
| 856 DartType _inferExpression( | 856 DartType _inferExpression( |
| 857 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 857 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 858 typeNeeded = inferrer.listener.functionExpressionEnter(this, typeContext) || | 858 typeNeeded = inferrer.listener.functionExpressionEnter(this, typeContext) || |
| 859 typeNeeded; | 859 typeNeeded; |
| 860 var inferredType = inferrer.inferLocalFunction( | 860 var inferredType = inferrer.inferLocalFunction( |
| 861 function, typeContext, typeNeeded, fileOffset, null); | 861 function, typeContext, typeNeeded, fileOffset, null); |
| 862 inferrer.listener.functionExpressionExit(this, inferredType); | 862 inferrer.listener.functionExpressionExit(this, inferredType); |
| 863 return inferredType; | 863 return inferredType; |
| 864 } | 864 } |
| 865 } | 865 } |
| 866 | 866 |
| 867 /// Concrete shadow object representing an if-null expression. | 867 /// Concrete shadow object representing an if-null expression. |
| 868 /// | 868 /// |
| 869 /// An if-null expression of the form `a ?? b` is represented as the kernel | 869 /// An if-null expression of the form `a ?? b` is represented as the kernel |
| 870 /// expression: | 870 /// expression: |
| 871 /// | 871 /// |
| 872 /// let v = a in v == null ? b : v | 872 /// let v = a in v == null ? b : v |
| 873 class KernelIfNullExpression extends Let implements KernelExpression { | 873 class ShadowIfNullExpression extends Let implements ShadowExpression { |
| 874 KernelIfNullExpression(VariableDeclaration variable, Expression body) | 874 ShadowIfNullExpression(VariableDeclaration variable, Expression body) |
| 875 : super(variable, body); | 875 : super(variable, body); |
| 876 | 876 |
| 877 @override | 877 @override |
| 878 ConditionalExpression get body => super.body; | 878 ConditionalExpression get body => super.body; |
| 879 | 879 |
| 880 /// Returns the expression to the left of `??`. | 880 /// Returns the expression to the left of `??`. |
| 881 Expression get _lhs => variable.initializer; | 881 Expression get _lhs => variable.initializer; |
| 882 | 882 |
| 883 /// Returns the expression to the right of `??`. | 883 /// Returns the expression to the right of `??`. |
| 884 Expression get _rhs => body.then; | 884 Expression get _rhs => body.then; |
| 885 | 885 |
| 886 @override | 886 @override |
| 887 void _collectDependencies(KernelDependencyCollector collector) { | 887 void _collectDependencies(ShadowDependencyCollector collector) { |
| 888 // If-null expressions are not immediately evident expressions. | 888 // If-null expressions are not immediately evident expressions. |
| 889 collector.recordNotImmediatelyEvident(fileOffset); | 889 collector.recordNotImmediatelyEvident(fileOffset); |
| 890 } | 890 } |
| 891 | 891 |
| 892 @override | 892 @override |
| 893 DartType _inferExpression( | 893 DartType _inferExpression( |
| 894 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 894 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 895 typeNeeded = inferrer.listener.ifNullEnter(this, typeContext) || typeNeeded; | 895 typeNeeded = inferrer.listener.ifNullEnter(this, typeContext) || typeNeeded; |
| 896 // To infer `e0 ?? e1` in context K: | 896 // To infer `e0 ?? e1` in context K: |
| 897 // - Infer e0 in context K to get T0 | 897 // - Infer e0 in context K to get T0 |
| 898 var lhsType = inferrer.inferExpression(_lhs, typeContext, true); | 898 var lhsType = inferrer.inferExpression(_lhs, typeContext, true); |
| 899 if (inferrer.strongMode) { | 899 if (inferrer.strongMode) { |
| 900 variable.type = lhsType; | 900 variable.type = lhsType; |
| 901 } | 901 } |
| 902 // - Let J = T0 if K is `_` else K. | 902 // - Let J = T0 if K is `_` else K. |
| 903 var rhsContext = typeContext ?? lhsType; | 903 var rhsContext = typeContext ?? lhsType; |
| 904 // - Infer e1 in context J to get T1 | 904 // - Infer e1 in context J to get T1 |
| 905 var rhsType = | 905 var rhsType = |
| 906 inferrer.inferExpression(_rhs, rhsContext, typeContext == null); | 906 inferrer.inferExpression(_rhs, rhsContext, typeContext == null); |
| 907 // - Let T = greatest closure of K with respect to `?` if K is not `_`, else | 907 // - Let T = greatest closure of K with respect to `?` if K is not `_`, else |
| 908 // UP(t0, t1) | 908 // UP(t0, t1) |
| 909 // - Then the inferred type is T. | 909 // - Then the inferred type is T. |
| 910 var inferredType = typeContext == null | 910 var inferredType = typeContext == null |
| 911 ? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType) | 911 ? inferrer.typeSchemaEnvironment.getLeastUpperBound(lhsType, rhsType) |
| 912 : greatestClosure(inferrer.coreTypes, typeContext); | 912 : greatestClosure(inferrer.coreTypes, typeContext); |
| 913 if (inferrer.strongMode) { | 913 if (inferrer.strongMode) { |
| 914 body.staticType = inferredType; | 914 body.staticType = inferredType; |
| 915 } | 915 } |
| 916 inferrer.listener.ifNullExit(this, inferredType); | 916 inferrer.listener.ifNullExit(this, inferredType); |
| 917 return inferredType; | 917 return inferredType; |
| 918 } | 918 } |
| 919 } | 919 } |
| 920 | 920 |
| 921 /// Concrete shadow object representing an if statement in kernel form. | 921 /// Concrete shadow object representing an if statement in kernel form. |
| 922 class KernelIfStatement extends IfStatement implements KernelStatement { | 922 class ShadowIfStatement extends IfStatement implements ShadowStatement { |
| 923 KernelIfStatement(Expression condition, Statement then, Statement otherwise) | 923 ShadowIfStatement(Expression condition, Statement then, Statement otherwise) |
| 924 : super(condition, then, otherwise); | 924 : super(condition, then, otherwise); |
| 925 | 925 |
| 926 @override | 926 @override |
| 927 void _inferStatement(KernelTypeInferrer inferrer) { | 927 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 928 inferrer.listener.ifStatementEnter(this); | 928 inferrer.listener.ifStatementEnter(this); |
| 929 inferrer.inferExpression( | 929 inferrer.inferExpression( |
| 930 condition, inferrer.coreTypes.boolClass.rawType, false); | 930 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 931 inferrer.inferStatement(then); | 931 inferrer.inferStatement(then); |
| 932 if (otherwise != null) inferrer.inferStatement(otherwise); | 932 if (otherwise != null) inferrer.inferStatement(otherwise); |
| 933 inferrer.listener.ifStatementExit(this); | 933 inferrer.listener.ifStatementExit(this); |
| 934 } | 934 } |
| 935 } | 935 } |
| 936 | 936 |
| 937 /// Concrete shadow object representing an assignment to a target for which | 937 /// Concrete shadow object representing an assignment to a target for which |
| 938 /// assignment is not allowed. | 938 /// assignment is not allowed. |
| 939 class KernelIllegalAssignment extends KernelComplexAssignment { | 939 class ShadowIllegalAssignment extends ShadowComplexAssignment { |
| 940 KernelIllegalAssignment(Expression rhs) : super(rhs); | 940 ShadowIllegalAssignment(Expression rhs) : super(rhs); |
| 941 } | 941 } |
| 942 | 942 |
| 943 /// Concrete shadow object representing an assignment to a target of the form | 943 /// Concrete shadow object representing an assignment to a target of the form |
| 944 /// `a[b]`. | 944 /// `a[b]`. |
| 945 class KernelIndexAssign extends KernelComplexAssignmentWithReceiver { | 945 class ShadowIndexAssign extends ShadowComplexAssignmentWithReceiver { |
| 946 /// In an assignment to an index expression, the index expression. | 946 /// In an assignment to an index expression, the index expression. |
| 947 Expression index; | 947 Expression index; |
| 948 | 948 |
| 949 KernelIndexAssign(Expression receiver, this.index, Expression rhs, | 949 ShadowIndexAssign(Expression receiver, this.index, Expression rhs, |
| 950 {bool isSuper: false}) | 950 {bool isSuper: false}) |
| 951 : super(receiver, rhs, isSuper); | 951 : super(receiver, rhs, isSuper); |
| 952 | 952 |
| 953 @override | 953 @override |
| 954 List<String> _getToStringParts() { | 954 List<String> _getToStringParts() { |
| 955 var parts = super._getToStringParts(); | 955 var parts = super._getToStringParts(); |
| 956 if (index != null) parts.add('index=$index'); | 956 if (index != null) parts.add('index=$index'); |
| 957 return parts; | 957 return parts; |
| 958 } | 958 } |
| 959 | 959 |
| 960 @override | 960 @override |
| 961 DartType _inferExpression( | 961 DartType _inferExpression( |
| 962 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 962 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 963 typeNeeded = inferrer.listener.indexAssignEnter(desugared, typeContext) || | 963 typeNeeded = inferrer.listener.indexAssignEnter(desugared, typeContext) || |
| 964 typeNeeded; | 964 typeNeeded; |
| 965 // TODO(paulberry): record the appropriate types on let variables and | 965 // TODO(paulberry): record the appropriate types on let variables and |
| 966 // conditional expressions. | 966 // conditional expressions. |
| 967 var receiverType = _inferReceiver(inferrer); | 967 var receiverType = _inferReceiver(inferrer); |
| 968 if (read != null) { | 968 if (read != null) { |
| 969 inferrer.findMethodInvocationMember(receiverType, read, silent: true); | 969 inferrer.findMethodInvocationMember(receiverType, read, silent: true); |
| 970 } | 970 } |
| 971 var writeMember = inferrer.findMethodInvocationMember(receiverType, write); | 971 var writeMember = inferrer.findMethodInvocationMember(receiverType, write); |
| 972 // To replicate analyzer behavior, we base type inference on the write | 972 // To replicate analyzer behavior, we base type inference on the write |
| (...skipping 13 matching lines...) Expand all Loading... |
| 986 } | 986 } |
| 987 inferrer.inferExpression(index, indexContext, false); | 987 inferrer.inferExpression(index, indexContext, false); |
| 988 var inferredType = _inferRhs(inferrer, writeContext); | 988 var inferredType = _inferRhs(inferrer, writeContext); |
| 989 inferrer.listener.indexAssignExit(desugared, inferredType); | 989 inferrer.listener.indexAssignExit(desugared, inferredType); |
| 990 return inferredType; | 990 return inferredType; |
| 991 } | 991 } |
| 992 } | 992 } |
| 993 | 993 |
| 994 /// Common base class for shadow objects representing initializers in kernel | 994 /// Common base class for shadow objects representing initializers in kernel |
| 995 /// form. | 995 /// form. |
| 996 abstract class KernelInitializer implements Initializer { | 996 abstract class ShadowInitializer implements Initializer { |
| 997 /// Performs type inference for whatever concrete type of [KernelInitializer] | 997 /// Performs type inference for whatever concrete type of [ShadowInitializer] |
| 998 /// this is. | 998 /// this is. |
| 999 void _inferInitializer(KernelTypeInferrer inferrer); | 999 void _inferInitializer(ShadowTypeInferrer inferrer); |
| 1000 } | 1000 } |
| 1001 | 1001 |
| 1002 /// Concrete shadow object representing an integer literal in kernel form. | 1002 /// Concrete shadow object representing an integer literal in kernel form. |
| 1003 class KernelIntLiteral extends IntLiteral implements KernelExpression { | 1003 class ShadowIntLiteral extends IntLiteral implements ShadowExpression { |
| 1004 KernelIntLiteral(int value) : super(value); | 1004 ShadowIntLiteral(int value) : super(value); |
| 1005 | 1005 |
| 1006 @override | 1006 @override |
| 1007 void _collectDependencies(KernelDependencyCollector collector) { | 1007 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1008 // No inference dependencies. | 1008 // No inference dependencies. |
| 1009 } | 1009 } |
| 1010 | 1010 |
| 1011 @override | 1011 @override |
| 1012 DartType _inferExpression( | 1012 DartType _inferExpression( |
| 1013 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1013 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1014 typeNeeded = | 1014 typeNeeded = |
| 1015 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded; | 1015 inferrer.listener.intLiteralEnter(this, typeContext) || typeNeeded; |
| 1016 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null; | 1016 var inferredType = typeNeeded ? inferrer.coreTypes.intClass.rawType : null; |
| 1017 inferrer.listener.intLiteralExit(this, inferredType); | 1017 inferrer.listener.intLiteralExit(this, inferredType); |
| 1018 return inferredType; | 1018 return inferredType; |
| 1019 } | 1019 } |
| 1020 } | 1020 } |
| 1021 | 1021 |
| 1022 /// Concrete shadow object representing an invalid initializer in kernel form. | 1022 /// Concrete shadow object representing an invalid initializer in kernel form. |
| 1023 class KernelInvalidInitializer extends LocalInitializer | 1023 class ShadowInvalidInitializer extends LocalInitializer |
| 1024 implements KernelInitializer { | 1024 implements ShadowInitializer { |
| 1025 KernelInvalidInitializer(VariableDeclaration variable) : super(variable); | 1025 ShadowInvalidInitializer(VariableDeclaration variable) : super(variable); |
| 1026 | 1026 |
| 1027 @override | 1027 @override |
| 1028 void _inferInitializer(KernelTypeInferrer inferrer) { | 1028 void _inferInitializer(ShadowTypeInferrer inferrer) { |
| 1029 inferrer.listener.invalidInitializerEnter(this); | 1029 inferrer.listener.invalidInitializerEnter(this); |
| 1030 inferrer.inferExpression(variable.initializer, null, false); | 1030 inferrer.inferExpression(variable.initializer, null, false); |
| 1031 inferrer.listener.invalidInitializerExit(this); | 1031 inferrer.listener.invalidInitializerExit(this); |
| 1032 } | 1032 } |
| 1033 } | 1033 } |
| 1034 | 1034 |
| 1035 /// Concrete shadow object representing a non-inverted "is" test in kernel form. | 1035 /// Concrete shadow object representing a non-inverted "is" test in kernel form. |
| 1036 class KernelIsExpression extends IsExpression implements KernelExpression { | 1036 class ShadowIsExpression extends IsExpression implements ShadowExpression { |
| 1037 KernelIsExpression(Expression operand, DartType type) : super(operand, type); | 1037 ShadowIsExpression(Expression operand, DartType type) : super(operand, type); |
| 1038 | 1038 |
| 1039 @override | 1039 @override |
| 1040 void _collectDependencies(KernelDependencyCollector collector) { | 1040 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1041 // No inference dependencies. | 1041 // No inference dependencies. |
| 1042 } | 1042 } |
| 1043 | 1043 |
| 1044 @override | 1044 @override |
| 1045 DartType _inferExpression( | 1045 DartType _inferExpression( |
| 1046 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1046 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1047 typeNeeded = | 1047 typeNeeded = |
| 1048 inferrer.listener.isExpressionEnter(this, typeContext) || typeNeeded; | 1048 inferrer.listener.isExpressionEnter(this, typeContext) || typeNeeded; |
| 1049 inferrer.inferExpression(operand, null, false); | 1049 inferrer.inferExpression(operand, null, false); |
| 1050 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; | 1050 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; |
| 1051 inferrer.listener.isExpressionExit(this, inferredType); | 1051 inferrer.listener.isExpressionExit(this, inferredType); |
| 1052 return inferredType; | 1052 return inferredType; |
| 1053 } | 1053 } |
| 1054 } | 1054 } |
| 1055 | 1055 |
| 1056 /// Concrete shadow object representing an inverted "is" test in kernel form. | 1056 /// Concrete shadow object representing an inverted "is" test in kernel form. |
| 1057 class KernelIsNotExpression extends Not implements KernelExpression { | 1057 class ShadowIsNotExpression extends Not implements ShadowExpression { |
| 1058 KernelIsNotExpression(Expression operand, DartType type, int charOffset) | 1058 ShadowIsNotExpression(Expression operand, DartType type, int charOffset) |
| 1059 : super(new IsExpression(operand, type)..fileOffset = charOffset); | 1059 : super(new IsExpression(operand, type)..fileOffset = charOffset); |
| 1060 | 1060 |
| 1061 @override | 1061 @override |
| 1062 void _collectDependencies(KernelDependencyCollector collector) { | 1062 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1063 // No inference dependencies. | 1063 // No inference dependencies. |
| 1064 } | 1064 } |
| 1065 | 1065 |
| 1066 @override | 1066 @override |
| 1067 DartType _inferExpression( | 1067 DartType _inferExpression( |
| 1068 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1068 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1069 IsExpression isExpression = this.operand; | 1069 IsExpression isExpression = this.operand; |
| 1070 typeNeeded = | 1070 typeNeeded = |
| 1071 inferrer.listener.isNotExpressionEnter(this, typeContext) || typeNeeded; | 1071 inferrer.listener.isNotExpressionEnter(this, typeContext) || typeNeeded; |
| 1072 inferrer.inferExpression(isExpression.operand, null, false); | 1072 inferrer.inferExpression(isExpression.operand, null, false); |
| 1073 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; | 1073 var inferredType = typeNeeded ? inferrer.coreTypes.boolClass.rawType : null; |
| 1074 inferrer.listener.isNotExpressionExit(this, inferredType); | 1074 inferrer.listener.isNotExpressionExit(this, inferredType); |
| 1075 return inferredType; | 1075 return inferredType; |
| 1076 } | 1076 } |
| 1077 } | 1077 } |
| 1078 | 1078 |
| 1079 /// Concrete shadow object representing a labeled statement in kernel form. | 1079 /// Concrete shadow object representing a labeled statement in kernel form. |
| 1080 class KernelLabeledStatement extends LabeledStatement | 1080 class ShadowLabeledStatement extends LabeledStatement |
| 1081 implements KernelStatement { | 1081 implements ShadowStatement { |
| 1082 KernelLabeledStatement(Statement body) : super(body); | 1082 ShadowLabeledStatement(Statement body) : super(body); |
| 1083 | 1083 |
| 1084 @override | 1084 @override |
| 1085 void _inferStatement(KernelTypeInferrer inferrer) { | 1085 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 1086 inferrer.listener.labeledStatementEnter(this); | 1086 inferrer.listener.labeledStatementEnter(this); |
| 1087 inferrer.inferStatement(body); | 1087 inferrer.inferStatement(body); |
| 1088 inferrer.listener.labeledStatementExit(this); | 1088 inferrer.listener.labeledStatementExit(this); |
| 1089 } | 1089 } |
| 1090 } | 1090 } |
| 1091 | 1091 |
| 1092 /// Concrete shadow object representing a list literal in kernel form. | 1092 /// Concrete shadow object representing a list literal in kernel form. |
| 1093 class KernelListLiteral extends ListLiteral implements KernelExpression { | 1093 class ShadowListLiteral extends ListLiteral implements ShadowExpression { |
| 1094 final DartType _declaredTypeArgument; | 1094 final DartType _declaredTypeArgument; |
| 1095 | 1095 |
| 1096 KernelListLiteral(List<Expression> expressions, | 1096 ShadowListLiteral(List<Expression> expressions, |
| 1097 {DartType typeArgument, bool isConst: false}) | 1097 {DartType typeArgument, bool isConst: false}) |
| 1098 : _declaredTypeArgument = typeArgument, | 1098 : _declaredTypeArgument = typeArgument, |
| 1099 super(expressions, | 1099 super(expressions, |
| 1100 typeArgument: typeArgument ?? const DynamicType(), | 1100 typeArgument: typeArgument ?? const DynamicType(), |
| 1101 isConst: isConst); | 1101 isConst: isConst); |
| 1102 | 1102 |
| 1103 @override | 1103 @override |
| 1104 void _collectDependencies(KernelDependencyCollector collector) { | 1104 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1105 if (_declaredTypeArgument == null) { | 1105 if (_declaredTypeArgument == null) { |
| 1106 expressions.forEach(collector.collectDependencies); | 1106 expressions.forEach(collector.collectDependencies); |
| 1107 } | 1107 } |
| 1108 } | 1108 } |
| 1109 | 1109 |
| 1110 @override | 1110 @override |
| 1111 DartType _inferExpression( | 1111 DartType _inferExpression( |
| 1112 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1112 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1113 typeNeeded = | 1113 typeNeeded = |
| 1114 inferrer.listener.listLiteralEnter(this, typeContext) || typeNeeded; | 1114 inferrer.listener.listLiteralEnter(this, typeContext) || typeNeeded; |
| 1115 var listClass = inferrer.coreTypes.listClass; | 1115 var listClass = inferrer.coreTypes.listClass; |
| 1116 var listType = listClass.thisType; | 1116 var listType = listClass.thisType; |
| 1117 List<DartType> inferredTypes; | 1117 List<DartType> inferredTypes; |
| 1118 DartType inferredTypeArgument; | 1118 DartType inferredTypeArgument; |
| 1119 List<DartType> formalTypes; | 1119 List<DartType> formalTypes; |
| 1120 List<DartType> actualTypes; | 1120 List<DartType> actualTypes; |
| 1121 bool inferenceNeeded = _declaredTypeArgument == null && inferrer.strongMode; | 1121 bool inferenceNeeded = _declaredTypeArgument == null && inferrer.strongMode; |
| 1122 if (inferenceNeeded) { | 1122 if (inferenceNeeded) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1157 } | 1157 } |
| 1158 var inferredType = typeNeeded | 1158 var inferredType = typeNeeded |
| 1159 ? new InterfaceType(listClass, [inferredTypeArgument]) | 1159 ? new InterfaceType(listClass, [inferredTypeArgument]) |
| 1160 : null; | 1160 : null; |
| 1161 inferrer.listener.listLiteralExit(this, inferredType); | 1161 inferrer.listener.listLiteralExit(this, inferredType); |
| 1162 return inferredType; | 1162 return inferredType; |
| 1163 } | 1163 } |
| 1164 } | 1164 } |
| 1165 | 1165 |
| 1166 /// Shadow object for [LogicalExpression]. | 1166 /// Shadow object for [LogicalExpression]. |
| 1167 class KernelLogicalExpression extends LogicalExpression | 1167 class ShadowLogicalExpression extends LogicalExpression |
| 1168 implements KernelExpression { | 1168 implements ShadowExpression { |
| 1169 KernelLogicalExpression(Expression left, String operator, Expression right) | 1169 ShadowLogicalExpression(Expression left, String operator, Expression right) |
| 1170 : super(left, operator, right); | 1170 : super(left, operator, right); |
| 1171 | 1171 |
| 1172 @override | 1172 @override |
| 1173 void _collectDependencies(KernelDependencyCollector collector) { | 1173 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1174 // No inference dependencies. | 1174 // No inference dependencies. |
| 1175 } | 1175 } |
| 1176 | 1176 |
| 1177 @override | 1177 @override |
| 1178 DartType _inferExpression( | 1178 DartType _inferExpression( |
| 1179 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1179 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1180 typeNeeded = inferrer.listener.logicalExpressionEnter(this, typeContext) || | 1180 typeNeeded = inferrer.listener.logicalExpressionEnter(this, typeContext) || |
| 1181 typeNeeded; | 1181 typeNeeded; |
| 1182 var boolType = inferrer.coreTypes.boolClass.rawType; | 1182 var boolType = inferrer.coreTypes.boolClass.rawType; |
| 1183 inferrer.inferExpression(left, boolType, false); | 1183 inferrer.inferExpression(left, boolType, false); |
| 1184 inferrer.inferExpression(right, boolType, false); | 1184 inferrer.inferExpression(right, boolType, false); |
| 1185 var inferredType = typeNeeded ? boolType : null; | 1185 var inferredType = typeNeeded ? boolType : null; |
| 1186 inferrer.listener.logicalExpressionExit(this, inferredType); | 1186 inferrer.listener.logicalExpressionExit(this, inferredType); |
| 1187 return inferredType; | 1187 return inferredType; |
| 1188 } | 1188 } |
| 1189 } | 1189 } |
| 1190 | 1190 |
| 1191 /// Shadow object for [MapLiteral]. | 1191 /// Shadow object for [MapLiteral]. |
| 1192 class KernelMapLiteral extends MapLiteral implements KernelExpression { | 1192 class ShadowMapLiteral extends MapLiteral implements ShadowExpression { |
| 1193 final DartType _declaredKeyType; | 1193 final DartType _declaredKeyType; |
| 1194 final DartType _declaredValueType; | 1194 final DartType _declaredValueType; |
| 1195 | 1195 |
| 1196 KernelMapLiteral(List<MapEntry> entries, | 1196 ShadowMapLiteral(List<MapEntry> entries, |
| 1197 {DartType keyType, DartType valueType, bool isConst: false}) | 1197 {DartType keyType, DartType valueType, bool isConst: false}) |
| 1198 : _declaredKeyType = keyType, | 1198 : _declaredKeyType = keyType, |
| 1199 _declaredValueType = valueType, | 1199 _declaredValueType = valueType, |
| 1200 super(entries, | 1200 super(entries, |
| 1201 keyType: keyType ?? const DynamicType(), | 1201 keyType: keyType ?? const DynamicType(), |
| 1202 valueType: valueType ?? const DynamicType(), | 1202 valueType: valueType ?? const DynamicType(), |
| 1203 isConst: isConst); | 1203 isConst: isConst); |
| 1204 | 1204 |
| 1205 @override | 1205 @override |
| 1206 void _collectDependencies(KernelDependencyCollector collector) { | 1206 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1207 assert((_declaredKeyType == null) == (_declaredValueType == null)); | 1207 assert((_declaredKeyType == null) == (_declaredValueType == null)); |
| 1208 if (_declaredKeyType == null) { | 1208 if (_declaredKeyType == null) { |
| 1209 for (var entry in entries) { | 1209 for (var entry in entries) { |
| 1210 collector.collectDependencies(entry.key); | 1210 collector.collectDependencies(entry.key); |
| 1211 collector.collectDependencies(entry.value); | 1211 collector.collectDependencies(entry.value); |
| 1212 } | 1212 } |
| 1213 } | 1213 } |
| 1214 } | 1214 } |
| 1215 | 1215 |
| 1216 @override | 1216 @override |
| 1217 DartType _inferExpression( | 1217 DartType _inferExpression( |
| 1218 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1218 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1219 typeNeeded = | 1219 typeNeeded = |
| 1220 inferrer.listener.mapLiteralEnter(this, typeContext) || typeNeeded; | 1220 inferrer.listener.mapLiteralEnter(this, typeContext) || typeNeeded; |
| 1221 var mapClass = inferrer.coreTypes.mapClass; | 1221 var mapClass = inferrer.coreTypes.mapClass; |
| 1222 var mapType = mapClass.thisType; | 1222 var mapType = mapClass.thisType; |
| 1223 List<DartType> inferredTypes; | 1223 List<DartType> inferredTypes; |
| 1224 DartType inferredKeyType; | 1224 DartType inferredKeyType; |
| 1225 DartType inferredValueType; | 1225 DartType inferredValueType; |
| 1226 List<DartType> formalTypes; | 1226 List<DartType> formalTypes; |
| 1227 List<DartType> actualTypes; | 1227 List<DartType> actualTypes; |
| 1228 assert((_declaredKeyType == null) == (_declaredValueType == null)); | 1228 assert((_declaredKeyType == null) == (_declaredValueType == null)); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 } | 1273 } |
| 1274 var inferredType = typeNeeded | 1274 var inferredType = typeNeeded |
| 1275 ? new InterfaceType(mapClass, [inferredKeyType, inferredValueType]) | 1275 ? new InterfaceType(mapClass, [inferredKeyType, inferredValueType]) |
| 1276 : null; | 1276 : null; |
| 1277 inferrer.listener.mapLiteralExit(this, inferredType); | 1277 inferrer.listener.mapLiteralExit(this, inferredType); |
| 1278 return inferredType; | 1278 return inferredType; |
| 1279 } | 1279 } |
| 1280 } | 1280 } |
| 1281 | 1281 |
| 1282 /// Abstract shadow object representing a field or procedure in kernel form. | 1282 /// Abstract shadow object representing a field or procedure in kernel form. |
| 1283 abstract class KernelMember implements Member { | 1283 abstract class ShadowMember implements Member { |
| 1284 String get fileUri; | 1284 String get fileUri; |
| 1285 | 1285 |
| 1286 AccessorNode get _accessorNode; | 1286 AccessorNode get _accessorNode; |
| 1287 | 1287 |
| 1288 void set _accessorNode(AccessorNode value); | 1288 void set _accessorNode(AccessorNode value); |
| 1289 | 1289 |
| 1290 KernelTypeInferrer get _typeInferrer; | 1290 ShadowTypeInferrer get _typeInferrer; |
| 1291 | 1291 |
| 1292 void set _typeInferrer(KernelTypeInferrer value); | 1292 void set _typeInferrer(ShadowTypeInferrer value); |
| 1293 | 1293 |
| 1294 void setInferredType( | 1294 void setInferredType( |
| 1295 TypeInferenceEngineImpl engine, String uri, DartType inferredType); | 1295 TypeInferenceEngineImpl engine, String uri, DartType inferredType); |
| 1296 | 1296 |
| 1297 static AccessorNode getAccessorNode(Member member) { | 1297 static AccessorNode getAccessorNode(Member member) { |
| 1298 if (member is KernelMember) return member._accessorNode; | 1298 if (member is ShadowMember) return member._accessorNode; |
| 1299 return null; | 1299 return null; |
| 1300 } | 1300 } |
| 1301 | 1301 |
| 1302 static void recordCrossOverride( | 1302 static void recordCrossOverride( |
| 1303 KernelMember member, Member overriddenMember) { | 1303 ShadowMember member, Member overriddenMember) { |
| 1304 if (member._accessorNode != null) { | 1304 if (member._accessorNode != null) { |
| 1305 member._accessorNode.crossOverrides.add(overriddenMember); | 1305 member._accessorNode.crossOverrides.add(overriddenMember); |
| 1306 } | 1306 } |
| 1307 } | 1307 } |
| 1308 | 1308 |
| 1309 static void recordOverride(KernelMember member, Member overriddenMember) { | 1309 static void recordOverride(ShadowMember member, Member overriddenMember) { |
| 1310 if (member._accessorNode != null) { | 1310 if (member._accessorNode != null) { |
| 1311 member._accessorNode.overrides.add(overriddenMember); | 1311 member._accessorNode.overrides.add(overriddenMember); |
| 1312 } | 1312 } |
| 1313 if (member is KernelProcedure && member._methodNode != null) { | 1313 if (member is ShadowProcedure && member._methodNode != null) { |
| 1314 member._methodNode.overrides.add(overriddenMember); | 1314 member._methodNode.overrides.add(overriddenMember); |
| 1315 } | 1315 } |
| 1316 } | 1316 } |
| 1317 } | 1317 } |
| 1318 | 1318 |
| 1319 /// Shadow object for [MethodInvocation]. | 1319 /// Shadow object for [MethodInvocation]. |
| 1320 class KernelMethodInvocation extends MethodInvocation | 1320 class ShadowMethodInvocation extends MethodInvocation |
| 1321 implements KernelExpression { | 1321 implements ShadowExpression { |
| 1322 /// Indicates whether this method invocation is a call to a `call` method | 1322 /// Indicates whether this method invocation is a call to a `call` method |
| 1323 /// resulting from the invocation of a function expression. | 1323 /// resulting from the invocation of a function expression. |
| 1324 final bool _isImplicitCall; | 1324 final bool _isImplicitCall; |
| 1325 | 1325 |
| 1326 KernelMethodInvocation(Expression receiver, Name name, Arguments arguments, | 1326 ShadowMethodInvocation(Expression receiver, Name name, Arguments arguments, |
| 1327 {bool isImplicitCall: false, Member interfaceTarget}) | 1327 {bool isImplicitCall: false, Member interfaceTarget}) |
| 1328 : _isImplicitCall = isImplicitCall, | 1328 : _isImplicitCall = isImplicitCall, |
| 1329 super(receiver, name, arguments, interfaceTarget); | 1329 super(receiver, name, arguments, interfaceTarget); |
| 1330 | 1330 |
| 1331 @override | 1331 @override |
| 1332 void _collectDependencies(KernelDependencyCollector collector) { | 1332 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1333 // The inference dependencies are the inference dependencies of the | 1333 // The inference dependencies are the inference dependencies of the |
| 1334 // receiver. | 1334 // receiver. |
| 1335 collector.collectDependencies(receiver); | 1335 collector.collectDependencies(receiver); |
| 1336 if (isOverloadableArithmeticOperator(name.name)) { | 1336 if (isOverloadableArithmeticOperator(name.name)) { |
| 1337 collector.collectDependencies(arguments.positional[0]); | 1337 collector.collectDependencies(arguments.positional[0]); |
| 1338 } | 1338 } |
| 1339 } | 1339 } |
| 1340 | 1340 |
| 1341 @override | 1341 @override |
| 1342 DartType _inferExpression( | 1342 DartType _inferExpression( |
| 1343 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1343 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1344 return inferrer.inferMethodInvocation( | 1344 return inferrer.inferMethodInvocation( |
| 1345 this, receiver, fileOffset, _isImplicitCall, typeContext, typeNeeded, | 1345 this, receiver, fileOffset, _isImplicitCall, typeContext, typeNeeded, |
| 1346 desugaredInvocation: this); | 1346 desugaredInvocation: this); |
| 1347 } | 1347 } |
| 1348 } | 1348 } |
| 1349 | 1349 |
| 1350 /// Concrete shadow object representing a named function expression. | 1350 /// Concrete shadow object representing a named function expression. |
| 1351 /// | 1351 /// |
| 1352 /// Named function expressions are not legal in Dart, but they are accepted by | 1352 /// Named function expressions are not legal in Dart, but they are accepted by |
| 1353 /// the parser and BodyBuilder for error recovery purposes. | 1353 /// the parser and BodyBuilder for error recovery purposes. |
| 1354 /// | 1354 /// |
| 1355 /// A named function expression of the form `f() { ... }` is represented as the | 1355 /// A named function expression of the form `f() { ... }` is represented as the |
| 1356 /// kernel expression: | 1356 /// kernel expression: |
| 1357 /// | 1357 /// |
| 1358 /// let f = () { ... } in f | 1358 /// let f = () { ... } in f |
| 1359 class KernelNamedFunctionExpression extends Let implements KernelExpression { | 1359 class ShadowNamedFunctionExpression extends Let implements ShadowExpression { |
| 1360 KernelNamedFunctionExpression(VariableDeclaration variable) | 1360 ShadowNamedFunctionExpression(VariableDeclaration variable) |
| 1361 : super(variable, new VariableGet(variable)); | 1361 : super(variable, new VariableGet(variable)); |
| 1362 | 1362 |
| 1363 @override | 1363 @override |
| 1364 void _collectDependencies(KernelDependencyCollector collector) { | 1364 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1365 collector.collectDependencies(variable.initializer); | 1365 collector.collectDependencies(variable.initializer); |
| 1366 } | 1366 } |
| 1367 | 1367 |
| 1368 @override | 1368 @override |
| 1369 DartType _inferExpression( | 1369 DartType _inferExpression( |
| 1370 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1370 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1371 typeNeeded = | 1371 typeNeeded = |
| 1372 inferrer.listener.namedFunctionExpressionEnter(this, typeContext) || | 1372 inferrer.listener.namedFunctionExpressionEnter(this, typeContext) || |
| 1373 typeNeeded; | 1373 typeNeeded; |
| 1374 var inferredType = | 1374 var inferredType = |
| 1375 inferrer.inferExpression(variable.initializer, typeContext, true); | 1375 inferrer.inferExpression(variable.initializer, typeContext, true); |
| 1376 if (inferrer.strongMode) variable.type = inferredType; | 1376 if (inferrer.strongMode) variable.type = inferredType; |
| 1377 if (!typeNeeded) inferredType = null; | 1377 if (!typeNeeded) inferredType = null; |
| 1378 inferrer.listener.namedFunctionExpressionExit(this, inferredType); | 1378 inferrer.listener.namedFunctionExpressionExit(this, inferredType); |
| 1379 return inferredType; | 1379 return inferredType; |
| 1380 } | 1380 } |
| 1381 } | 1381 } |
| 1382 | 1382 |
| 1383 /// Shadow object for [Not]. | 1383 /// Shadow object for [Not]. |
| 1384 class KernelNot extends Not implements KernelExpression { | 1384 class ShadowNot extends Not implements ShadowExpression { |
| 1385 KernelNot(Expression operand) : super(operand); | 1385 ShadowNot(Expression operand) : super(operand); |
| 1386 | 1386 |
| 1387 @override | 1387 @override |
| 1388 void _collectDependencies(KernelDependencyCollector collector) { | 1388 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1389 collector.collectDependencies(operand); | 1389 collector.collectDependencies(operand); |
| 1390 } | 1390 } |
| 1391 | 1391 |
| 1392 @override | 1392 @override |
| 1393 DartType _inferExpression( | 1393 DartType _inferExpression( |
| 1394 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1394 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1395 typeNeeded = inferrer.listener.notEnter(this, typeContext) || typeNeeded; | 1395 typeNeeded = inferrer.listener.notEnter(this, typeContext) || typeNeeded; |
| 1396 // First infer the receiver so we can look up the method that was invoked. | 1396 // First infer the receiver so we can look up the method that was invoked. |
| 1397 var boolType = inferrer.coreTypes.boolClass.rawType; | 1397 var boolType = inferrer.coreTypes.boolClass.rawType; |
| 1398 inferrer.inferExpression(operand, boolType, false); | 1398 inferrer.inferExpression(operand, boolType, false); |
| 1399 DartType inferredType = typeNeeded ? boolType : null; | 1399 DartType inferredType = typeNeeded ? boolType : null; |
| 1400 inferrer.listener.notExit(this, inferredType); | 1400 inferrer.listener.notExit(this, inferredType); |
| 1401 return inferredType; | 1401 return inferredType; |
| 1402 } | 1402 } |
| 1403 } | 1403 } |
| 1404 | 1404 |
| 1405 /// Concrete shadow object representing a null-aware method invocation. | 1405 /// Concrete shadow object representing a null-aware method invocation. |
| 1406 /// | 1406 /// |
| 1407 /// A null-aware method invocation of the form `a?.b(...)` is represented as the | 1407 /// A null-aware method invocation of the form `a?.b(...)` is represented as the |
| 1408 /// expression: | 1408 /// expression: |
| 1409 /// | 1409 /// |
| 1410 /// let v = a in v == null ? null : v.b(...) | 1410 /// let v = a in v == null ? null : v.b(...) |
| 1411 class KernelNullAwareMethodInvocation extends Let implements KernelExpression { | 1411 class ShadowNullAwareMethodInvocation extends Let implements ShadowExpression { |
| 1412 KernelNullAwareMethodInvocation(VariableDeclaration variable, Expression body) | 1412 ShadowNullAwareMethodInvocation(VariableDeclaration variable, Expression body) |
| 1413 : super(variable, body); | 1413 : super(variable, body); |
| 1414 | 1414 |
| 1415 @override | 1415 @override |
| 1416 ConditionalExpression get body => super.body; | 1416 ConditionalExpression get body => super.body; |
| 1417 | 1417 |
| 1418 MethodInvocation get _desugaredInvocation => body.otherwise; | 1418 MethodInvocation get _desugaredInvocation => body.otherwise; |
| 1419 | 1419 |
| 1420 @override | 1420 @override |
| 1421 void _collectDependencies(KernelDependencyCollector collector) { | 1421 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1422 // Null aware expressions are not immediately evident. | 1422 // Null aware expressions are not immediately evident. |
| 1423 collector.recordNotImmediatelyEvident(fileOffset); | 1423 collector.recordNotImmediatelyEvident(fileOffset); |
| 1424 } | 1424 } |
| 1425 | 1425 |
| 1426 @override | 1426 @override |
| 1427 DartType _inferExpression( | 1427 DartType _inferExpression( |
| 1428 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1428 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1429 var inferredType = inferrer.inferMethodInvocation( | 1429 var inferredType = inferrer.inferMethodInvocation( |
| 1430 this, | 1430 this, |
| 1431 variable.initializer, | 1431 variable.initializer, |
| 1432 fileOffset, | 1432 fileOffset, |
| 1433 false, | 1433 false, |
| 1434 typeContext, | 1434 typeContext, |
| 1435 typeNeeded || inferrer.strongMode, | 1435 typeNeeded || inferrer.strongMode, |
| 1436 receiverVariable: variable, | 1436 receiverVariable: variable, |
| 1437 desugaredInvocation: _desugaredInvocation); | 1437 desugaredInvocation: _desugaredInvocation); |
| 1438 if (inferrer.strongMode) { | 1438 if (inferrer.strongMode) { |
| 1439 body.staticType = inferredType; | 1439 body.staticType = inferredType; |
| 1440 } | 1440 } |
| 1441 return inferredType; | 1441 return inferredType; |
| 1442 } | 1442 } |
| 1443 } | 1443 } |
| 1444 | 1444 |
| 1445 /// Concrete shadow object representing a null-aware read from a property. | 1445 /// Concrete shadow object representing a null-aware read from a property. |
| 1446 /// | 1446 /// |
| 1447 /// A null-aware property get of the form `a?.b` is represented as the kernel | 1447 /// A null-aware property get of the form `a?.b` is represented as the kernel |
| 1448 /// expression: | 1448 /// expression: |
| 1449 /// | 1449 /// |
| 1450 /// let v = a in v == null ? null : v.b | 1450 /// let v = a in v == null ? null : v.b |
| 1451 class KernelNullAwarePropertyGet extends Let implements KernelExpression { | 1451 class ShadowNullAwarePropertyGet extends Let implements ShadowExpression { |
| 1452 KernelNullAwarePropertyGet( | 1452 ShadowNullAwarePropertyGet( |
| 1453 VariableDeclaration variable, ConditionalExpression body) | 1453 VariableDeclaration variable, ConditionalExpression body) |
| 1454 : super(variable, body); | 1454 : super(variable, body); |
| 1455 | 1455 |
| 1456 @override | 1456 @override |
| 1457 ConditionalExpression get body => super.body; | 1457 ConditionalExpression get body => super.body; |
| 1458 | 1458 |
| 1459 PropertyGet get _desugaredGet => body.otherwise; | 1459 PropertyGet get _desugaredGet => body.otherwise; |
| 1460 | 1460 |
| 1461 @override | 1461 @override |
| 1462 void _collectDependencies(KernelDependencyCollector collector) { | 1462 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1463 // Null aware expressions are not immediately evident. | 1463 // Null aware expressions are not immediately evident. |
| 1464 collector.recordNotImmediatelyEvident(fileOffset); | 1464 collector.recordNotImmediatelyEvident(fileOffset); |
| 1465 } | 1465 } |
| 1466 | 1466 |
| 1467 @override | 1467 @override |
| 1468 DartType _inferExpression( | 1468 DartType _inferExpression( |
| 1469 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1469 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1470 var inferredType = inferrer.inferPropertyGet(this, variable.initializer, | 1470 var inferredType = inferrer.inferPropertyGet(this, variable.initializer, |
| 1471 fileOffset, typeContext, typeNeeded || inferrer.strongMode, | 1471 fileOffset, typeContext, typeNeeded || inferrer.strongMode, |
| 1472 receiverVariable: variable, desugaredGet: _desugaredGet); | 1472 receiverVariable: variable, desugaredGet: _desugaredGet); |
| 1473 if (inferrer.strongMode) { | 1473 if (inferrer.strongMode) { |
| 1474 body.staticType = inferredType; | 1474 body.staticType = inferredType; |
| 1475 } | 1475 } |
| 1476 return inferredType; | 1476 return inferredType; |
| 1477 } | 1477 } |
| 1478 } | 1478 } |
| 1479 | 1479 |
| 1480 /// Concrete shadow object representing a null literal in kernel form. | 1480 /// Concrete shadow object representing a null literal in kernel form. |
| 1481 class KernelNullLiteral extends NullLiteral implements KernelExpression { | 1481 class ShadowNullLiteral extends NullLiteral implements ShadowExpression { |
| 1482 @override | 1482 @override |
| 1483 void _collectDependencies(KernelDependencyCollector collector) { | 1483 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1484 // No inference dependencies. | 1484 // No inference dependencies. |
| 1485 } | 1485 } |
| 1486 | 1486 |
| 1487 @override | 1487 @override |
| 1488 DartType _inferExpression( | 1488 DartType _inferExpression( |
| 1489 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1489 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1490 typeNeeded = | 1490 typeNeeded = |
| 1491 inferrer.listener.nullLiteralEnter(this, typeContext) || typeNeeded; | 1491 inferrer.listener.nullLiteralEnter(this, typeContext) || typeNeeded; |
| 1492 var inferredType = typeNeeded ? inferrer.coreTypes.nullClass.rawType : null; | 1492 var inferredType = typeNeeded ? inferrer.coreTypes.nullClass.rawType : null; |
| 1493 inferrer.listener.nullLiteralExit(this, inferredType); | 1493 inferrer.listener.nullLiteralExit(this, inferredType); |
| 1494 return inferredType; | 1494 return inferredType; |
| 1495 } | 1495 } |
| 1496 } | 1496 } |
| 1497 | 1497 |
| 1498 /// Concrete shadow object representing a procedure in kernel form. | 1498 /// Concrete shadow object representing a procedure in kernel form. |
| 1499 class KernelProcedure extends Procedure implements KernelMember { | 1499 class ShadowProcedure extends Procedure implements ShadowMember { |
| 1500 @override | 1500 @override |
| 1501 AccessorNode _accessorNode; | 1501 AccessorNode _accessorNode; |
| 1502 | 1502 |
| 1503 MethodNode _methodNode; | 1503 MethodNode _methodNode; |
| 1504 | 1504 |
| 1505 @override | 1505 @override |
| 1506 KernelTypeInferrer _typeInferrer; | 1506 ShadowTypeInferrer _typeInferrer; |
| 1507 | 1507 |
| 1508 final bool _hasImplicitReturnType; | 1508 final bool _hasImplicitReturnType; |
| 1509 | 1509 |
| 1510 KernelProcedure(Name name, ProcedureKind kind, FunctionNode function, | 1510 ShadowProcedure(Name name, ProcedureKind kind, FunctionNode function, |
| 1511 this._hasImplicitReturnType, | 1511 this._hasImplicitReturnType, |
| 1512 {String fileUri}) | 1512 {String fileUri}) |
| 1513 : super(name, kind, function, fileUri: fileUri); | 1513 : super(name, kind, function, fileUri: fileUri); |
| 1514 | 1514 |
| 1515 @override | 1515 @override |
| 1516 void setInferredType( | 1516 void setInferredType( |
| 1517 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { | 1517 TypeInferenceEngineImpl engine, String uri, DartType inferredType) { |
| 1518 if (isSetter) { | 1518 if (isSetter) { |
| 1519 if (function.positionalParameters.length > 0) { | 1519 if (function.positionalParameters.length > 0) { |
| 1520 var parameter = function.positionalParameters[0]; | 1520 var parameter = function.positionalParameters[0]; |
| 1521 engine.instrumentation?.record(Uri.parse(uri), parameter.fileOffset, | 1521 engine.instrumentation?.record(Uri.parse(uri), parameter.fileOffset, |
| 1522 'topType', new InstrumentationValueForType(inferredType)); | 1522 'topType', new InstrumentationValueForType(inferredType)); |
| 1523 parameter.type = inferredType; | 1523 parameter.type = inferredType; |
| 1524 } | 1524 } |
| 1525 } else if (isGetter) { | 1525 } else if (isGetter) { |
| 1526 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', | 1526 engine.instrumentation?.record(Uri.parse(uri), fileOffset, 'topType', |
| 1527 new InstrumentationValueForType(inferredType)); | 1527 new InstrumentationValueForType(inferredType)); |
| 1528 function.returnType = inferredType; | 1528 function.returnType = inferredType; |
| 1529 } else { | 1529 } else { |
| 1530 unhandled("setInferredType", "not accessor", fileOffset, Uri.parse(uri)); | 1530 unhandled("setInferredType", "not accessor", fileOffset, Uri.parse(uri)); |
| 1531 } | 1531 } |
| 1532 } | 1532 } |
| 1533 | 1533 |
| 1534 static MethodNode getMethodNode(Procedure procedure) { | 1534 static MethodNode getMethodNode(Procedure procedure) { |
| 1535 if (procedure is KernelProcedure) return procedure._methodNode; | 1535 if (procedure is ShadowProcedure) return procedure._methodNode; |
| 1536 return null; | 1536 return null; |
| 1537 } | 1537 } |
| 1538 | 1538 |
| 1539 static bool hasImplicitReturnType(KernelProcedure procedure) { | 1539 static bool hasImplicitReturnType(ShadowProcedure procedure) { |
| 1540 return procedure._hasImplicitReturnType; | 1540 return procedure._hasImplicitReturnType; |
| 1541 } | 1541 } |
| 1542 | 1542 |
| 1543 static void inferSetterReturnType( | 1543 static void inferSetterReturnType( |
| 1544 KernelProcedure procedure, TypeInferenceEngineImpl engine, String uri) { | 1544 ShadowProcedure procedure, TypeInferenceEngineImpl engine, String uri) { |
| 1545 assert(procedure.isSetter); | 1545 assert(procedure.isSetter); |
| 1546 if (procedure._hasImplicitReturnType) { | 1546 if (procedure._hasImplicitReturnType) { |
| 1547 var inferredType = const VoidType(); | 1547 var inferredType = const VoidType(); |
| 1548 engine.instrumentation?.record(Uri.parse(uri), procedure.fileOffset, | 1548 engine.instrumentation?.record(Uri.parse(uri), procedure.fileOffset, |
| 1549 'topType', new InstrumentationValueForType(inferredType)); | 1549 'topType', new InstrumentationValueForType(inferredType)); |
| 1550 procedure.function?.returnType = inferredType; | 1550 procedure.function?.returnType = inferredType; |
| 1551 } | 1551 } |
| 1552 } | 1552 } |
| 1553 } | 1553 } |
| 1554 | 1554 |
| 1555 /// Concrete shadow object representing an assignment to a property. | 1555 /// Concrete shadow object representing an assignment to a property. |
| 1556 class KernelPropertyAssign extends KernelComplexAssignmentWithReceiver { | 1556 class ShadowPropertyAssign extends ShadowComplexAssignmentWithReceiver { |
| 1557 /// If this assignment uses null-aware access (`?.`), the conditional | 1557 /// If this assignment uses null-aware access (`?.`), the conditional |
| 1558 /// expression that guards the access; otherwise `null`. | 1558 /// expression that guards the access; otherwise `null`. |
| 1559 Expression nullAwareGuard; | 1559 Expression nullAwareGuard; |
| 1560 | 1560 |
| 1561 KernelPropertyAssign(Expression receiver, Expression rhs, | 1561 ShadowPropertyAssign(Expression receiver, Expression rhs, |
| 1562 {bool isSuper: false}) | 1562 {bool isSuper: false}) |
| 1563 : super(receiver, rhs, isSuper); | 1563 : super(receiver, rhs, isSuper); |
| 1564 | 1564 |
| 1565 @override | 1565 @override |
| 1566 List<String> _getToStringParts() { | 1566 List<String> _getToStringParts() { |
| 1567 var parts = super._getToStringParts(); | 1567 var parts = super._getToStringParts(); |
| 1568 if (nullAwareGuard != null) parts.add('nullAwareGuard=$nullAwareGuard'); | 1568 if (nullAwareGuard != null) parts.add('nullAwareGuard=$nullAwareGuard'); |
| 1569 return parts; | 1569 return parts; |
| 1570 } | 1570 } |
| 1571 | 1571 |
| 1572 @override | 1572 @override |
| 1573 DartType _inferExpression( | 1573 DartType _inferExpression( |
| 1574 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1574 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1575 typeNeeded = | 1575 typeNeeded = |
| 1576 inferrer.listener.propertyAssignEnter(desugared, typeContext) || | 1576 inferrer.listener.propertyAssignEnter(desugared, typeContext) || |
| 1577 typeNeeded; | 1577 typeNeeded; |
| 1578 // TODO(paulberry): record the appropriate types on let variables and | 1578 // TODO(paulberry): record the appropriate types on let variables and |
| 1579 // conditional expressions. | 1579 // conditional expressions. |
| 1580 var receiverType = _inferReceiver(inferrer); | 1580 var receiverType = _inferReceiver(inferrer); |
| 1581 if (read != null) { | 1581 if (read != null) { |
| 1582 inferrer.findPropertyGetMember(receiverType, read, silent: true); | 1582 inferrer.findPropertyGetMember(receiverType, read, silent: true); |
| 1583 } | 1583 } |
| 1584 Member writeMember; | 1584 Member writeMember; |
| 1585 if (write != null) { | 1585 if (write != null) { |
| 1586 writeMember = inferrer.findPropertySetMember(receiverType, write); | 1586 writeMember = inferrer.findPropertySetMember(receiverType, write); |
| 1587 if (inferrer.isTopLevel && | 1587 if (inferrer.isTopLevel && |
| 1588 ((writeMember is Procedure && | 1588 ((writeMember is Procedure && |
| 1589 writeMember.kind == ProcedureKind.Setter) || | 1589 writeMember.kind == ProcedureKind.Setter) || |
| 1590 writeMember is Field)) { | 1590 writeMember is Field)) { |
| 1591 if (TypeInferenceEngineImpl.fullTopLevelInference) { | 1591 if (TypeInferenceEngineImpl.fullTopLevelInference) { |
| 1592 if (writeMember is KernelField && writeMember._accessorNode != null) { | 1592 if (writeMember is ShadowField && writeMember._accessorNode != null) { |
| 1593 inferrer.engine.inferAccessorFused( | 1593 inferrer.engine.inferAccessorFused( |
| 1594 writeMember._accessorNode, inferrer.accessorNode); | 1594 writeMember._accessorNode, inferrer.accessorNode); |
| 1595 } | 1595 } |
| 1596 } else { | 1596 } else { |
| 1597 // References to fields and setters can't be relied upon for top level | 1597 // References to fields and setters can't be relied upon for top level |
| 1598 // inference. | 1598 // inference. |
| 1599 inferrer.recordNotImmediatelyEvident(fileOffset); | 1599 inferrer.recordNotImmediatelyEvident(fileOffset); |
| 1600 } | 1600 } |
| 1601 } | 1601 } |
| 1602 } | 1602 } |
| 1603 // To replicate analyzer behavior, we base type inference on the write | 1603 // To replicate analyzer behavior, we base type inference on the write |
| 1604 // member. TODO(paulberry): would it be better to use the read member when | 1604 // member. TODO(paulberry): would it be better to use the read member when |
| 1605 // doing compound assignment? | 1605 // doing compound assignment? |
| 1606 var writeContext = inferrer.getSetterType(writeMember, receiverType); | 1606 var writeContext = inferrer.getSetterType(writeMember, receiverType); |
| 1607 var inferredType = _inferRhs(inferrer, writeContext); | 1607 var inferredType = _inferRhs(inferrer, writeContext); |
| 1608 inferrer.listener.propertyAssignExit(desugared, inferredType); | 1608 inferrer.listener.propertyAssignExit(desugared, inferredType); |
| 1609 return inferredType; | 1609 return inferredType; |
| 1610 } | 1610 } |
| 1611 } | 1611 } |
| 1612 | 1612 |
| 1613 /// Shadow object for [PropertyGet]. | 1613 /// Shadow object for [PropertyGet]. |
| 1614 class KernelPropertyGet extends PropertyGet implements KernelExpression { | 1614 class ShadowPropertyGet extends PropertyGet implements ShadowExpression { |
| 1615 KernelPropertyGet(Expression receiver, Name name, [Member interfaceTarget]) | 1615 ShadowPropertyGet(Expression receiver, Name name, [Member interfaceTarget]) |
| 1616 : super(receiver, name, interfaceTarget); | 1616 : super(receiver, name, interfaceTarget); |
| 1617 | 1617 |
| 1618 KernelPropertyGet.byReference( | 1618 ShadowPropertyGet.byReference( |
| 1619 Expression receiver, Name name, Reference interfaceTargetReference) | 1619 Expression receiver, Name name, Reference interfaceTargetReference) |
| 1620 : super.byReference(receiver, name, interfaceTargetReference); | 1620 : super.byReference(receiver, name, interfaceTargetReference); |
| 1621 | 1621 |
| 1622 @override | 1622 @override |
| 1623 void _collectDependencies(KernelDependencyCollector collector) { | 1623 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1624 // A simple or qualified identifier referring to a top level function, | 1624 // A simple or qualified identifier referring to a top level function, |
| 1625 // static variable, field, getter; or a static class variable, static getter | 1625 // static variable, field, getter; or a static class variable, static getter |
| 1626 // or method; or an instance method; has the inferred type of the referent. | 1626 // or method; or an instance method; has the inferred type of the referent. |
| 1627 // - Otherwise, if the identifier has no inferred or annotated type then it | 1627 // - Otherwise, if the identifier has no inferred or annotated type then it |
| 1628 // is an error. | 1628 // is an error. |
| 1629 // - Note: specifically, references to instance fields and instance getters | 1629 // - Note: specifically, references to instance fields and instance getters |
| 1630 // are disallowed here. | 1630 // are disallowed here. |
| 1631 // - The inference dependency of the identifier is the referent if the | 1631 // - The inference dependency of the identifier is the referent if the |
| 1632 // referent is a candidate for inference. Otherwise there are no | 1632 // referent is a candidate for inference. Otherwise there are no |
| 1633 // inference dependencies. | 1633 // inference dependencies. |
| 1634 | 1634 |
| 1635 // For a property get, the only things we could be looking at are an | 1635 // For a property get, the only things we could be looking at are an |
| 1636 // instance field, an instance getter, or an instance method. For the first | 1636 // instance field, an instance getter, or an instance method. For the first |
| 1637 // two, we disallow them in [_inferExpression]. For the last, there are no | 1637 // two, we disallow them in [_inferExpression]. For the last, there are no |
| 1638 // field dependencies. So we don't need to do anything here. | 1638 // field dependencies. So we don't need to do anything here. |
| 1639 } | 1639 } |
| 1640 | 1640 |
| 1641 @override | 1641 @override |
| 1642 DartType _inferExpression( | 1642 DartType _inferExpression( |
| 1643 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1643 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1644 return inferrer.inferPropertyGet( | 1644 return inferrer.inferPropertyGet( |
| 1645 this, receiver, fileOffset, typeContext, typeNeeded, | 1645 this, receiver, fileOffset, typeContext, typeNeeded, |
| 1646 desugaredGet: this); | 1646 desugaredGet: this); |
| 1647 } | 1647 } |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 /// Concrete shadow object representing a redirecting initializer in kernel | 1650 /// Concrete shadow object representing a redirecting initializer in kernel |
| 1651 /// form. | 1651 /// form. |
| 1652 class KernelRedirectingInitializer extends RedirectingInitializer | 1652 class ShadowRedirectingInitializer extends RedirectingInitializer |
| 1653 implements KernelInitializer { | 1653 implements ShadowInitializer { |
| 1654 KernelRedirectingInitializer(Constructor target, Arguments arguments) | 1654 ShadowRedirectingInitializer(Constructor target, Arguments arguments) |
| 1655 : super(target, arguments); | 1655 : super(target, arguments); |
| 1656 | 1656 |
| 1657 @override | 1657 @override |
| 1658 _inferInitializer(KernelTypeInferrer inferrer) { | 1658 _inferInitializer(ShadowTypeInferrer inferrer) { |
| 1659 inferrer.listener.redirectingInitializerEnter(this); | 1659 inferrer.listener.redirectingInitializerEnter(this); |
| 1660 inferrer.inferInvocation(null, false, fileOffset, | 1660 inferrer.inferInvocation(null, false, fileOffset, |
| 1661 target.function.functionType, target.enclosingClass.thisType, arguments, | 1661 target.function.functionType, target.enclosingClass.thisType, arguments, |
| 1662 skipTypeArgumentInference: true); | 1662 skipTypeArgumentInference: true); |
| 1663 inferrer.listener.redirectingInitializerExit(this); | 1663 inferrer.listener.redirectingInitializerExit(this); |
| 1664 } | 1664 } |
| 1665 } | 1665 } |
| 1666 | 1666 |
| 1667 /// Shadow object for [Rethrow]. | 1667 /// Shadow object for [Rethrow]. |
| 1668 class KernelRethrow extends Rethrow implements KernelExpression { | 1668 class ShadowRethrow extends Rethrow implements ShadowExpression { |
| 1669 @override | 1669 @override |
| 1670 void _collectDependencies(KernelDependencyCollector collector) { | 1670 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1671 // No inference dependencies. | 1671 // No inference dependencies. |
| 1672 } | 1672 } |
| 1673 | 1673 |
| 1674 @override | 1674 @override |
| 1675 DartType _inferExpression( | 1675 DartType _inferExpression( |
| 1676 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1676 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1677 typeNeeded = | 1677 typeNeeded = |
| 1678 inferrer.listener.rethrowEnter(this, typeContext) || typeNeeded; | 1678 inferrer.listener.rethrowEnter(this, typeContext) || typeNeeded; |
| 1679 var inferredType = typeNeeded ? const BottomType() : null; | 1679 var inferredType = typeNeeded ? const BottomType() : null; |
| 1680 inferrer.listener.rethrowExit(this, inferredType); | 1680 inferrer.listener.rethrowExit(this, inferredType); |
| 1681 return inferredType; | 1681 return inferredType; |
| 1682 } | 1682 } |
| 1683 } | 1683 } |
| 1684 | 1684 |
| 1685 /// Concrete shadow object representing a return statement in kernel form. | 1685 /// Concrete shadow object representing a return statement in kernel form. |
| 1686 class KernelReturnStatement extends ReturnStatement implements KernelStatement { | 1686 class ShadowReturnStatement extends ReturnStatement implements ShadowStatement { |
| 1687 KernelReturnStatement([Expression expression]) : super(expression); | 1687 ShadowReturnStatement([Expression expression]) : super(expression); |
| 1688 | 1688 |
| 1689 @override | 1689 @override |
| 1690 void _inferStatement(KernelTypeInferrer inferrer) { | 1690 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 1691 inferrer.listener.returnStatementEnter(this); | 1691 inferrer.listener.returnStatementEnter(this); |
| 1692 var closureContext = inferrer.closureContext; | 1692 var closureContext = inferrer.closureContext; |
| 1693 var typeContext = | 1693 var typeContext = |
| 1694 !closureContext.isGenerator ? closureContext.returnContext : null; | 1694 !closureContext.isGenerator ? closureContext.returnContext : null; |
| 1695 var inferredType = expression != null | 1695 var inferredType = expression != null |
| 1696 ? inferrer.inferExpression(expression, typeContext, true) | 1696 ? inferrer.inferExpression(expression, typeContext, true) |
| 1697 : const VoidType(); | 1697 : const VoidType(); |
| 1698 // Analyzer treats bare `return` statements as having no effect on the | 1698 // Analyzer treats bare `return` statements as having no effect on the |
| 1699 // inferred type of the closure. TODO(paulberry): is this what we want | 1699 // inferred type of the closure. TODO(paulberry): is this what we want |
| 1700 // for Fasta? | 1700 // for Fasta? |
| 1701 if (expression != null) { | 1701 if (expression != null) { |
| 1702 closureContext.handleReturn(inferrer, inferredType); | 1702 closureContext.handleReturn(inferrer, inferredType); |
| 1703 } | 1703 } |
| 1704 inferrer.listener.returnStatementExit(this); | 1704 inferrer.listener.returnStatementExit(this); |
| 1705 } | 1705 } |
| 1706 } | 1706 } |
| 1707 | 1707 |
| 1708 /// Common base class for shadow objects representing statements in kernel | 1708 /// Common base class for shadow objects representing statements in kernel |
| 1709 /// form. | 1709 /// form. |
| 1710 abstract class KernelStatement extends Statement { | 1710 abstract class ShadowStatement extends Statement { |
| 1711 /// Calls back to [inferrer] to perform type inference for whatever concrete | 1711 /// Calls back to [inferrer] to perform type inference for whatever concrete |
| 1712 /// type of [KernelStatement] this is. | 1712 /// type of [ShadowStatement] this is. |
| 1713 void _inferStatement(KernelTypeInferrer inferrer); | 1713 void _inferStatement(ShadowTypeInferrer inferrer); |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 /// Concrete shadow object representing an assignment to a static variable. | 1716 /// Concrete shadow object representing an assignment to a static variable. |
| 1717 class KernelStaticAssignment extends KernelComplexAssignment { | 1717 class ShadowStaticAssignment extends ShadowComplexAssignment { |
| 1718 KernelStaticAssignment(Expression rhs) : super(rhs); | 1718 ShadowStaticAssignment(Expression rhs) : super(rhs); |
| 1719 | 1719 |
| 1720 @override | 1720 @override |
| 1721 DartType _inferExpression( | 1721 DartType _inferExpression( |
| 1722 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1722 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1723 typeNeeded = inferrer.listener.staticAssignEnter(desugared, typeContext) || | 1723 typeNeeded = inferrer.listener.staticAssignEnter(desugared, typeContext) || |
| 1724 typeNeeded; | 1724 typeNeeded; |
| 1725 // TODO(paulberry): record the appropriate types on let variables and | 1725 // TODO(paulberry): record the appropriate types on let variables and |
| 1726 // conditional expressions. | 1726 // conditional expressions. |
| 1727 DartType writeContext; | 1727 DartType writeContext; |
| 1728 var write = this.write; | 1728 var write = this.write; |
| 1729 if (write is StaticSet) { | 1729 if (write is StaticSet) { |
| 1730 writeContext = write.target.setterType; | 1730 writeContext = write.target.setterType; |
| 1731 var target = write.target; | 1731 var target = write.target; |
| 1732 if (target is KernelField && target._accessorNode != null) { | 1732 if (target is ShadowField && target._accessorNode != null) { |
| 1733 if (inferrer.isDryRun) { | 1733 if (inferrer.isDryRun) { |
| 1734 inferrer.recordDryRunDependency(target._accessorNode); | 1734 inferrer.recordDryRunDependency(target._accessorNode); |
| 1735 } | 1735 } |
| 1736 if (TypeInferenceEngineImpl.fusedTopLevelInference && | 1736 if (TypeInferenceEngineImpl.fusedTopLevelInference && |
| 1737 inferrer.isTopLevel) { | 1737 inferrer.isTopLevel) { |
| 1738 inferrer.engine | 1738 inferrer.engine |
| 1739 .inferAccessorFused(target._accessorNode, inferrer.accessorNode); | 1739 .inferAccessorFused(target._accessorNode, inferrer.accessorNode); |
| 1740 } | 1740 } |
| 1741 } | 1741 } |
| 1742 } | 1742 } |
| 1743 var inferredType = _inferRhs(inferrer, writeContext); | 1743 var inferredType = _inferRhs(inferrer, writeContext); |
| 1744 inferrer.listener.staticAssignExit(desugared, inferredType); | 1744 inferrer.listener.staticAssignExit(desugared, inferredType); |
| 1745 return inferredType; | 1745 return inferredType; |
| 1746 } | 1746 } |
| 1747 } | 1747 } |
| 1748 | 1748 |
| 1749 /// Concrete shadow object representing a read of a static variable in kernel | 1749 /// Concrete shadow object representing a read of a static variable in kernel |
| 1750 /// form. | 1750 /// form. |
| 1751 class KernelStaticGet extends StaticGet implements KernelExpression { | 1751 class ShadowStaticGet extends StaticGet implements ShadowExpression { |
| 1752 KernelStaticGet(Member target) : super(target); | 1752 ShadowStaticGet(Member target) : super(target); |
| 1753 | 1753 |
| 1754 @override | 1754 @override |
| 1755 void _collectDependencies(KernelDependencyCollector collector) { | 1755 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1756 // A simple or qualified identifier referring to a top level function, | 1756 // A simple or qualified identifier referring to a top level function, |
| 1757 // static variable, field, getter; or a static class variable, static getter | 1757 // static variable, field, getter; or a static class variable, static getter |
| 1758 // or method; or an instance method; has the inferred type of the referent. | 1758 // or method; or an instance method; has the inferred type of the referent. |
| 1759 // - Otherwise, if the identifier has no inferred or annotated type then it | 1759 // - Otherwise, if the identifier has no inferred or annotated type then it |
| 1760 // is an error. | 1760 // is an error. |
| 1761 // - Note: specifically, references to instance fields and instance getters | 1761 // - Note: specifically, references to instance fields and instance getters |
| 1762 // are disallowed here. | 1762 // are disallowed here. |
| 1763 // - The inference dependency of the identifier is the referent if the | 1763 // - The inference dependency of the identifier is the referent if the |
| 1764 // referent is a candidate for inference. Otherwise there are no | 1764 // referent is a candidate for inference. Otherwise there are no |
| 1765 // inference dependencies. | 1765 // inference dependencies. |
| 1766 // TODO(paulberry): implement the proper error checking logic. | 1766 // TODO(paulberry): implement the proper error checking logic. |
| 1767 var target = this.target; | 1767 var target = this.target; |
| 1768 if (target is KernelField && target._accessorNode != null) { | 1768 if (target is ShadowField && target._accessorNode != null) { |
| 1769 collector.recordDependency(target._accessorNode); | 1769 collector.recordDependency(target._accessorNode); |
| 1770 } | 1770 } |
| 1771 } | 1771 } |
| 1772 | 1772 |
| 1773 @override | 1773 @override |
| 1774 DartType _inferExpression( | 1774 DartType _inferExpression( |
| 1775 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1775 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1776 typeNeeded = | 1776 typeNeeded = |
| 1777 inferrer.listener.staticGetEnter(this, typeContext) || typeNeeded; | 1777 inferrer.listener.staticGetEnter(this, typeContext) || typeNeeded; |
| 1778 var target = this.target; | 1778 var target = this.target; |
| 1779 if (target is KernelField && target._accessorNode != null) { | 1779 if (target is ShadowField && target._accessorNode != null) { |
| 1780 if (inferrer.isDryRun) { | 1780 if (inferrer.isDryRun) { |
| 1781 inferrer.recordDryRunDependency(target._accessorNode); | 1781 inferrer.recordDryRunDependency(target._accessorNode); |
| 1782 } | 1782 } |
| 1783 if (TypeInferenceEngineImpl.fusedTopLevelInference && | 1783 if (TypeInferenceEngineImpl.fusedTopLevelInference && |
| 1784 inferrer.isTopLevel) { | 1784 inferrer.isTopLevel) { |
| 1785 inferrer.engine | 1785 inferrer.engine |
| 1786 .inferAccessorFused(target._accessorNode, inferrer.accessorNode); | 1786 .inferAccessorFused(target._accessorNode, inferrer.accessorNode); |
| 1787 } | 1787 } |
| 1788 } | 1788 } |
| 1789 var inferredType = typeNeeded ? target.getterType : null; | 1789 var inferredType = typeNeeded ? target.getterType : null; |
| 1790 inferrer.listener.staticGetExit(this, inferredType); | 1790 inferrer.listener.staticGetExit(this, inferredType); |
| 1791 return inferredType; | 1791 return inferredType; |
| 1792 } | 1792 } |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 /// Shadow object for [StaticInvocation]. | 1795 /// Shadow object for [StaticInvocation]. |
| 1796 class KernelStaticInvocation extends StaticInvocation | 1796 class ShadowStaticInvocation extends StaticInvocation |
| 1797 implements KernelExpression { | 1797 implements ShadowExpression { |
| 1798 KernelStaticInvocation(Procedure target, Arguments arguments, | 1798 ShadowStaticInvocation(Procedure target, Arguments arguments, |
| 1799 {bool isConst: false}) | 1799 {bool isConst: false}) |
| 1800 : super(target, arguments, isConst: isConst); | 1800 : super(target, arguments, isConst: isConst); |
| 1801 | 1801 |
| 1802 KernelStaticInvocation.byReference( | 1802 ShadowStaticInvocation.byReference( |
| 1803 Reference targetReference, Arguments arguments) | 1803 Reference targetReference, Arguments arguments) |
| 1804 : super.byReference(targetReference, arguments); | 1804 : super.byReference(targetReference, arguments); |
| 1805 | 1805 |
| 1806 @override | 1806 @override |
| 1807 void _collectDependencies(KernelDependencyCollector collector) { | 1807 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1808 // No inference dependencies. | 1808 // No inference dependencies. |
| 1809 } | 1809 } |
| 1810 | 1810 |
| 1811 @override | 1811 @override |
| 1812 DartType _inferExpression( | 1812 DartType _inferExpression( |
| 1813 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1813 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1814 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) || | 1814 typeNeeded = inferrer.listener.staticInvocationEnter(this, typeContext) || |
| 1815 typeNeeded; | 1815 typeNeeded; |
| 1816 var calleeType = target.function.functionType; | 1816 var calleeType = target.function.functionType; |
| 1817 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded, | 1817 var inferredType = inferrer.inferInvocation(typeContext, typeNeeded, |
| 1818 fileOffset, calleeType, calleeType.returnType, arguments); | 1818 fileOffset, calleeType, calleeType.returnType, arguments); |
| 1819 inferrer.listener.staticInvocationExit(this, inferredType); | 1819 inferrer.listener.staticInvocationExit(this, inferredType); |
| 1820 return inferredType; | 1820 return inferredType; |
| 1821 } | 1821 } |
| 1822 } | 1822 } |
| 1823 | 1823 |
| 1824 /// Concrete shadow object representing a string concatenation in kernel form. | 1824 /// Concrete shadow object representing a string concatenation in kernel form. |
| 1825 class KernelStringConcatenation extends StringConcatenation | 1825 class ShadowStringConcatenation extends StringConcatenation |
| 1826 implements KernelExpression { | 1826 implements ShadowExpression { |
| 1827 KernelStringConcatenation(List<Expression> expressions) : super(expressions); | 1827 ShadowStringConcatenation(List<Expression> expressions) : super(expressions); |
| 1828 | 1828 |
| 1829 @override | 1829 @override |
| 1830 void _collectDependencies(KernelDependencyCollector collector) { | 1830 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1831 // No inference dependencies. | 1831 // No inference dependencies. |
| 1832 } | 1832 } |
| 1833 | 1833 |
| 1834 @override | 1834 @override |
| 1835 DartType _inferExpression( | 1835 DartType _inferExpression( |
| 1836 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1836 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1837 typeNeeded = | 1837 typeNeeded = |
| 1838 inferrer.listener.stringConcatenationEnter(this, typeContext) || | 1838 inferrer.listener.stringConcatenationEnter(this, typeContext) || |
| 1839 typeNeeded; | 1839 typeNeeded; |
| 1840 if (!inferrer.isTopLevel) { | 1840 if (!inferrer.isTopLevel) { |
| 1841 for (Expression expression in expressions) { | 1841 for (Expression expression in expressions) { |
| 1842 inferrer.inferExpression(expression, null, false); | 1842 inferrer.inferExpression(expression, null, false); |
| 1843 } | 1843 } |
| 1844 } | 1844 } |
| 1845 var inferredType = | 1845 var inferredType = |
| 1846 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; | 1846 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; |
| 1847 inferrer.listener.stringConcatenationExit(this, inferredType); | 1847 inferrer.listener.stringConcatenationExit(this, inferredType); |
| 1848 return inferredType; | 1848 return inferredType; |
| 1849 } | 1849 } |
| 1850 } | 1850 } |
| 1851 | 1851 |
| 1852 /// Concrete shadow object representing a string literal in kernel form. | 1852 /// Concrete shadow object representing a string literal in kernel form. |
| 1853 class KernelStringLiteral extends StringLiteral implements KernelExpression { | 1853 class ShadowStringLiteral extends StringLiteral implements ShadowExpression { |
| 1854 KernelStringLiteral(String value) : super(value); | 1854 ShadowStringLiteral(String value) : super(value); |
| 1855 | 1855 |
| 1856 @override | 1856 @override |
| 1857 void _collectDependencies(KernelDependencyCollector collector) { | 1857 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1858 // No inference dependencies. | 1858 // No inference dependencies. |
| 1859 } | 1859 } |
| 1860 | 1860 |
| 1861 @override | 1861 @override |
| 1862 DartType _inferExpression( | 1862 DartType _inferExpression( |
| 1863 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1863 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1864 typeNeeded = | 1864 typeNeeded = |
| 1865 inferrer.listener.stringLiteralEnter(this, typeContext) || typeNeeded; | 1865 inferrer.listener.stringLiteralEnter(this, typeContext) || typeNeeded; |
| 1866 var inferredType = | 1866 var inferredType = |
| 1867 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; | 1867 typeNeeded ? inferrer.coreTypes.stringClass.rawType : null; |
| 1868 inferrer.listener.stringLiteralExit(this, inferredType); | 1868 inferrer.listener.stringLiteralExit(this, inferredType); |
| 1869 return inferredType; | 1869 return inferredType; |
| 1870 } | 1870 } |
| 1871 } | 1871 } |
| 1872 | 1872 |
| 1873 /// Concrete shadow object representing a super initializer in kernel form. | 1873 /// Concrete shadow object representing a super initializer in kernel form. |
| 1874 class KernelSuperInitializer extends SuperInitializer | 1874 class ShadowSuperInitializer extends SuperInitializer |
| 1875 implements KernelInitializer { | 1875 implements ShadowInitializer { |
| 1876 KernelSuperInitializer(Constructor target, Arguments arguments) | 1876 ShadowSuperInitializer(Constructor target, Arguments arguments) |
| 1877 : super(target, arguments); | 1877 : super(target, arguments); |
| 1878 | 1878 |
| 1879 @override | 1879 @override |
| 1880 void _inferInitializer(KernelTypeInferrer inferrer) { | 1880 void _inferInitializer(ShadowTypeInferrer inferrer) { |
| 1881 inferrer.listener.superInitializerEnter(this); | 1881 inferrer.listener.superInitializerEnter(this); |
| 1882 inferrer.inferInvocation(null, false, fileOffset, | 1882 inferrer.inferInvocation(null, false, fileOffset, |
| 1883 target.function.functionType, target.enclosingClass.thisType, arguments, | 1883 target.function.functionType, target.enclosingClass.thisType, arguments, |
| 1884 skipTypeArgumentInference: true); | 1884 skipTypeArgumentInference: true); |
| 1885 inferrer.listener.superInitializerExit(this); | 1885 inferrer.listener.superInitializerExit(this); |
| 1886 } | 1886 } |
| 1887 } | 1887 } |
| 1888 | 1888 |
| 1889 /// Shadow object for [SuperMethodInvocation]. | 1889 /// Shadow object for [SuperMethodInvocation]. |
| 1890 class KernelSuperMethodInvocation extends SuperMethodInvocation | 1890 class ShadowSuperMethodInvocation extends SuperMethodInvocation |
| 1891 implements KernelExpression { | 1891 implements ShadowExpression { |
| 1892 KernelSuperMethodInvocation(Name name, Arguments arguments, | 1892 ShadowSuperMethodInvocation(Name name, Arguments arguments, |
| 1893 [Procedure interfaceTarget]) | 1893 [Procedure interfaceTarget]) |
| 1894 : super(name, arguments, interfaceTarget); | 1894 : super(name, arguments, interfaceTarget); |
| 1895 | 1895 |
| 1896 @override | 1896 @override |
| 1897 void _collectDependencies(KernelDependencyCollector collector) { | 1897 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1898 // Super expressions should never occur in top level type inference. | 1898 // Super expressions should never occur in top level type inference. |
| 1899 // TODO(paulberry): but could they occur due to invalid code? | 1899 // TODO(paulberry): but could they occur due to invalid code? |
| 1900 assert(false); | 1900 assert(false); |
| 1901 } | 1901 } |
| 1902 | 1902 |
| 1903 @override | 1903 @override |
| 1904 DartType _inferExpression( | 1904 DartType _inferExpression( |
| 1905 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1905 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1906 if (interfaceTarget != null) { | 1906 if (interfaceTarget != null) { |
| 1907 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, | 1907 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
| 1908 'target', new InstrumentationValueForMember(interfaceTarget)); | 1908 'target', new InstrumentationValueForMember(interfaceTarget)); |
| 1909 } | 1909 } |
| 1910 return inferrer.inferMethodInvocation(this, new KernelThisExpression(), | 1910 return inferrer.inferMethodInvocation(this, new ShadowThisExpression(), |
| 1911 fileOffset, false, typeContext, typeNeeded, | 1911 fileOffset, false, typeContext, typeNeeded, |
| 1912 interfaceMember: interfaceTarget, | 1912 interfaceMember: interfaceTarget, |
| 1913 methodName: name, | 1913 methodName: name, |
| 1914 arguments: arguments); | 1914 arguments: arguments); |
| 1915 } | 1915 } |
| 1916 } | 1916 } |
| 1917 | 1917 |
| 1918 /// Shadow object for [SuperPropertyGet]. | 1918 /// Shadow object for [SuperPropertyGet]. |
| 1919 class KernelSuperPropertyGet extends SuperPropertyGet | 1919 class ShadowSuperPropertyGet extends SuperPropertyGet |
| 1920 implements KernelExpression { | 1920 implements ShadowExpression { |
| 1921 KernelSuperPropertyGet(Name name, [Member interfaceTarget]) | 1921 ShadowSuperPropertyGet(Name name, [Member interfaceTarget]) |
| 1922 : super(name, interfaceTarget); | 1922 : super(name, interfaceTarget); |
| 1923 | 1923 |
| 1924 @override | 1924 @override |
| 1925 void _collectDependencies(KernelDependencyCollector collector) { | 1925 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1926 // Super expressions should never occur in top level type inference. | 1926 // Super expressions should never occur in top level type inference. |
| 1927 // TODO(paulberry): but could they occur due to invalid code? | 1927 // TODO(paulberry): but could they occur due to invalid code? |
| 1928 assert(false); | 1928 assert(false); |
| 1929 } | 1929 } |
| 1930 | 1930 |
| 1931 @override | 1931 @override |
| 1932 DartType _inferExpression( | 1932 DartType _inferExpression( |
| 1933 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1933 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1934 return inferrer.inferPropertyGet( | 1934 return inferrer.inferPropertyGet( |
| 1935 this, new KernelThisExpression(), fileOffset, typeContext, typeNeeded, | 1935 this, new ShadowThisExpression(), fileOffset, typeContext, typeNeeded, |
| 1936 propertyName: name); | 1936 propertyName: name); |
| 1937 } | 1937 } |
| 1938 } | 1938 } |
| 1939 | 1939 |
| 1940 /// Concrete shadow object representing a switch statement in kernel form. | 1940 /// Concrete shadow object representing a switch statement in kernel form. |
| 1941 class KernelSwitchStatement extends SwitchStatement implements KernelStatement { | 1941 class ShadowSwitchStatement extends SwitchStatement implements ShadowStatement { |
| 1942 KernelSwitchStatement(Expression expression, List<SwitchCase> cases) | 1942 ShadowSwitchStatement(Expression expression, List<SwitchCase> cases) |
| 1943 : super(expression, cases); | 1943 : super(expression, cases); |
| 1944 | 1944 |
| 1945 @override | 1945 @override |
| 1946 void _inferStatement(KernelTypeInferrer inferrer) { | 1946 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 1947 inferrer.listener.switchStatementEnter(this); | 1947 inferrer.listener.switchStatementEnter(this); |
| 1948 var expressionType = inferrer.inferExpression(expression, null, true); | 1948 var expressionType = inferrer.inferExpression(expression, null, true); |
| 1949 for (var switchCase in cases) { | 1949 for (var switchCase in cases) { |
| 1950 for (var caseExpression in switchCase.expressions) { | 1950 for (var caseExpression in switchCase.expressions) { |
| 1951 inferrer.inferExpression(caseExpression, expressionType, false); | 1951 inferrer.inferExpression(caseExpression, expressionType, false); |
| 1952 } | 1952 } |
| 1953 inferrer.inferStatement(switchCase.body); | 1953 inferrer.inferStatement(switchCase.body); |
| 1954 } | 1954 } |
| 1955 inferrer.listener.switchStatementExit(this); | 1955 inferrer.listener.switchStatementExit(this); |
| 1956 } | 1956 } |
| 1957 } | 1957 } |
| 1958 | 1958 |
| 1959 /// Shadow object for [SymbolLiteral]. | 1959 /// Shadow object for [SymbolLiteral]. |
| 1960 class KernelSymbolLiteral extends SymbolLiteral implements KernelExpression { | 1960 class ShadowSymbolLiteral extends SymbolLiteral implements ShadowExpression { |
| 1961 KernelSymbolLiteral(String value) : super(value); | 1961 ShadowSymbolLiteral(String value) : super(value); |
| 1962 | 1962 |
| 1963 @override | 1963 @override |
| 1964 void _collectDependencies(KernelDependencyCollector collector) { | 1964 void _collectDependencies(ShadowDependencyCollector collector) { |
| 1965 // No inference dependencies. | 1965 // No inference dependencies. |
| 1966 } | 1966 } |
| 1967 | 1967 |
| 1968 @override | 1968 @override |
| 1969 DartType _inferExpression( | 1969 DartType _inferExpression( |
| 1970 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 1970 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 1971 typeNeeded = | 1971 typeNeeded = |
| 1972 inferrer.listener.symbolLiteralEnter(this, typeContext) || typeNeeded; | 1972 inferrer.listener.symbolLiteralEnter(this, typeContext) || typeNeeded; |
| 1973 var inferredType = | 1973 var inferredType = |
| 1974 typeNeeded ? inferrer.coreTypes.symbolClass.rawType : null; | 1974 typeNeeded ? inferrer.coreTypes.symbolClass.rawType : null; |
| 1975 inferrer.listener.symbolLiteralExit(this, inferredType); | 1975 inferrer.listener.symbolLiteralExit(this, inferredType); |
| 1976 return inferredType; | 1976 return inferredType; |
| 1977 } | 1977 } |
| 1978 } | 1978 } |
| 1979 | 1979 |
| 1980 /// Shadow object for expressions that are introduced by the front end as part | 1980 /// Shadow object for expressions that are introduced by the front end as part |
| 1981 /// of desugaring or the handling of error conditions. | 1981 /// of desugaring or the handling of error conditions. |
| 1982 /// | 1982 /// |
| 1983 /// By default, type inference skips these expressions entirely. Some derived | 1983 /// By default, type inference skips these expressions entirely. Some derived |
| 1984 /// classes have type inference behaviors. | 1984 /// classes have type inference behaviors. |
| 1985 /// | 1985 /// |
| 1986 /// Visitors skip over objects of this type, so it is not included in serialized | 1986 /// Visitors skip over objects of this type, so it is not included in serialized |
| 1987 /// output. | 1987 /// output. |
| 1988 class KernelSyntheticExpression extends Expression implements KernelExpression { | 1988 class ShadowSyntheticExpression extends Expression implements ShadowExpression { |
| 1989 /// The desugared kernel representation of this synthetic expression. | 1989 /// The desugared kernel representation of this synthetic expression. |
| 1990 Expression desugared; | 1990 Expression desugared; |
| 1991 | 1991 |
| 1992 KernelSyntheticExpression(this.desugared); | 1992 ShadowSyntheticExpression(this.desugared); |
| 1993 | 1993 |
| 1994 @override | 1994 @override |
| 1995 void set parent(TreeNode node) { | 1995 void set parent(TreeNode node) { |
| 1996 super.parent = node; | 1996 super.parent = node; |
| 1997 desugared?.parent = node; | 1997 desugared?.parent = node; |
| 1998 } | 1998 } |
| 1999 | 1999 |
| 2000 @override | 2000 @override |
| 2001 accept(ExpressionVisitor v) => desugared.accept(v); | 2001 accept(ExpressionVisitor v) => desugared.accept(v); |
| 2002 | 2002 |
| 2003 @override | 2003 @override |
| 2004 accept1(ExpressionVisitor1 v, arg) => desugared.accept1(v, arg); | 2004 accept1(ExpressionVisitor1 v, arg) => desugared.accept1(v, arg); |
| 2005 | 2005 |
| 2006 @override | 2006 @override |
| 2007 DartType getStaticType(TypeEnvironment types) => | 2007 DartType getStaticType(TypeEnvironment types) => |
| 2008 desugared.getStaticType(types); | 2008 desugared.getStaticType(types); |
| 2009 | 2009 |
| 2010 @override | 2010 @override |
| 2011 transformChildren(Transformer v) => desugared.transformChildren(v); | 2011 transformChildren(Transformer v) => desugared.transformChildren(v); |
| 2012 | 2012 |
| 2013 @override | 2013 @override |
| 2014 visitChildren(Visitor v) => desugared.visitChildren(v); | 2014 visitChildren(Visitor v) => desugared.visitChildren(v); |
| 2015 | 2015 |
| 2016 @override | 2016 @override |
| 2017 _collectDependencies(KernelDependencyCollector collector) { | 2017 _collectDependencies(ShadowDependencyCollector collector) { |
| 2018 // No inference dependencies. | 2018 // No inference dependencies. |
| 2019 } | 2019 } |
| 2020 | 2020 |
| 2021 @override | 2021 @override |
| 2022 DartType _inferExpression( | 2022 DartType _inferExpression( |
| 2023 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2023 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2024 return typeNeeded ? const DynamicType() : null; | 2024 return typeNeeded ? const DynamicType() : null; |
| 2025 } | 2025 } |
| 2026 } | 2026 } |
| 2027 | 2027 |
| 2028 /// Shadow object for statements that are introduced by the front end as part | 2028 /// Shadow object for statements that are introduced by the front end as part |
| 2029 /// of desugaring or the handling of error conditions. | 2029 /// of desugaring or the handling of error conditions. |
| 2030 /// | 2030 /// |
| 2031 /// By default, type inference skips these statements entirely. Some derived | 2031 /// By default, type inference skips these statements entirely. Some derived |
| 2032 /// classes may have type inference behaviors. | 2032 /// classes may have type inference behaviors. |
| 2033 /// | 2033 /// |
| 2034 /// Visitors skip over objects of this type, so it is not included in serialized | 2034 /// Visitors skip over objects of this type, so it is not included in serialized |
| 2035 /// output. | 2035 /// output. |
| 2036 class KernelSyntheticStatement extends Statement implements KernelStatement { | 2036 class ShadowSyntheticStatement extends Statement implements ShadowStatement { |
| 2037 /// The desugared kernel representation of this synthetic statement. | 2037 /// The desugared kernel representation of this synthetic statement. |
| 2038 Statement desugared; | 2038 Statement desugared; |
| 2039 | 2039 |
| 2040 KernelSyntheticStatement(this.desugared); | 2040 ShadowSyntheticStatement(this.desugared); |
| 2041 | 2041 |
| 2042 @override | 2042 @override |
| 2043 void set parent(TreeNode node) { | 2043 void set parent(TreeNode node) { |
| 2044 super.parent = node; | 2044 super.parent = node; |
| 2045 desugared?.parent = node; | 2045 desugared?.parent = node; |
| 2046 } | 2046 } |
| 2047 | 2047 |
| 2048 @override | 2048 @override |
| 2049 accept(StatementVisitor v) => desugared.accept(v); | 2049 accept(StatementVisitor v) => desugared.accept(v); |
| 2050 | 2050 |
| 2051 @override | 2051 @override |
| 2052 accept1(StatementVisitor1 v, arg) => desugared.accept1(v, arg); | 2052 accept1(StatementVisitor1 v, arg) => desugared.accept1(v, arg); |
| 2053 | 2053 |
| 2054 @override | 2054 @override |
| 2055 transformChildren(Transformer v) => desugared.transformChildren(v); | 2055 transformChildren(Transformer v) => desugared.transformChildren(v); |
| 2056 | 2056 |
| 2057 @override | 2057 @override |
| 2058 visitChildren(Visitor v) => desugared.visitChildren(v); | 2058 visitChildren(Visitor v) => desugared.visitChildren(v); |
| 2059 | 2059 |
| 2060 @override | 2060 @override |
| 2061 void _inferStatement(KernelTypeInferrer inferrer) {} | 2061 void _inferStatement(ShadowTypeInferrer inferrer) {} |
| 2062 } | 2062 } |
| 2063 | 2063 |
| 2064 /// Shadow object for [ThisExpression]. | 2064 /// Shadow object for [ThisExpression]. |
| 2065 class KernelThisExpression extends ThisExpression implements KernelExpression { | 2065 class ShadowThisExpression extends ThisExpression implements ShadowExpression { |
| 2066 @override | 2066 @override |
| 2067 void _collectDependencies(KernelDependencyCollector collector) { | 2067 void _collectDependencies(ShadowDependencyCollector collector) { |
| 2068 // Field initializers are not allowed to refer to [this]. But if it | 2068 // Field initializers are not allowed to refer to [this]. But if it |
| 2069 // happens, we can still proceed; no additional type inference dependencies | 2069 // happens, we can still proceed; no additional type inference dependencies |
| 2070 // are introduced. | 2070 // are introduced. |
| 2071 } | 2071 } |
| 2072 | 2072 |
| 2073 @override | 2073 @override |
| 2074 DartType _inferExpression( | 2074 DartType _inferExpression( |
| 2075 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2075 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2076 typeNeeded = | 2076 typeNeeded = |
| 2077 inferrer.listener.thisExpressionEnter(this, typeContext) || typeNeeded; | 2077 inferrer.listener.thisExpressionEnter(this, typeContext) || typeNeeded; |
| 2078 var inferredType = | 2078 var inferredType = |
| 2079 typeNeeded ? (inferrer.thisType ?? const DynamicType()) : null; | 2079 typeNeeded ? (inferrer.thisType ?? const DynamicType()) : null; |
| 2080 inferrer.listener.thisExpressionExit(this, inferredType); | 2080 inferrer.listener.thisExpressionExit(this, inferredType); |
| 2081 return inferredType; | 2081 return inferredType; |
| 2082 } | 2082 } |
| 2083 } | 2083 } |
| 2084 | 2084 |
| 2085 /// Shadow object for [Throw]. | 2085 /// Shadow object for [Throw]. |
| 2086 class KernelThrow extends Throw implements KernelExpression { | 2086 class ShadowThrow extends Throw implements ShadowExpression { |
| 2087 KernelThrow(Expression expression) : super(expression); | 2087 ShadowThrow(Expression expression) : super(expression); |
| 2088 | 2088 |
| 2089 @override | 2089 @override |
| 2090 void _collectDependencies(KernelDependencyCollector collector) { | 2090 void _collectDependencies(ShadowDependencyCollector collector) { |
| 2091 // No inference dependencies. | 2091 // No inference dependencies. |
| 2092 } | 2092 } |
| 2093 | 2093 |
| 2094 @override | 2094 @override |
| 2095 DartType _inferExpression( | 2095 DartType _inferExpression( |
| 2096 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2096 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2097 typeNeeded = inferrer.listener.throwEnter(this, typeContext) || typeNeeded; | 2097 typeNeeded = inferrer.listener.throwEnter(this, typeContext) || typeNeeded; |
| 2098 inferrer.inferExpression(expression, null, false); | 2098 inferrer.inferExpression(expression, null, false); |
| 2099 var inferredType = typeNeeded ? const BottomType() : null; | 2099 var inferredType = typeNeeded ? const BottomType() : null; |
| 2100 inferrer.listener.throwExit(this, inferredType); | 2100 inferrer.listener.throwExit(this, inferredType); |
| 2101 return inferredType; | 2101 return inferredType; |
| 2102 } | 2102 } |
| 2103 } | 2103 } |
| 2104 | 2104 |
| 2105 /// Concrete shadow object representing a try-catch block in kernel form. | 2105 /// Concrete shadow object representing a try-catch block in kernel form. |
| 2106 class KernelTryCatch extends TryCatch implements KernelStatement { | 2106 class ShadowTryCatch extends TryCatch implements ShadowStatement { |
| 2107 KernelTryCatch(Statement body, List<Catch> catches) : super(body, catches); | 2107 ShadowTryCatch(Statement body, List<Catch> catches) : super(body, catches); |
| 2108 | 2108 |
| 2109 @override | 2109 @override |
| 2110 void _inferStatement(KernelTypeInferrer inferrer) { | 2110 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 2111 inferrer.listener.tryCatchEnter(this); | 2111 inferrer.listener.tryCatchEnter(this); |
| 2112 inferrer.inferStatement(body); | 2112 inferrer.inferStatement(body); |
| 2113 for (var catch_ in catches) { | 2113 for (var catch_ in catches) { |
| 2114 inferrer.inferStatement(catch_.body); | 2114 inferrer.inferStatement(catch_.body); |
| 2115 } | 2115 } |
| 2116 inferrer.listener.tryCatchExit(this); | 2116 inferrer.listener.tryCatchExit(this); |
| 2117 } | 2117 } |
| 2118 } | 2118 } |
| 2119 | 2119 |
| 2120 /// Concrete shadow object representing a try-finally block in kernel form. | 2120 /// Concrete shadow object representing a try-finally block in kernel form. |
| 2121 class KernelTryFinally extends TryFinally implements KernelStatement { | 2121 class ShadowTryFinally extends TryFinally implements ShadowStatement { |
| 2122 KernelTryFinally(Statement body, Statement finalizer) | 2122 ShadowTryFinally(Statement body, Statement finalizer) |
| 2123 : super(body, finalizer); | 2123 : super(body, finalizer); |
| 2124 | 2124 |
| 2125 @override | 2125 @override |
| 2126 void _inferStatement(KernelTypeInferrer inferrer) { | 2126 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 2127 inferrer.listener.tryFinallyEnter(this); | 2127 inferrer.listener.tryFinallyEnter(this); |
| 2128 inferrer.inferStatement(body); | 2128 inferrer.inferStatement(body); |
| 2129 inferrer.inferStatement(finalizer); | 2129 inferrer.inferStatement(finalizer); |
| 2130 inferrer.listener.tryFinallyExit(this); | 2130 inferrer.listener.tryFinallyExit(this); |
| 2131 } | 2131 } |
| 2132 } | 2132 } |
| 2133 | 2133 |
| 2134 /// Concrete implementation of [TypeInferenceEngine] specialized to work with | 2134 /// Concrete implementation of [TypeInferenceEngine] specialized to work with |
| 2135 /// kernel objects. | 2135 /// kernel objects. |
| 2136 class KernelTypeInferenceEngine extends TypeInferenceEngineImpl { | 2136 class ShadowTypeInferenceEngine extends TypeInferenceEngineImpl { |
| 2137 KernelTypeInferenceEngine(Instrumentation instrumentation, bool strongMode) | 2137 ShadowTypeInferenceEngine(Instrumentation instrumentation, bool strongMode) |
| 2138 : super(instrumentation, strongMode); | 2138 : super(instrumentation, strongMode); |
| 2139 | 2139 |
| 2140 @override | 2140 @override |
| 2141 AccessorNode createAccessorNode(KernelMember member) { | 2141 AccessorNode createAccessorNode(ShadowMember member) { |
| 2142 AccessorNode accessorNode = new AccessorNode(this, member); | 2142 AccessorNode accessorNode = new AccessorNode(this, member); |
| 2143 member._accessorNode = accessorNode; | 2143 member._accessorNode = accessorNode; |
| 2144 return accessorNode; | 2144 return accessorNode; |
| 2145 } | 2145 } |
| 2146 | 2146 |
| 2147 @override | 2147 @override |
| 2148 TypeInferrer createDisabledTypeInferrer() => | 2148 TypeInferrer createDisabledTypeInferrer() => |
| 2149 new TypeInferrerDisabled(typeSchemaEnvironment); | 2149 new TypeInferrerDisabled(typeSchemaEnvironment); |
| 2150 | 2150 |
| 2151 @override | 2151 @override |
| 2152 KernelTypeInferrer createLocalTypeInferrer( | 2152 ShadowTypeInferrer createLocalTypeInferrer( |
| 2153 Uri uri, TypeInferenceListener listener, InterfaceType thisType) { | 2153 Uri uri, TypeInferenceListener listener, InterfaceType thisType) { |
| 2154 return new KernelTypeInferrer._( | 2154 return new ShadowTypeInferrer._( |
| 2155 this, uri.toString(), listener, false, thisType, null); | 2155 this, uri.toString(), listener, false, thisType, null); |
| 2156 } | 2156 } |
| 2157 | 2157 |
| 2158 @override | 2158 @override |
| 2159 MethodNode createMethodNode(KernelProcedure procedure) { | 2159 MethodNode createMethodNode(ShadowProcedure procedure) { |
| 2160 MethodNode methodNode = new MethodNode(procedure); | 2160 MethodNode methodNode = new MethodNode(procedure); |
| 2161 procedure._methodNode = methodNode; | 2161 procedure._methodNode = methodNode; |
| 2162 return methodNode; | 2162 return methodNode; |
| 2163 } | 2163 } |
| 2164 | 2164 |
| 2165 @override | 2165 @override |
| 2166 KernelTypeInferrer createTopLevelTypeInferrer(TypeInferenceListener listener, | 2166 ShadowTypeInferrer createTopLevelTypeInferrer(TypeInferenceListener listener, |
| 2167 InterfaceType thisType, KernelMember member) { | 2167 InterfaceType thisType, ShadowMember member) { |
| 2168 return member._typeInferrer = new KernelTypeInferrer._( | 2168 return member._typeInferrer = new ShadowTypeInferrer._( |
| 2169 this, member.fileUri, listener, true, thisType, member._accessorNode); | 2169 this, member.fileUri, listener, true, thisType, member._accessorNode); |
| 2170 } | 2170 } |
| 2171 | 2171 |
| 2172 @override | 2172 @override |
| 2173 KernelTypeInferrer getMemberTypeInferrer(KernelMember member) { | 2173 ShadowTypeInferrer getMemberTypeInferrer(ShadowMember member) { |
| 2174 return member._typeInferrer; | 2174 return member._typeInferrer; |
| 2175 } | 2175 } |
| 2176 } | 2176 } |
| 2177 | 2177 |
| 2178 /// Concrete implementation of [TypeInferrer] specialized to work with kernel | 2178 /// Concrete implementation of [TypeInferrer] specialized to work with kernel |
| 2179 /// objects. | 2179 /// objects. |
| 2180 class KernelTypeInferrer extends TypeInferrerImpl { | 2180 class ShadowTypeInferrer extends TypeInferrerImpl { |
| 2181 @override | 2181 @override |
| 2182 final typePromoter = new KernelTypePromoter(); | 2182 final typePromoter = new ShadowTypePromoter(); |
| 2183 | 2183 |
| 2184 KernelTypeInferrer._( | 2184 ShadowTypeInferrer._( |
| 2185 KernelTypeInferenceEngine engine, | 2185 ShadowTypeInferenceEngine engine, |
| 2186 String uri, | 2186 String uri, |
| 2187 TypeInferenceListener listener, | 2187 TypeInferenceListener listener, |
| 2188 bool topLevel, | 2188 bool topLevel, |
| 2189 InterfaceType thisType, | 2189 InterfaceType thisType, |
| 2190 AccessorNode accessorNode) | 2190 AccessorNode accessorNode) |
| 2191 : super(engine, uri, listener, topLevel, thisType, accessorNode); | 2191 : super(engine, uri, listener, topLevel, thisType, accessorNode); |
| 2192 | 2192 |
| 2193 @override | 2193 @override |
| 2194 Expression getFieldInitializer(KernelField field) { | 2194 Expression getFieldInitializer(ShadowField field) { |
| 2195 return field.initializer; | 2195 return field.initializer; |
| 2196 } | 2196 } |
| 2197 | 2197 |
| 2198 @override | 2198 @override |
| 2199 DartType inferExpression( | 2199 DartType inferExpression( |
| 2200 Expression expression, DartType typeContext, bool typeNeeded) { | 2200 Expression expression, DartType typeContext, bool typeNeeded) { |
| 2201 // When doing top level inference, we skip subexpressions whose type isn't | 2201 // When doing top level inference, we skip subexpressions whose type isn't |
| 2202 // needed so that we don't induce bogus dependencies on fields mentioned in | 2202 // needed so that we don't induce bogus dependencies on fields mentioned in |
| 2203 // those subexpressions. | 2203 // those subexpressions. |
| 2204 if (!typeNeeded && isTopLevel) return null; | 2204 if (!typeNeeded && isTopLevel) return null; |
| 2205 | 2205 |
| 2206 if (expression is KernelExpression) { | 2206 if (expression is ShadowExpression) { |
| 2207 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind | 2207 // Use polymorphic dispatch on [KernelExpression] to perform whatever kind |
| 2208 // of type inference is correct for this kind of statement. | 2208 // of type inference is correct for this kind of statement. |
| 2209 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 2209 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 2210 // so that the type hierarchy will be simpler (which may speed up "is" | 2210 // so that the type hierarchy will be simpler (which may speed up "is" |
| 2211 // checks). | 2211 // checks). |
| 2212 return expression._inferExpression(this, typeContext, typeNeeded); | 2212 return expression._inferExpression(this, typeContext, typeNeeded); |
| 2213 } else { | 2213 } else { |
| 2214 // Encountered an expression type for which type inference is not yet | 2214 // Encountered an expression type for which type inference is not yet |
| 2215 // implemented, so just infer dynamic for now. | 2215 // implemented, so just infer dynamic for now. |
| 2216 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 2216 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 2217 // everything, this case should no longer be needed. | 2217 // everything, this case should no longer be needed. |
| 2218 return typeNeeded ? const DynamicType() : null; | 2218 return typeNeeded ? const DynamicType() : null; |
| 2219 } | 2219 } |
| 2220 } | 2220 } |
| 2221 | 2221 |
| 2222 @override | 2222 @override |
| 2223 DartType inferFieldTopLevel( | 2223 DartType inferFieldTopLevel( |
| 2224 KernelField field, DartType type, bool typeNeeded) { | 2224 ShadowField field, DartType type, bool typeNeeded) { |
| 2225 if (field.initializer == null) return const DynamicType(); | 2225 if (field.initializer == null) return const DynamicType(); |
| 2226 return inferExpression(field.initializer, type, typeNeeded); | 2226 return inferExpression(field.initializer, type, typeNeeded); |
| 2227 } | 2227 } |
| 2228 | 2228 |
| 2229 @override | 2229 @override |
| 2230 void inferInitializer(Initializer initializer) { | 2230 void inferInitializer(Initializer initializer) { |
| 2231 assert(initializer is KernelInitializer); | 2231 assert(initializer is ShadowInitializer); |
| 2232 // Use polymorphic dispatch on [KernelInitializer] to perform whatever | 2232 // Use polymorphic dispatch on [KernelInitializer] to perform whatever |
| 2233 // kind of type inference is correct for this kind of initializer. | 2233 // kind of type inference is correct for this kind of initializer. |
| 2234 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 2234 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 2235 // so that the type hierarchy will be simpler (which may speed up "is" | 2235 // so that the type hierarchy will be simpler (which may speed up "is" |
| 2236 // checks). | 2236 // checks). |
| 2237 KernelInitializer kernelInitializer = initializer; | 2237 ShadowInitializer kernelInitializer = initializer; |
| 2238 return kernelInitializer._inferInitializer(this); | 2238 return kernelInitializer._inferInitializer(this); |
| 2239 } | 2239 } |
| 2240 | 2240 |
| 2241 @override | 2241 @override |
| 2242 void inferStatement(Statement statement) { | 2242 void inferStatement(Statement statement) { |
| 2243 if (statement is KernelStatement) { | 2243 if (statement is ShadowStatement) { |
| 2244 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind | 2244 // Use polymorphic dispatch on [KernelStatement] to perform whatever kind |
| 2245 // of type inference is correct for this kind of statement. | 2245 // of type inference is correct for this kind of statement. |
| 2246 // TODO(paulberry): experiment to see if dynamic dispatch would be better, | 2246 // TODO(paulberry): experiment to see if dynamic dispatch would be better, |
| 2247 // so that the type hierarchy will be simpler (which may speed up "is" | 2247 // so that the type hierarchy will be simpler (which may speed up "is" |
| 2248 // checks). | 2248 // checks). |
| 2249 return statement._inferStatement(this); | 2249 return statement._inferStatement(this); |
| 2250 } else { | 2250 } else { |
| 2251 // Encountered a statement type for which type inference is not yet | 2251 // Encountered a statement type for which type inference is not yet |
| 2252 // implemented, so just skip it for now. | 2252 // implemented, so just skip it for now. |
| 2253 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 2253 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 2254 // everything, this case should no longer be needed. | 2254 // everything, this case should no longer be needed. |
| 2255 } | 2255 } |
| 2256 } | 2256 } |
| 2257 } | 2257 } |
| 2258 | 2258 |
| 2259 /// Shadow object for [TypeLiteral]. | 2259 /// Shadow object for [TypeLiteral]. |
| 2260 class KernelTypeLiteral extends TypeLiteral implements KernelExpression { | 2260 class ShadowTypeLiteral extends TypeLiteral implements ShadowExpression { |
| 2261 KernelTypeLiteral(DartType type) : super(type); | 2261 ShadowTypeLiteral(DartType type) : super(type); |
| 2262 | 2262 |
| 2263 @override | 2263 @override |
| 2264 void _collectDependencies(KernelDependencyCollector collector) { | 2264 void _collectDependencies(ShadowDependencyCollector collector) { |
| 2265 // No inference dependencies. | 2265 // No inference dependencies. |
| 2266 } | 2266 } |
| 2267 | 2267 |
| 2268 @override | 2268 @override |
| 2269 DartType _inferExpression( | 2269 DartType _inferExpression( |
| 2270 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2270 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2271 typeNeeded = | 2271 typeNeeded = |
| 2272 inferrer.listener.typeLiteralEnter(this, typeContext) || typeNeeded; | 2272 inferrer.listener.typeLiteralEnter(this, typeContext) || typeNeeded; |
| 2273 var inferredType = typeNeeded ? inferrer.coreTypes.typeClass.rawType : null; | 2273 var inferredType = typeNeeded ? inferrer.coreTypes.typeClass.rawType : null; |
| 2274 inferrer.listener.typeLiteralExit(this, inferredType); | 2274 inferrer.listener.typeLiteralExit(this, inferredType); |
| 2275 return inferredType; | 2275 return inferredType; |
| 2276 } | 2276 } |
| 2277 } | 2277 } |
| 2278 | 2278 |
| 2279 /// Concrete implementation of [TypePromoter] specialized to work with kernel | 2279 /// Concrete implementation of [TypePromoter] specialized to work with kernel |
| 2280 /// objects. | 2280 /// objects. |
| 2281 class KernelTypePromoter extends TypePromoterImpl { | 2281 class ShadowTypePromoter extends TypePromoterImpl { |
| 2282 @override | 2282 @override |
| 2283 int getVariableFunctionNestingLevel(VariableDeclaration variable) { | 2283 int getVariableFunctionNestingLevel(VariableDeclaration variable) { |
| 2284 if (variable is KernelVariableDeclaration) { | 2284 if (variable is ShadowVariableDeclaration) { |
| 2285 return variable._functionNestingLevel; | 2285 return variable._functionNestingLevel; |
| 2286 } else { | 2286 } else { |
| 2287 // Hack to deal with the fact that BodyBuilder still creates raw | 2287 // Hack to deal with the fact that BodyBuilder still creates raw |
| 2288 // VariableDeclaration objects sometimes. | 2288 // VariableDeclaration objects sometimes. |
| 2289 // TODO(paulberry): get rid of this once the type parameter is | 2289 // TODO(paulberry): get rid of this once the type parameter is |
| 2290 // KernelVariableDeclaration. | 2290 // KernelVariableDeclaration. |
| 2291 return 0; | 2291 return 0; |
| 2292 } | 2292 } |
| 2293 } | 2293 } |
| 2294 | 2294 |
| 2295 @override | 2295 @override |
| 2296 bool isPromotionCandidate(VariableDeclaration variable) { | 2296 bool isPromotionCandidate(VariableDeclaration variable) { |
| 2297 assert(variable is KernelVariableDeclaration); | 2297 assert(variable is ShadowVariableDeclaration); |
| 2298 KernelVariableDeclaration kernelVariableDeclaration = variable; | 2298 ShadowVariableDeclaration kernelVariableDeclaration = variable; |
| 2299 return !kernelVariableDeclaration._isLocalFunction; | 2299 return !kernelVariableDeclaration._isLocalFunction; |
| 2300 } | 2300 } |
| 2301 | 2301 |
| 2302 @override | 2302 @override |
| 2303 bool sameExpressions(Expression a, Expression b) { | 2303 bool sameExpressions(Expression a, Expression b) { |
| 2304 return identical(a, b); | 2304 return identical(a, b); |
| 2305 } | 2305 } |
| 2306 | 2306 |
| 2307 @override | 2307 @override |
| 2308 void setVariableMutatedAnywhere(VariableDeclaration variable) { | 2308 void setVariableMutatedAnywhere(VariableDeclaration variable) { |
| 2309 if (variable is KernelVariableDeclaration) { | 2309 if (variable is ShadowVariableDeclaration) { |
| 2310 variable._mutatedAnywhere = true; | 2310 variable._mutatedAnywhere = true; |
| 2311 } else { | 2311 } else { |
| 2312 // Hack to deal with the fact that BodyBuilder still creates raw | 2312 // Hack to deal with the fact that BodyBuilder still creates raw |
| 2313 // VariableDeclaration objects sometimes. | 2313 // VariableDeclaration objects sometimes. |
| 2314 // TODO(paulberry): get rid of this once the type parameter is | 2314 // TODO(paulberry): get rid of this once the type parameter is |
| 2315 // KernelVariableDeclaration. | 2315 // KernelVariableDeclaration. |
| 2316 } | 2316 } |
| 2317 } | 2317 } |
| 2318 | 2318 |
| 2319 @override | 2319 @override |
| 2320 void setVariableMutatedInClosure(VariableDeclaration variable) { | 2320 void setVariableMutatedInClosure(VariableDeclaration variable) { |
| 2321 if (variable is KernelVariableDeclaration) { | 2321 if (variable is ShadowVariableDeclaration) { |
| 2322 variable._mutatedInClosure = true; | 2322 variable._mutatedInClosure = true; |
| 2323 } else { | 2323 } else { |
| 2324 // Hack to deal with the fact that BodyBuilder still creates raw | 2324 // Hack to deal with the fact that BodyBuilder still creates raw |
| 2325 // VariableDeclaration objects sometimes. | 2325 // VariableDeclaration objects sometimes. |
| 2326 // TODO(paulberry): get rid of this once the type parameter is | 2326 // TODO(paulberry): get rid of this once the type parameter is |
| 2327 // KernelVariableDeclaration. | 2327 // KernelVariableDeclaration. |
| 2328 } | 2328 } |
| 2329 } | 2329 } |
| 2330 | 2330 |
| 2331 @override | 2331 @override |
| 2332 bool wasVariableMutatedAnywhere(VariableDeclaration variable) { | 2332 bool wasVariableMutatedAnywhere(VariableDeclaration variable) { |
| 2333 if (variable is KernelVariableDeclaration) { | 2333 if (variable is ShadowVariableDeclaration) { |
| 2334 return variable._mutatedAnywhere; | 2334 return variable._mutatedAnywhere; |
| 2335 } else { | 2335 } else { |
| 2336 // Hack to deal with the fact that BodyBuilder still creates raw | 2336 // Hack to deal with the fact that BodyBuilder still creates raw |
| 2337 // VariableDeclaration objects sometimes. | 2337 // VariableDeclaration objects sometimes. |
| 2338 // TODO(paulberry): get rid of this once the type parameter is | 2338 // TODO(paulberry): get rid of this once the type parameter is |
| 2339 // KernelVariableDeclaration. | 2339 // KernelVariableDeclaration. |
| 2340 return true; | 2340 return true; |
| 2341 } | 2341 } |
| 2342 } | 2342 } |
| 2343 } | 2343 } |
| 2344 | 2344 |
| 2345 /// Concrete shadow object representing an assignment to a local variable. | 2345 /// Concrete shadow object representing an assignment to a local variable. |
| 2346 class KernelVariableAssignment extends KernelComplexAssignment { | 2346 class ShadowVariableAssignment extends ShadowComplexAssignment { |
| 2347 KernelVariableAssignment(Expression rhs) : super(rhs); | 2347 ShadowVariableAssignment(Expression rhs) : super(rhs); |
| 2348 | 2348 |
| 2349 @override | 2349 @override |
| 2350 DartType _inferExpression( | 2350 DartType _inferExpression( |
| 2351 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2351 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2352 typeNeeded = | 2352 typeNeeded = |
| 2353 inferrer.listener.variableAssignEnter(desugared, typeContext) || | 2353 inferrer.listener.variableAssignEnter(desugared, typeContext) || |
| 2354 typeNeeded; | 2354 typeNeeded; |
| 2355 // TODO(paulberry): record the appropriate types on let variables and | 2355 // TODO(paulberry): record the appropriate types on let variables and |
| 2356 // conditional expressions. | 2356 // conditional expressions. |
| 2357 DartType writeContext; | 2357 DartType writeContext; |
| 2358 var write = this.write; | 2358 var write = this.write; |
| 2359 if (write is VariableSet) { | 2359 if (write is VariableSet) { |
| 2360 writeContext = write.variable.type; | 2360 writeContext = write.variable.type; |
| 2361 } | 2361 } |
| 2362 var inferredType = _inferRhs(inferrer, writeContext); | 2362 var inferredType = _inferRhs(inferrer, writeContext); |
| 2363 inferrer.listener.variableAssignExit(desugared, inferredType); | 2363 inferrer.listener.variableAssignExit(desugared, inferredType); |
| 2364 return inferredType; | 2364 return inferredType; |
| 2365 } | 2365 } |
| 2366 } | 2366 } |
| 2367 | 2367 |
| 2368 /// Concrete shadow object representing a variable declaration in kernel form. | 2368 /// Concrete shadow object representing a variable declaration in kernel form. |
| 2369 class KernelVariableDeclaration extends VariableDeclaration | 2369 class ShadowVariableDeclaration extends VariableDeclaration |
| 2370 implements KernelStatement { | 2370 implements ShadowStatement { |
| 2371 final bool _implicitlyTyped; | 2371 final bool _implicitlyTyped; |
| 2372 | 2372 |
| 2373 final int _functionNestingLevel; | 2373 final int _functionNestingLevel; |
| 2374 | 2374 |
| 2375 bool _mutatedInClosure = false; | 2375 bool _mutatedInClosure = false; |
| 2376 | 2376 |
| 2377 bool _mutatedAnywhere = false; | 2377 bool _mutatedAnywhere = false; |
| 2378 | 2378 |
| 2379 final bool _isLocalFunction; | 2379 final bool _isLocalFunction; |
| 2380 | 2380 |
| 2381 /// If this variable declaration represents a formal parameter, indicates | 2381 /// If this variable declaration represents a formal parameter, indicates |
| 2382 /// whether uses of it need to be type-checked due to the covariance of class | 2382 /// whether uses of it need to be type-checked due to the covariance of class |
| 2383 /// type parameters. | 2383 /// type parameters. |
| 2384 /// | 2384 /// |
| 2385 /// TODO(paulberry): replace this with an enum so that it can represent | 2385 /// TODO(paulberry): replace this with an enum so that it can represent |
| 2386 /// "unsafe" parameters as well. | 2386 /// "unsafe" parameters as well. |
| 2387 /// | 2387 /// |
| 2388 /// TODO(paulberry): remove this once there is a corresponding annotation in | 2388 /// TODO(paulberry): remove this once there is a corresponding annotation in |
| 2389 /// the kernel representation. | 2389 /// the kernel representation. |
| 2390 bool isSemiSafe = false; | 2390 bool isSemiSafe = false; |
| 2391 | 2391 |
| 2392 KernelVariableDeclaration(String name, this._functionNestingLevel, | 2392 ShadowVariableDeclaration(String name, this._functionNestingLevel, |
| 2393 {Expression initializer, | 2393 {Expression initializer, |
| 2394 DartType type, | 2394 DartType type, |
| 2395 bool isFinal: false, | 2395 bool isFinal: false, |
| 2396 bool isConst: false, | 2396 bool isConst: false, |
| 2397 bool isFieldFormal: false, | 2397 bool isFieldFormal: false, |
| 2398 bool isCovariant: false, | 2398 bool isCovariant: false, |
| 2399 bool isLocalFunction: false}) | 2399 bool isLocalFunction: false}) |
| 2400 : _implicitlyTyped = type == null, | 2400 : _implicitlyTyped = type == null, |
| 2401 _isLocalFunction = isLocalFunction, | 2401 _isLocalFunction = isLocalFunction, |
| 2402 super(name, | 2402 super(name, |
| 2403 initializer: initializer, | 2403 initializer: initializer, |
| 2404 type: type ?? const DynamicType(), | 2404 type: type ?? const DynamicType(), |
| 2405 isFinal: isFinal, | 2405 isFinal: isFinal, |
| 2406 isConst: isConst, | 2406 isConst: isConst, |
| 2407 isFieldFormal: isFieldFormal, | 2407 isFieldFormal: isFieldFormal, |
| 2408 isCovariant: isCovariant); | 2408 isCovariant: isCovariant); |
| 2409 | 2409 |
| 2410 KernelVariableDeclaration.forValue( | 2410 ShadowVariableDeclaration.forValue( |
| 2411 Expression initializer, this._functionNestingLevel) | 2411 Expression initializer, this._functionNestingLevel) |
| 2412 : _implicitlyTyped = true, | 2412 : _implicitlyTyped = true, |
| 2413 _isLocalFunction = false, | 2413 _isLocalFunction = false, |
| 2414 super.forValue(initializer); | 2414 super.forValue(initializer); |
| 2415 | 2415 |
| 2416 @override | 2416 @override |
| 2417 void _inferStatement(KernelTypeInferrer inferrer) { | 2417 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 2418 inferrer.listener.variableDeclarationEnter(this); | 2418 inferrer.listener.variableDeclarationEnter(this); |
| 2419 var declaredType = _implicitlyTyped ? null : type; | 2419 var declaredType = _implicitlyTyped ? null : type; |
| 2420 DartType inferredType; | 2420 DartType inferredType; |
| 2421 if (initializer != null) { | 2421 if (initializer != null) { |
| 2422 inferredType = inferrer.inferDeclarationType(inferrer.inferExpression( | 2422 inferredType = inferrer.inferDeclarationType(inferrer.inferExpression( |
| 2423 initializer, declaredType, _implicitlyTyped)); | 2423 initializer, declaredType, _implicitlyTyped)); |
| 2424 } else { | 2424 } else { |
| 2425 inferredType = const DynamicType(); | 2425 inferredType = const DynamicType(); |
| 2426 } | 2426 } |
| 2427 if (inferrer.strongMode && _implicitlyTyped) { | 2427 if (inferrer.strongMode && _implicitlyTyped) { |
| 2428 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, | 2428 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
| 2429 'type', new InstrumentationValueForType(inferredType)); | 2429 'type', new InstrumentationValueForType(inferredType)); |
| 2430 type = inferredType; | 2430 type = inferredType; |
| 2431 } | 2431 } |
| 2432 inferrer.listener.variableDeclarationExit(this); | 2432 inferrer.listener.variableDeclarationExit(this); |
| 2433 } | 2433 } |
| 2434 | 2434 |
| 2435 /// Determine whether the given [KernelVariableDeclaration] had an implicit | 2435 /// Determine whether the given [ShadowVariableDeclaration] had an implicit |
| 2436 /// type. | 2436 /// type. |
| 2437 /// | 2437 /// |
| 2438 /// This is static to avoid introducing a method that would be visible to | 2438 /// This is static to avoid introducing a method that would be visible to |
| 2439 /// the kernel. | 2439 /// the kernel. |
| 2440 static bool isImplicitlyTyped(KernelVariableDeclaration variable) => | 2440 static bool isImplicitlyTyped(ShadowVariableDeclaration variable) => |
| 2441 variable._implicitlyTyped; | 2441 variable._implicitlyTyped; |
| 2442 } | 2442 } |
| 2443 | 2443 |
| 2444 /// Concrete shadow object representing a read from a variable in kernel form. | 2444 /// Concrete shadow object representing a read from a variable in kernel form. |
| 2445 class KernelVariableGet extends VariableGet implements KernelExpression { | 2445 class ShadowVariableGet extends VariableGet implements ShadowExpression { |
| 2446 final TypePromotionFact _fact; | 2446 final TypePromotionFact _fact; |
| 2447 | 2447 |
| 2448 final TypePromotionScope _scope; | 2448 final TypePromotionScope _scope; |
| 2449 | 2449 |
| 2450 KernelVariableGet(VariableDeclaration variable, this._fact, this._scope) | 2450 ShadowVariableGet(VariableDeclaration variable, this._fact, this._scope) |
| 2451 : super(variable); | 2451 : super(variable); |
| 2452 | 2452 |
| 2453 @override | 2453 @override |
| 2454 void _collectDependencies(KernelDependencyCollector collector) { | 2454 void _collectDependencies(ShadowDependencyCollector collector) { |
| 2455 // No inference dependencies. | 2455 // No inference dependencies. |
| 2456 } | 2456 } |
| 2457 | 2457 |
| 2458 @override | 2458 @override |
| 2459 DartType _inferExpression( | 2459 DartType _inferExpression( |
| 2460 KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { | 2460 ShadowTypeInferrer inferrer, DartType typeContext, bool typeNeeded) { |
| 2461 var variable = this.variable as KernelVariableDeclaration; | 2461 var variable = this.variable as ShadowVariableDeclaration; |
| 2462 bool mutatedInClosure = variable._mutatedInClosure; | 2462 bool mutatedInClosure = variable._mutatedInClosure; |
| 2463 DartType declaredOrInferredType = variable.type; | 2463 DartType declaredOrInferredType = variable.type; |
| 2464 typeNeeded = | 2464 typeNeeded = |
| 2465 inferrer.listener.variableGetEnter(this, typeContext) || typeNeeded; | 2465 inferrer.listener.variableGetEnter(this, typeContext) || typeNeeded; |
| 2466 DartType promotedType = inferrer.typePromoter | 2466 DartType promotedType = inferrer.typePromoter |
| 2467 .computePromotedType(_fact, _scope, mutatedInClosure); | 2467 .computePromotedType(_fact, _scope, mutatedInClosure); |
| 2468 if (promotedType != null) { | 2468 if (promotedType != null) { |
| 2469 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, | 2469 inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset, |
| 2470 'promotedType', new InstrumentationValueForType(promotedType)); | 2470 'promotedType', new InstrumentationValueForType(promotedType)); |
| 2471 } | 2471 } |
| 2472 this.promotedType = promotedType; | 2472 this.promotedType = promotedType; |
| 2473 var inferredType = | 2473 var inferredType = |
| 2474 typeNeeded ? (promotedType ?? declaredOrInferredType) : null; | 2474 typeNeeded ? (promotedType ?? declaredOrInferredType) : null; |
| 2475 inferrer.listener.variableGetExit(this, inferredType); | 2475 inferrer.listener.variableGetExit(this, inferredType); |
| 2476 return inferredType; | 2476 return inferredType; |
| 2477 } | 2477 } |
| 2478 } | 2478 } |
| 2479 | 2479 |
| 2480 /// Concrete shadow object representing a while loop in kernel form. | 2480 /// Concrete shadow object representing a while loop in kernel form. |
| 2481 class KernelWhileStatement extends WhileStatement implements KernelStatement { | 2481 class ShadowWhileStatement extends WhileStatement implements ShadowStatement { |
| 2482 KernelWhileStatement(Expression condition, Statement body) | 2482 ShadowWhileStatement(Expression condition, Statement body) |
| 2483 : super(condition, body); | 2483 : super(condition, body); |
| 2484 | 2484 |
| 2485 @override | 2485 @override |
| 2486 void _inferStatement(KernelTypeInferrer inferrer) { | 2486 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 2487 inferrer.listener.whileStatementEnter(this); | 2487 inferrer.listener.whileStatementEnter(this); |
| 2488 inferrer.inferExpression( | 2488 inferrer.inferExpression( |
| 2489 condition, inferrer.coreTypes.boolClass.rawType, false); | 2489 condition, inferrer.coreTypes.boolClass.rawType, false); |
| 2490 inferrer.inferStatement(body); | 2490 inferrer.inferStatement(body); |
| 2491 inferrer.listener.whileStatementExit(this); | 2491 inferrer.listener.whileStatementExit(this); |
| 2492 } | 2492 } |
| 2493 } | 2493 } |
| 2494 | 2494 |
| 2495 /// Concrete shadow object representing a yield statement in kernel form. | 2495 /// Concrete shadow object representing a yield statement in kernel form. |
| 2496 class KernelYieldStatement extends YieldStatement implements KernelStatement { | 2496 class ShadowYieldStatement extends YieldStatement implements ShadowStatement { |
| 2497 KernelYieldStatement(Expression expression, {bool isYieldStar: false}) | 2497 ShadowYieldStatement(Expression expression, {bool isYieldStar: false}) |
| 2498 : super(expression, isYieldStar: isYieldStar); | 2498 : super(expression, isYieldStar: isYieldStar); |
| 2499 | 2499 |
| 2500 @override | 2500 @override |
| 2501 void _inferStatement(KernelTypeInferrer inferrer) { | 2501 void _inferStatement(ShadowTypeInferrer inferrer) { |
| 2502 inferrer.listener.yieldStatementEnter(this); | 2502 inferrer.listener.yieldStatementEnter(this); |
| 2503 var closureContext = inferrer.closureContext; | 2503 var closureContext = inferrer.closureContext; |
| 2504 var typeContext = | 2504 var typeContext = |
| 2505 closureContext.isGenerator ? closureContext.returnContext : null; | 2505 closureContext.isGenerator ? closureContext.returnContext : null; |
| 2506 if (isYieldStar && typeContext != null) { | 2506 if (isYieldStar && typeContext != null) { |
| 2507 typeContext = inferrer.wrapType( | 2507 typeContext = inferrer.wrapType( |
| 2508 typeContext, | 2508 typeContext, |
| 2509 closureContext.isAsync | 2509 closureContext.isAsync |
| 2510 ? inferrer.coreTypes.streamClass | 2510 ? inferrer.coreTypes.streamClass |
| 2511 : inferrer.coreTypes.iterableClass); | 2511 : inferrer.coreTypes.iterableClass); |
| 2512 } | 2512 } |
| 2513 var inferredType = inferrer.inferExpression(expression, typeContext, true); | 2513 var inferredType = inferrer.inferExpression(expression, typeContext, true); |
| 2514 closureContext.handleYield(inferrer, isYieldStar, inferredType); | 2514 closureContext.handleYield(inferrer, isYieldStar, inferredType); |
| 2515 inferrer.listener.yieldStatementExit(this); | 2515 inferrer.listener.yieldStatementExit(this); |
| 2516 } | 2516 } |
| 2517 } | 2517 } |
| 2518 | 2518 |
| 2519 class _UnfinishedCascade extends Expression { | 2519 class _UnfinishedCascade extends Expression { |
| 2520 accept(v) => unsupported("accept", -1, null); | 2520 accept(v) => unsupported("accept", -1, null); |
| 2521 | 2521 |
| 2522 accept1(v, arg) => unsupported("accept1", -1, null); | 2522 accept1(v, arg) => unsupported("accept1", -1, null); |
| 2523 | 2523 |
| 2524 getStaticType(types) => unsupported("getStaticType", -1, null); | 2524 getStaticType(types) => unsupported("getStaticType", -1, null); |
| 2525 | 2525 |
| 2526 transformChildren(v) => unsupported("transformChildren", -1, null); | 2526 transformChildren(v) => unsupported("transformChildren", -1, null); |
| 2527 | 2527 |
| 2528 visitChildren(v) => unsupported("visitChildren", -1, null); | 2528 visitChildren(v) => unsupported("visitChildren", -1, null); |
| 2529 } | 2529 } |
| OLD | NEW |