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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart

Issue 3004923002: Rename front end shadow classes from "Kernel..." to "Shadow...". (Closed)
Patch Set: Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// This file declares a "shadow hierarchy" of concrete classes which extend 5 /// This file declares a "shadow hierarchy" of concrete classes which extend
6 /// the kernel class hierarchy, adding methods and fields needed by the 6 /// the kernel class hierarchy, adding methods and fields needed by the
7 /// BodyBuilder. 7 /// BodyBuilder.
8 /// 8 ///
9 /// Instances of these classes may be created using the factory methods in 9 /// Instances of these classes may be created using the factory methods in
10 /// `ast_factory.dart`. 10 /// `ast_factory.dart`.
(...skipping 24 matching lines...) Expand all
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698