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

Side by Side Diff: pkg/front_end/lib/src/fasta/kernel/frontend_accessors.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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 /// A library to help transform compounds and null-aware accessors into 5 /// A library to help transform compounds and null-aware accessors into
6 /// let expressions. 6 /// let expressions.
7 7
8 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression; 8 import 'package:kernel/ast.dart' hide MethodInvocation, InvalidExpression;
9 9
10 import '../../scanner/token.dart' show Token; 10 import '../../scanner/token.dart' show Token;
11 11
12 import '../names.dart' show equalsName, indexGetName, indexSetName; 12 import '../names.dart' show equalsName, indexGetName, indexSetName;
13 13
14 import '../problems.dart' show unhandled; 14 import '../problems.dart' show unhandled;
15 15
16 import 'fasta_accessors.dart' show BuilderHelper; 16 import 'fasta_accessors.dart' show BuilderHelper;
17 17
18 import 'kernel_shadow_ast.dart' 18 import 'kernel_shadow_ast.dart'
19 show 19 show
20 KernelArguments, 20 ShadowArguments,
21 KernelComplexAssignment, 21 ShadowComplexAssignment,
22 KernelConditionalExpression, 22 ShadowConditionalExpression,
23 KernelIllegalAssignment, 23 ShadowIllegalAssignment,
24 KernelMethodInvocation, 24 ShadowMethodInvocation,
25 KernelNullAwarePropertyGet, 25 ShadowNullAwarePropertyGet,
26 KernelPropertyAssign, 26 ShadowPropertyAssign,
27 KernelPropertyGet, 27 ShadowPropertyGet,
28 KernelSuperMethodInvocation, 28 ShadowSuperMethodInvocation,
29 KernelSuperPropertyGet, 29 ShadowSuperPropertyGet,
30 KernelThisExpression, 30 ShadowThisExpression,
31 KernelVariableDeclaration, 31 ShadowVariableDeclaration,
32 KernelVariableGet; 32 ShadowVariableGet;
33 33
34 import 'utils.dart' show offsetForToken; 34 import 'utils.dart' show offsetForToken;
35 35
36 /// An [Accessor] represents a subexpression for which we can't yet build a 36 /// An [Accessor] represents a subexpression for which we can't yet build a
37 /// kernel [Expression] because we don't yet know the context in which it is 37 /// kernel [Expression] because we don't yet know the context in which it is
38 /// used. 38 /// used.
39 /// 39 ///
40 /// Once the context is known, an [Accessor] can be converted into an 40 /// Once the context is known, an [Accessor] can be converted into an
41 /// [Expression] by calling a "build" method. 41 /// [Expression] by calling a "build" method.
42 /// 42 ///
(...skipping 29 matching lines...) Expand all
72 /// 72 ///
73 /// The returned expression evaluates to the assigned value, unless 73 /// The returned expression evaluates to the assigned value, unless
74 /// [voidContext] is true, in which case it may evaluate to anything. 74 /// [voidContext] is true, in which case it may evaluate to anything.
75 /// 75 ///
76 /// [type] is the static type of the RHS. 76 /// [type] is the static type of the RHS.
77 Expression buildNullAwareAssignment( 77 Expression buildNullAwareAssignment(
78 Expression value, DartType type, int offset, 78 Expression value, DartType type, int offset,
79 {bool voidContext: false}) { 79 {bool voidContext: false}) {
80 var complexAssignment = startComplexAssignment(value); 80 var complexAssignment = startComplexAssignment(value);
81 if (voidContext) { 81 if (voidContext) {
82 var nullAwareCombiner = new KernelConditionalExpression( 82 var nullAwareCombiner = new ShadowConditionalExpression(
83 buildIsNull(_makeRead(complexAssignment), offset), 83 buildIsNull(_makeRead(complexAssignment), offset),
84 _makeWrite(value, false, complexAssignment), 84 _makeWrite(value, false, complexAssignment),
85 new NullLiteral()); 85 new NullLiteral());
86 complexAssignment?.nullAwareCombiner = nullAwareCombiner; 86 complexAssignment?.nullAwareCombiner = nullAwareCombiner;
87 return _finish(nullAwareCombiner, complexAssignment); 87 return _finish(nullAwareCombiner, complexAssignment);
88 } 88 }
89 var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment)); 89 var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
90 var nullAwareCombiner = new KernelConditionalExpression( 90 var nullAwareCombiner = new ShadowConditionalExpression(
91 buildIsNull(new VariableGet(tmp), offset), 91 buildIsNull(new VariableGet(tmp), offset),
92 _makeWrite(value, false, complexAssignment), 92 _makeWrite(value, false, complexAssignment),
93 new VariableGet(tmp)); 93 new VariableGet(tmp));
94 complexAssignment?.nullAwareCombiner = nullAwareCombiner; 94 complexAssignment?.nullAwareCombiner = nullAwareCombiner;
95 return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment); 95 return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
96 } 96 }
97 97
98 /// Returns an [Expression] representing a compound assignment (e.g. `+=`) 98 /// Returns an [Expression] representing a compound assignment (e.g. `+=`)
99 /// with the accessor on the LHS and [value] on the RHS. 99 /// with the accessor on the LHS and [value] on the RHS.
100 Expression buildCompoundAssignment(Name binaryOperator, Expression value, 100 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 } 137 }
138 var rhs = new IntLiteral(1); 138 var rhs = new IntLiteral(1);
139 var complexAssignment = startComplexAssignment(rhs); 139 var complexAssignment = startComplexAssignment(rhs);
140 var value = new VariableDeclaration.forValue(_makeRead(complexAssignment)); 140 var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
141 valueAccess() => new VariableGet(value); 141 valueAccess() => new VariableGet(value);
142 var combiner = makeBinary( 142 var combiner = makeBinary(
143 valueAccess(), binaryOperator, interfaceTarget, rhs, 143 valueAccess(), binaryOperator, interfaceTarget, rhs,
144 offset: offset); 144 offset: offset);
145 complexAssignment?.combiner = combiner; 145 complexAssignment?.combiner = combiner;
146 complexAssignment?.isPostIncDec = true; 146 complexAssignment?.isPostIncDec = true;
147 var dummy = new KernelVariableDeclaration.forValue( 147 var dummy = new ShadowVariableDeclaration.forValue(
148 _makeWrite(combiner, true, complexAssignment), 148 _makeWrite(combiner, true, complexAssignment),
149 helper.functionNestingLevel); 149 helper.functionNestingLevel);
150 return _finish( 150 return _finish(
151 makeLet(value, makeLet(dummy, valueAccess())), complexAssignment); 151 makeLet(value, makeLet(dummy, valueAccess())), complexAssignment);
152 } 152 }
153 153
154 Expression _makeSimpleRead() => _makeRead(null); 154 Expression _makeSimpleRead() => _makeRead(null);
155 155
156 Expression _makeSimpleWrite(Expression value, bool voidContext, 156 Expression _makeSimpleWrite(Expression value, bool voidContext,
157 KernelComplexAssignment complexAssignment) { 157 ShadowComplexAssignment complexAssignment) {
158 return _makeWrite(value, voidContext, complexAssignment); 158 return _makeWrite(value, voidContext, complexAssignment);
159 } 159 }
160 160
161 Expression _makeRead(KernelComplexAssignment complexAssignment); 161 Expression _makeRead(ShadowComplexAssignment complexAssignment);
162 162
163 Expression _makeWrite(Expression value, bool voidContext, 163 Expression _makeWrite(Expression value, bool voidContext,
164 KernelComplexAssignment complexAssignment); 164 ShadowComplexAssignment complexAssignment);
165 165
166 Expression _finish( 166 Expression _finish(
167 Expression body, KernelComplexAssignment complexAssignment) { 167 Expression body, ShadowComplexAssignment complexAssignment) {
168 if (complexAssignment != null) { 168 if (complexAssignment != null) {
169 complexAssignment.desugared = body; 169 complexAssignment.desugared = body;
170 return complexAssignment; 170 return complexAssignment;
171 } else { 171 } else {
172 return body; 172 return body;
173 } 173 }
174 } 174 }
175 175
176 /// Returns an [Expression] representing a compile-time error. 176 /// Returns an [Expression] representing a compile-time error.
177 /// 177 ///
178 /// At runtime, an exception will be thrown. 178 /// At runtime, an exception will be thrown.
179 makeInvalidRead() { 179 makeInvalidRead() {
180 return unhandled("compile-time error", "$runtimeType", 180 return unhandled("compile-time error", "$runtimeType",
181 offsetForToken(token), helper.uri); 181 offsetForToken(token), helper.uri);
182 } 182 }
183 183
184 /// Returns an [Expression] representing a compile-time error wrapping 184 /// Returns an [Expression] representing a compile-time error wrapping
185 /// [value]. 185 /// [value].
186 /// 186 ///
187 /// At runtime, [value] will be evaluated before throwing an exception. 187 /// At runtime, [value] will be evaluated before throwing an exception.
188 makeInvalidWrite(Expression value) { 188 makeInvalidWrite(Expression value) {
189 return unhandled("compile-time error", "$runtimeType", 189 return unhandled("compile-time error", "$runtimeType",
190 offsetForToken(token), helper.uri); 190 offsetForToken(token), helper.uri);
191 } 191 }
192 192
193 /// Creates a data structure for tracking the desugaring of a complex 193 /// Creates a data structure for tracking the desugaring of a complex
194 /// assignment expression whose right hand side is [rhs]. 194 /// assignment expression whose right hand side is [rhs].
195 KernelComplexAssignment startComplexAssignment(Expression rhs) => 195 ShadowComplexAssignment startComplexAssignment(Expression rhs) =>
196 new KernelIllegalAssignment(rhs); 196 new ShadowIllegalAssignment(rhs);
197 } 197 }
198 198
199 abstract class VariableAccessor extends Accessor { 199 abstract class VariableAccessor extends Accessor {
200 VariableDeclaration variable; 200 VariableDeclaration variable;
201 DartType promotedType; 201 DartType promotedType;
202 202
203 VariableAccessor( 203 VariableAccessor(
204 BuilderHelper helper, this.variable, this.promotedType, Token token) 204 BuilderHelper helper, this.variable, this.promotedType, Token token)
205 : super(helper, token); 205 : super(helper, token);
206 206
207 Expression _makeRead(KernelComplexAssignment complexAssignment) { 207 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
208 var fact = helper.typePromoter 208 var fact = helper.typePromoter
209 .getFactForAccess(variable, helper.functionNestingLevel); 209 .getFactForAccess(variable, helper.functionNestingLevel);
210 var scope = helper.typePromoter.currentScope; 210 var scope = helper.typePromoter.currentScope;
211 var read = new KernelVariableGet(variable, fact, scope) 211 var read = new ShadowVariableGet(variable, fact, scope)
212 ..fileOffset = offsetForToken(token); 212 ..fileOffset = offsetForToken(token);
213 complexAssignment?.read = read; 213 complexAssignment?.read = read;
214 return read; 214 return read;
215 } 215 }
216 216
217 Expression _makeWrite(Expression value, bool voidContext, 217 Expression _makeWrite(Expression value, bool voidContext,
218 KernelComplexAssignment complexAssignment) { 218 ShadowComplexAssignment complexAssignment) {
219 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel); 219 helper.typePromoter.mutateVariable(variable, helper.functionNestingLevel);
220 var write = variable.isFinal || variable.isConst 220 var write = variable.isFinal || variable.isConst
221 ? makeInvalidWrite(value) 221 ? makeInvalidWrite(value)
222 : new VariableSet(variable, value) 222 : new VariableSet(variable, value)
223 ..fileOffset = offsetForToken(token); 223 ..fileOffset = offsetForToken(token);
224 complexAssignment?.write = write; 224 complexAssignment?.write = write;
225 return write; 225 return write;
226 } 226 }
227 } 227 }
228 228
(...skipping 11 matching lines...) Expand all
240 } else { 240 } else {
241 return new PropertyAccessor.internal( 241 return new PropertyAccessor.internal(
242 helper, receiver, name, getter, setter, token); 242 helper, receiver, name, getter, setter, token);
243 } 243 }
244 } 244 }
245 245
246 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name, 246 PropertyAccessor.internal(BuilderHelper helper, this.receiver, this.name,
247 this.getter, this.setter, Token token) 247 this.getter, this.setter, Token token)
248 : super(helper, token); 248 : super(helper, token);
249 249
250 Expression _makeSimpleRead() => new KernelPropertyGet(receiver, name, getter) 250 Expression _makeSimpleRead() => new ShadowPropertyGet(receiver, name, getter)
251 ..fileOffset = offsetForToken(token); 251 ..fileOffset = offsetForToken(token);
252 252
253 Expression _makeSimpleWrite(Expression value, bool voidContext, 253 Expression _makeSimpleWrite(Expression value, bool voidContext,
254 KernelComplexAssignment complexAssignment) { 254 ShadowComplexAssignment complexAssignment) {
255 var write = new PropertySet(receiver, name, value, setter) 255 var write = new PropertySet(receiver, name, value, setter)
256 ..fileOffset = offsetForToken(token); 256 ..fileOffset = offsetForToken(token);
257 complexAssignment?.write = write; 257 complexAssignment?.write = write;
258 return write; 258 return write;
259 } 259 }
260 260
261 receiverAccess() { 261 receiverAccess() {
262 _receiverVariable ??= new VariableDeclaration.forValue(receiver); 262 _receiverVariable ??= new VariableDeclaration.forValue(receiver);
263 return new VariableGet(_receiverVariable) 263 return new VariableGet(_receiverVariable)
264 ..fileOffset = offsetForToken(token); 264 ..fileOffset = offsetForToken(token);
265 } 265 }
266 266
267 Expression _makeRead(KernelComplexAssignment complexAssignment) { 267 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
268 var read = new KernelPropertyGet(receiverAccess(), name, getter) 268 var read = new ShadowPropertyGet(receiverAccess(), name, getter)
269 ..fileOffset = offsetForToken(token); 269 ..fileOffset = offsetForToken(token);
270 complexAssignment?.read = read; 270 complexAssignment?.read = read;
271 return read; 271 return read;
272 } 272 }
273 273
274 Expression _makeWrite(Expression value, bool voidContext, 274 Expression _makeWrite(Expression value, bool voidContext,
275 KernelComplexAssignment complexAssignment) { 275 ShadowComplexAssignment complexAssignment) {
276 var write = new PropertySet(receiverAccess(), name, value, setter) 276 var write = new PropertySet(receiverAccess(), name, value, setter)
277 ..fileOffset = offsetForToken(token); 277 ..fileOffset = offsetForToken(token);
278 complexAssignment?.write = write; 278 complexAssignment?.write = write;
279 return write; 279 return write;
280 } 280 }
281 281
282 Expression _finish( 282 Expression _finish(
283 Expression body, KernelComplexAssignment complexAssignment) { 283 Expression body, ShadowComplexAssignment complexAssignment) {
284 return super._finish(makeLet(_receiverVariable, body), complexAssignment); 284 return super._finish(makeLet(_receiverVariable, body), complexAssignment);
285 } 285 }
286 } 286 }
287 287
288 /// Special case of [PropertyAccessor] to avoid creating an indirect access to 288 /// Special case of [PropertyAccessor] to avoid creating an indirect access to
289 /// 'this'. 289 /// 'this'.
290 class ThisPropertyAccessor extends Accessor { 290 class ThisPropertyAccessor extends Accessor {
291 Name name; 291 Name name;
292 Member getter, setter; 292 Member getter, setter;
293 293
294 ThisPropertyAccessor( 294 ThisPropertyAccessor(
295 BuilderHelper helper, this.name, this.getter, this.setter, Token token) 295 BuilderHelper helper, this.name, this.getter, this.setter, Token token)
296 : super(helper, token); 296 : super(helper, token);
297 297
298 Expression _makeRead(KernelComplexAssignment complexAssignment) { 298 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
299 var read = new KernelPropertyGet(new KernelThisExpression(), name, getter) 299 var read = new ShadowPropertyGet(new ShadowThisExpression(), name, getter)
300 ..fileOffset = offsetForToken(token); 300 ..fileOffset = offsetForToken(token);
301 complexAssignment?.read = read; 301 complexAssignment?.read = read;
302 return read; 302 return read;
303 } 303 }
304 304
305 Expression _makeWrite(Expression value, bool voidContext, 305 Expression _makeWrite(Expression value, bool voidContext,
306 KernelComplexAssignment complexAssignment) { 306 ShadowComplexAssignment complexAssignment) {
307 var write = new PropertySet(new KernelThisExpression(), name, value, setter) 307 var write = new PropertySet(new ShadowThisExpression(), name, value, setter)
308 ..fileOffset = offsetForToken(token); 308 ..fileOffset = offsetForToken(token);
309 complexAssignment?.write = write; 309 complexAssignment?.write = write;
310 return write; 310 return write;
311 } 311 }
312 } 312 }
313 313
314 class NullAwarePropertyAccessor extends Accessor { 314 class NullAwarePropertyAccessor extends Accessor {
315 VariableDeclaration receiver; 315 VariableDeclaration receiver;
316 Expression receiverExpression; 316 Expression receiverExpression;
317 Name name; 317 Name name;
318 Member getter, setter; 318 Member getter, setter;
319 DartType type; 319 DartType type;
320 320
321 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression, 321 NullAwarePropertyAccessor(BuilderHelper helper, this.receiverExpression,
322 this.name, this.getter, this.setter, this.type, Token token) 322 this.name, this.getter, this.setter, this.type, Token token)
323 : this.receiver = makeOrReuseVariable(receiverExpression), 323 : this.receiver = makeOrReuseVariable(receiverExpression),
324 super(helper, token); 324 super(helper, token);
325 325
326 receiverAccess() => new VariableGet(receiver); 326 receiverAccess() => new VariableGet(receiver);
327 327
328 Expression _makeRead(KernelComplexAssignment complexAssignment) { 328 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
329 var read = new KernelPropertyGet(receiverAccess(), name, getter) 329 var read = new ShadowPropertyGet(receiverAccess(), name, getter)
330 ..fileOffset = offsetForToken(token); 330 ..fileOffset = offsetForToken(token);
331 complexAssignment?.read = read; 331 complexAssignment?.read = read;
332 return read; 332 return read;
333 } 333 }
334 334
335 Expression _makeWrite(Expression value, bool voidContext, 335 Expression _makeWrite(Expression value, bool voidContext,
336 KernelComplexAssignment complexAssignment) { 336 ShadowComplexAssignment complexAssignment) {
337 var write = new PropertySet(receiverAccess(), name, value, setter) 337 var write = new PropertySet(receiverAccess(), name, value, setter)
338 ..fileOffset = offsetForToken(token); 338 ..fileOffset = offsetForToken(token);
339 complexAssignment?.write = write; 339 complexAssignment?.write = write;
340 return write; 340 return write;
341 } 341 }
342 342
343 Expression _finish( 343 Expression _finish(
344 Expression body, KernelComplexAssignment complexAssignment) { 344 Expression body, ShadowComplexAssignment complexAssignment) {
345 var offset = offsetForToken(token); 345 var offset = offsetForToken(token);
346 var nullAwareGuard = new ConditionalExpression( 346 var nullAwareGuard = new ConditionalExpression(
347 buildIsNull(receiverAccess(), offset), new NullLiteral(), body, null) 347 buildIsNull(receiverAccess(), offset), new NullLiteral(), body, null)
348 ..fileOffset = offset; 348 ..fileOffset = offset;
349 if (complexAssignment != null) { 349 if (complexAssignment != null) {
350 body = makeLet(receiver, nullAwareGuard); 350 body = makeLet(receiver, nullAwareGuard);
351 KernelPropertyAssign kernelPropertyAssign = complexAssignment; 351 ShadowPropertyAssign kernelPropertyAssign = complexAssignment;
352 kernelPropertyAssign.nullAwareGuard = nullAwareGuard; 352 kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
353 kernelPropertyAssign.desugared = body; 353 kernelPropertyAssign.desugared = body;
354 return kernelPropertyAssign; 354 return kernelPropertyAssign;
355 } else { 355 } else {
356 return new KernelNullAwarePropertyGet(receiver, nullAwareGuard) 356 return new ShadowNullAwarePropertyGet(receiver, nullAwareGuard)
357 ..fileOffset = offset; 357 ..fileOffset = offset;
358 } 358 }
359 } 359 }
360 } 360 }
361 361
362 class SuperPropertyAccessor extends Accessor { 362 class SuperPropertyAccessor extends Accessor {
363 Name name; 363 Name name;
364 Member getter, setter; 364 Member getter, setter;
365 365
366 SuperPropertyAccessor( 366 SuperPropertyAccessor(
367 BuilderHelper helper, this.name, this.getter, this.setter, Token token) 367 BuilderHelper helper, this.name, this.getter, this.setter, Token token)
368 : super(helper, token); 368 : super(helper, token);
369 369
370 Expression _makeRead(KernelComplexAssignment complexAssignment) { 370 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
371 if (getter == null) { 371 if (getter == null) {
372 helper.warnUnresolvedSuperGet(name, offsetForToken(token)); 372 helper.warnUnresolvedSuperGet(name, offsetForToken(token));
373 } 373 }
374 // TODO(ahe): Use [DirectPropertyGet] when possible. 374 // TODO(ahe): Use [DirectPropertyGet] when possible.
375 var read = new KernelSuperPropertyGet(name, getter) 375 var read = new ShadowSuperPropertyGet(name, getter)
376 ..fileOffset = offsetForToken(token); 376 ..fileOffset = offsetForToken(token);
377 complexAssignment?.read = read; 377 complexAssignment?.read = read;
378 return read; 378 return read;
379 } 379 }
380 380
381 Expression _makeWrite(Expression value, bool voidContext, 381 Expression _makeWrite(Expression value, bool voidContext,
382 KernelComplexAssignment complexAssignment) { 382 ShadowComplexAssignment complexAssignment) {
383 if (setter == null) { 383 if (setter == null) {
384 helper.warnUnresolvedSuperSet(name, offsetForToken(token)); 384 helper.warnUnresolvedSuperSet(name, offsetForToken(token));
385 } 385 }
386 // TODO(ahe): Use [DirectPropertySet] when possible. 386 // TODO(ahe): Use [DirectPropertySet] when possible.
387 var write = new SuperPropertySet(name, value, setter) 387 var write = new SuperPropertySet(name, value, setter)
388 ..fileOffset = offsetForToken(token); 388 ..fileOffset = offsetForToken(token);
389 complexAssignment?.write = write; 389 complexAssignment?.write = write;
390 return write; 390 return write;
391 } 391 }
392 } 392 }
(...skipping 14 matching lines...) Expand all
407 return new IndexAccessor.internal( 407 return new IndexAccessor.internal(
408 helper, receiver, index, getter, setter, token); 408 helper, receiver, index, getter, setter, token);
409 } 409 }
410 } 410 }
411 411
412 IndexAccessor.internal(BuilderHelper helper, this.receiver, this.index, 412 IndexAccessor.internal(BuilderHelper helper, this.receiver, this.index,
413 this.getter, this.setter, Token token) 413 this.getter, this.setter, Token token)
414 : super(helper, token); 414 : super(helper, token);
415 415
416 Expression _makeSimpleRead() { 416 Expression _makeSimpleRead() {
417 var read = new KernelMethodInvocation( 417 var read = new ShadowMethodInvocation(
418 receiver, indexGetName, new KernelArguments(<Expression>[index]), 418 receiver, indexGetName, new ShadowArguments(<Expression>[index]),
419 interfaceTarget: getter) 419 interfaceTarget: getter)
420 ..fileOffset = offsetForToken(token); 420 ..fileOffset = offsetForToken(token);
421 return read; 421 return read;
422 } 422 }
423 423
424 Expression _makeSimpleWrite(Expression value, bool voidContext, 424 Expression _makeSimpleWrite(Expression value, bool voidContext,
425 KernelComplexAssignment complexAssignment) { 425 ShadowComplexAssignment complexAssignment) {
426 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 426 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
427 var write = new KernelMethodInvocation( 427 var write = new ShadowMethodInvocation(
428 receiver, indexSetName, new KernelArguments(<Expression>[index, value]), 428 receiver, indexSetName, new ShadowArguments(<Expression>[index, value]),
429 interfaceTarget: setter) 429 interfaceTarget: setter)
430 ..fileOffset = offsetForToken(token); 430 ..fileOffset = offsetForToken(token);
431 complexAssignment?.write = write; 431 complexAssignment?.write = write;
432 return write; 432 return write;
433 } 433 }
434 434
435 receiverAccess() { 435 receiverAccess() {
436 // We cannot reuse the receiver if it is a variable since it might be 436 // We cannot reuse the receiver if it is a variable since it might be
437 // reassigned in the index expression. 437 // reassigned in the index expression.
438 receiverVariable ??= new VariableDeclaration.forValue(receiver); 438 receiverVariable ??= new VariableDeclaration.forValue(receiver);
439 return new VariableGet(receiverVariable) 439 return new VariableGet(receiverVariable)
440 ..fileOffset = offsetForToken(token); 440 ..fileOffset = offsetForToken(token);
441 } 441 }
442 442
443 indexAccess() { 443 indexAccess() {
444 indexVariable ??= new VariableDeclaration.forValue(index); 444 indexVariable ??= new VariableDeclaration.forValue(index);
445 return new VariableGet(indexVariable)..fileOffset = offsetForToken(token); 445 return new VariableGet(indexVariable)..fileOffset = offsetForToken(token);
446 } 446 }
447 447
448 Expression _makeRead(KernelComplexAssignment complexAssignment) { 448 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
449 var read = new KernelMethodInvocation(receiverAccess(), indexGetName, 449 var read = new ShadowMethodInvocation(receiverAccess(), indexGetName,
450 new KernelArguments(<Expression>[indexAccess()]), 450 new ShadowArguments(<Expression>[indexAccess()]),
451 interfaceTarget: getter) 451 interfaceTarget: getter)
452 ..fileOffset = offsetForToken(token); 452 ..fileOffset = offsetForToken(token);
453 complexAssignment?.read = read; 453 complexAssignment?.read = read;
454 return read; 454 return read;
455 } 455 }
456 456
457 Expression _makeWrite(Expression value, bool voidContext, 457 Expression _makeWrite(Expression value, bool voidContext,
458 KernelComplexAssignment complexAssignment) { 458 ShadowComplexAssignment complexAssignment) {
459 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 459 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
460 var write = new KernelMethodInvocation(receiverAccess(), indexSetName, 460 var write = new ShadowMethodInvocation(receiverAccess(), indexSetName,
461 new KernelArguments(<Expression>[indexAccess(), value]), 461 new ShadowArguments(<Expression>[indexAccess(), value]),
462 interfaceTarget: setter) 462 interfaceTarget: setter)
463 ..fileOffset = offsetForToken(token); 463 ..fileOffset = offsetForToken(token);
464 complexAssignment?.write = write; 464 complexAssignment?.write = write;
465 return write; 465 return write;
466 } 466 }
467 467
468 // TODO(dmitryas): remove this method after the "[]=" operator of the Context 468 // TODO(dmitryas): remove this method after the "[]=" operator of the Context
469 // class is made to return a value. 469 // class is made to return a value.
470 _makeWriteAndReturn( 470 _makeWriteAndReturn(
471 Expression value, KernelComplexAssignment complexAssignment) { 471 Expression value, ShadowComplexAssignment complexAssignment) {
472 // The call to []= does not return the value like direct-style assignments 472 // The call to []= does not return the value like direct-style assignments
473 // do. We need to bind the value in a let. 473 // do. We need to bind the value in a let.
474 var valueVariable = new VariableDeclaration.forValue(value); 474 var valueVariable = new VariableDeclaration.forValue(value);
475 var write = new KernelMethodInvocation( 475 var write = new ShadowMethodInvocation(
476 receiverAccess(), 476 receiverAccess(),
477 indexSetName, 477 indexSetName,
478 new KernelArguments( 478 new ShadowArguments(
479 <Expression>[indexAccess(), new VariableGet(valueVariable)]), 479 <Expression>[indexAccess(), new VariableGet(valueVariable)]),
480 interfaceTarget: setter) 480 interfaceTarget: setter)
481 ..fileOffset = offsetForToken(token); 481 ..fileOffset = offsetForToken(token);
482 complexAssignment?.write = write; 482 complexAssignment?.write = write;
483 var dummy = new KernelVariableDeclaration.forValue( 483 var dummy = new ShadowVariableDeclaration.forValue(
484 write, helper.functionNestingLevel); 484 write, helper.functionNestingLevel);
485 return makeLet( 485 return makeLet(
486 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); 486 valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
487 } 487 }
488 488
489 Expression _finish( 489 Expression _finish(
490 Expression body, KernelComplexAssignment complexAssignment) { 490 Expression body, ShadowComplexAssignment complexAssignment) {
491 return super._finish( 491 return super._finish(
492 makeLet(receiverVariable, makeLet(indexVariable, body)), 492 makeLet(receiverVariable, makeLet(indexVariable, body)),
493 complexAssignment); 493 complexAssignment);
494 } 494 }
495 } 495 }
496 496
497 /// Special case of [IndexAccessor] to avoid creating an indirect access to 497 /// Special case of [IndexAccessor] to avoid creating an indirect access to
498 /// 'this'. 498 /// 'this'.
499 class ThisIndexAccessor extends Accessor { 499 class ThisIndexAccessor extends Accessor {
500 Expression index; 500 Expression index;
501 VariableDeclaration indexVariable; 501 VariableDeclaration indexVariable;
502 Procedure getter, setter; 502 Procedure getter, setter;
503 503
504 ThisIndexAccessor( 504 ThisIndexAccessor(
505 BuilderHelper helper, this.index, this.getter, this.setter, Token token) 505 BuilderHelper helper, this.index, this.getter, this.setter, Token token)
506 : super(helper, token); 506 : super(helper, token);
507 507
508 Expression _makeSimpleRead() { 508 Expression _makeSimpleRead() {
509 return new KernelMethodInvocation(new KernelThisExpression(), indexGetName, 509 return new ShadowMethodInvocation(new ShadowThisExpression(), indexGetName,
510 new KernelArguments(<Expression>[index]), 510 new ShadowArguments(<Expression>[index]),
511 interfaceTarget: getter); 511 interfaceTarget: getter);
512 } 512 }
513 513
514 Expression _makeSimpleWrite(Expression value, bool voidContext, 514 Expression _makeSimpleWrite(Expression value, bool voidContext,
515 KernelComplexAssignment complexAssignment) { 515 ShadowComplexAssignment complexAssignment) {
516 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 516 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
517 var write = new KernelMethodInvocation(new KernelThisExpression(), 517 var write = new ShadowMethodInvocation(new ShadowThisExpression(),
518 indexSetName, new KernelArguments(<Expression>[index, value]), 518 indexSetName, new ShadowArguments(<Expression>[index, value]),
519 interfaceTarget: setter) 519 interfaceTarget: setter)
520 ..fileOffset = offsetForToken(token); 520 ..fileOffset = offsetForToken(token);
521 complexAssignment?.write = write; 521 complexAssignment?.write = write;
522 return write; 522 return write;
523 } 523 }
524 524
525 indexAccess() { 525 indexAccess() {
526 indexVariable ??= new VariableDeclaration.forValue(index); 526 indexVariable ??= new VariableDeclaration.forValue(index);
527 return new VariableGet(indexVariable); 527 return new VariableGet(indexVariable);
528 } 528 }
529 529
530 Expression _makeRead(KernelComplexAssignment complexAssignment) { 530 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
531 var read = new KernelMethodInvocation(new KernelThisExpression(), 531 var read = new ShadowMethodInvocation(new ShadowThisExpression(),
532 indexGetName, new KernelArguments(<Expression>[indexAccess()]), 532 indexGetName, new ShadowArguments(<Expression>[indexAccess()]),
533 interfaceTarget: getter) 533 interfaceTarget: getter)
534 ..fileOffset = offsetForToken(token); 534 ..fileOffset = offsetForToken(token);
535 complexAssignment?.read = read; 535 complexAssignment?.read = read;
536 return read; 536 return read;
537 } 537 }
538 538
539 Expression _makeWrite(Expression value, bool voidContext, 539 Expression _makeWrite(Expression value, bool voidContext,
540 KernelComplexAssignment complexAssignment) { 540 ShadowComplexAssignment complexAssignment) {
541 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 541 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
542 var write = new KernelMethodInvocation(new KernelThisExpression(), 542 var write = new ShadowMethodInvocation(new ShadowThisExpression(),
543 indexSetName, new KernelArguments(<Expression>[indexAccess(), value]), 543 indexSetName, new ShadowArguments(<Expression>[indexAccess(), value]),
544 interfaceTarget: setter) 544 interfaceTarget: setter)
545 ..fileOffset = offsetForToken(token); 545 ..fileOffset = offsetForToken(token);
546 complexAssignment?.write = write; 546 complexAssignment?.write = write;
547 return write; 547 return write;
548 } 548 }
549 549
550 _makeWriteAndReturn( 550 _makeWriteAndReturn(
551 Expression value, KernelComplexAssignment complexAssignment) { 551 Expression value, ShadowComplexAssignment complexAssignment) {
552 var valueVariable = new VariableDeclaration.forValue(value); 552 var valueVariable = new VariableDeclaration.forValue(value);
553 var write = new KernelMethodInvocation( 553 var write = new ShadowMethodInvocation(
554 new KernelThisExpression(), 554 new ShadowThisExpression(),
555 indexSetName, 555 indexSetName,
556 new KernelArguments( 556 new ShadowArguments(
557 <Expression>[indexAccess(), new VariableGet(valueVariable)]), 557 <Expression>[indexAccess(), new VariableGet(valueVariable)]),
558 interfaceTarget: setter) 558 interfaceTarget: setter)
559 ..fileOffset = offsetForToken(token); 559 ..fileOffset = offsetForToken(token);
560 complexAssignment?.write = write; 560 complexAssignment?.write = write;
561 var dummy = new VariableDeclaration.forValue(write); 561 var dummy = new VariableDeclaration.forValue(write);
562 return makeLet( 562 return makeLet(
563 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); 563 valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
564 } 564 }
565 565
566 Expression _finish( 566 Expression _finish(
567 Expression body, KernelComplexAssignment complexAssignment) { 567 Expression body, ShadowComplexAssignment complexAssignment) {
568 return super._finish(makeLet(indexVariable, body), complexAssignment); 568 return super._finish(makeLet(indexVariable, body), complexAssignment);
569 } 569 }
570 } 570 }
571 571
572 class SuperIndexAccessor extends Accessor { 572 class SuperIndexAccessor extends Accessor {
573 Expression index; 573 Expression index;
574 VariableDeclaration indexVariable; 574 VariableDeclaration indexVariable;
575 Member getter, setter; 575 Member getter, setter;
576 576
577 SuperIndexAccessor( 577 SuperIndexAccessor(
578 BuilderHelper helper, this.index, this.getter, this.setter, Token token) 578 BuilderHelper helper, this.index, this.getter, this.setter, Token token)
579 : super(helper, token); 579 : super(helper, token);
580 580
581 indexAccess() { 581 indexAccess() {
582 indexVariable ??= new VariableDeclaration.forValue(index); 582 indexVariable ??= new VariableDeclaration.forValue(index);
583 return new VariableGet(indexVariable); 583 return new VariableGet(indexVariable);
584 } 584 }
585 585
586 Expression _makeSimpleRead() { 586 Expression _makeSimpleRead() {
587 if (getter == null) { 587 if (getter == null) {
588 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); 588 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token));
589 } 589 }
590 // TODO(ahe): Use [DirectMethodInvocation] when possible. 590 // TODO(ahe): Use [DirectMethodInvocation] when possible.
591 return new KernelSuperMethodInvocation( 591 return new ShadowSuperMethodInvocation(
592 indexGetName, new KernelArguments(<Expression>[index]), getter) 592 indexGetName, new ShadowArguments(<Expression>[index]), getter)
593 ..fileOffset = offsetForToken(token); 593 ..fileOffset = offsetForToken(token);
594 } 594 }
595 595
596 Expression _makeSimpleWrite(Expression value, bool voidContext, 596 Expression _makeSimpleWrite(Expression value, bool voidContext,
597 KernelComplexAssignment complexAssignment) { 597 ShadowComplexAssignment complexAssignment) {
598 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 598 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
599 if (setter == null) { 599 if (setter == null) {
600 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); 600 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token));
601 } 601 }
602 var write = new SuperMethodInvocation( 602 var write = new SuperMethodInvocation(
603 indexSetName, new KernelArguments(<Expression>[index, value]), setter) 603 indexSetName, new ShadowArguments(<Expression>[index, value]), setter)
604 ..fileOffset = offsetForToken(token); 604 ..fileOffset = offsetForToken(token);
605 complexAssignment?.write = write; 605 complexAssignment?.write = write;
606 return write; 606 return write;
607 } 607 }
608 608
609 Expression _makeRead(KernelComplexAssignment complexAssignment) { 609 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
610 if (getter == null) { 610 if (getter == null) {
611 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token)); 611 helper.warnUnresolvedSuperMethod(indexGetName, offsetForToken(token));
612 } 612 }
613 var read = new SuperMethodInvocation( 613 var read = new SuperMethodInvocation(
614 indexGetName, new KernelArguments(<Expression>[indexAccess()]), getter) 614 indexGetName, new ShadowArguments(<Expression>[indexAccess()]), getter)
615 ..fileOffset = offsetForToken(token); 615 ..fileOffset = offsetForToken(token);
616 complexAssignment?.read = read; 616 complexAssignment?.read = read;
617 return read; 617 return read;
618 } 618 }
619 619
620 Expression _makeWrite(Expression value, bool voidContext, 620 Expression _makeWrite(Expression value, bool voidContext,
621 KernelComplexAssignment complexAssignment) { 621 ShadowComplexAssignment complexAssignment) {
622 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment); 622 if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
623 if (setter == null) { 623 if (setter == null) {
624 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); 624 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token));
625 } 625 }
626 var write = new SuperMethodInvocation(indexSetName, 626 var write = new SuperMethodInvocation(indexSetName,
627 new KernelArguments(<Expression>[indexAccess(), value]), setter) 627 new ShadowArguments(<Expression>[indexAccess(), value]), setter)
628 ..fileOffset = offsetForToken(token); 628 ..fileOffset = offsetForToken(token);
629 complexAssignment?.write = write; 629 complexAssignment?.write = write;
630 return write; 630 return write;
631 } 631 }
632 632
633 _makeWriteAndReturn( 633 _makeWriteAndReturn(
634 Expression value, KernelComplexAssignment complexAssignment) { 634 Expression value, ShadowComplexAssignment complexAssignment) {
635 var valueVariable = new VariableDeclaration.forValue(value); 635 var valueVariable = new VariableDeclaration.forValue(value);
636 if (setter == null) { 636 if (setter == null) {
637 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token)); 637 helper.warnUnresolvedSuperMethod(indexSetName, offsetForToken(token));
638 } 638 }
639 var write = new SuperMethodInvocation( 639 var write = new SuperMethodInvocation(
640 indexSetName, 640 indexSetName,
641 new KernelArguments( 641 new ShadowArguments(
642 <Expression>[indexAccess(), new VariableGet(valueVariable)]), 642 <Expression>[indexAccess(), new VariableGet(valueVariable)]),
643 setter) 643 setter)
644 ..fileOffset = offsetForToken(token); 644 ..fileOffset = offsetForToken(token);
645 complexAssignment?.write = write; 645 complexAssignment?.write = write;
646 var dummy = new VariableDeclaration.forValue(write); 646 var dummy = new VariableDeclaration.forValue(write);
647 return makeLet( 647 return makeLet(
648 valueVariable, makeLet(dummy, new VariableGet(valueVariable))); 648 valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
649 } 649 }
650 650
651 Expression _finish( 651 Expression _finish(
652 Expression body, KernelComplexAssignment complexAssignment) { 652 Expression body, ShadowComplexAssignment complexAssignment) {
653 return super._finish(makeLet(indexVariable, body), complexAssignment); 653 return super._finish(makeLet(indexVariable, body), complexAssignment);
654 } 654 }
655 } 655 }
656 656
657 class StaticAccessor extends Accessor { 657 class StaticAccessor extends Accessor {
658 Member readTarget; 658 Member readTarget;
659 Member writeTarget; 659 Member writeTarget;
660 660
661 StaticAccessor( 661 StaticAccessor(
662 BuilderHelper helper, this.readTarget, this.writeTarget, Token token) 662 BuilderHelper helper, this.readTarget, this.writeTarget, Token token)
663 : super(helper, token); 663 : super(helper, token);
664 664
665 Expression _makeRead(KernelComplexAssignment complexAssignment) { 665 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
666 if (readTarget == null) { 666 if (readTarget == null) {
667 return makeInvalidRead(); 667 return makeInvalidRead();
668 } else { 668 } else {
669 var read = helper.makeStaticGet(readTarget, token); 669 var read = helper.makeStaticGet(readTarget, token);
670 complexAssignment?.read = read; 670 complexAssignment?.read = read;
671 return read; 671 return read;
672 } 672 }
673 } 673 }
674 674
675 Expression _makeWrite(Expression value, bool voidContext, 675 Expression _makeWrite(Expression value, bool voidContext,
676 KernelComplexAssignment complexAssignment) { 676 ShadowComplexAssignment complexAssignment) {
677 Expression write; 677 Expression write;
678 if (writeTarget == null) { 678 if (writeTarget == null) {
679 write = makeInvalidWrite(value); 679 write = makeInvalidWrite(value);
680 } else { 680 } else {
681 write = new StaticSet(writeTarget, value); 681 write = new StaticSet(writeTarget, value);
682 complexAssignment?.write = write; 682 complexAssignment?.write = write;
683 } 683 }
684 write.fileOffset = offsetForToken(token); 684 write.fileOffset = offsetForToken(token);
685 return write; 685 return write;
686 } 686 }
687 } 687 }
688 688
689 class ReadOnlyAccessor extends Accessor { 689 class ReadOnlyAccessor extends Accessor {
690 Expression expression; 690 Expression expression;
691 VariableDeclaration value; 691 VariableDeclaration value;
692 692
693 ReadOnlyAccessor(BuilderHelper helper, this.expression, Token token) 693 ReadOnlyAccessor(BuilderHelper helper, this.expression, Token token)
694 : super(helper, token); 694 : super(helper, token);
695 695
696 Expression _makeSimpleRead() => expression; 696 Expression _makeSimpleRead() => expression;
697 697
698 Expression _makeRead(KernelComplexAssignment complexAssignment) { 698 Expression _makeRead(ShadowComplexAssignment complexAssignment) {
699 value ??= new VariableDeclaration.forValue(expression); 699 value ??= new VariableDeclaration.forValue(expression);
700 return new VariableGet(value); 700 return new VariableGet(value);
701 } 701 }
702 702
703 Expression _makeWrite(Expression value, bool voidContext, 703 Expression _makeWrite(Expression value, bool voidContext,
704 KernelComplexAssignment complexAssignment) => 704 ShadowComplexAssignment complexAssignment) =>
705 makeInvalidWrite(value); 705 makeInvalidWrite(value);
706 706
707 Expression _finish( 707 Expression _finish(
708 Expression body, KernelComplexAssignment complexAssignment) => 708 Expression body, ShadowComplexAssignment complexAssignment) =>
709 super._finish(makeLet(value, body), complexAssignment); 709 super._finish(makeLet(value, body), complexAssignment);
710 } 710 }
711 711
712 Expression makeLet(VariableDeclaration variable, Expression body) { 712 Expression makeLet(VariableDeclaration variable, Expression body) {
713 if (variable == null) return body; 713 if (variable == null) return body;
714 return new Let(variable, body); 714 return new Let(variable, body);
715 } 715 }
716 716
717 Expression makeBinary( 717 Expression makeBinary(
718 Expression left, Name operator, Procedure interfaceTarget, Expression right, 718 Expression left, Name operator, Procedure interfaceTarget, Expression right,
719 {int offset: TreeNode.noOffset}) { 719 {int offset: TreeNode.noOffset}) {
720 return new KernelMethodInvocation( 720 return new ShadowMethodInvocation(
721 left, operator, new KernelArguments(<Expression>[right]), 721 left, operator, new ShadowArguments(<Expression>[right]),
722 interfaceTarget: interfaceTarget) 722 interfaceTarget: interfaceTarget)
723 ..fileOffset = offset; 723 ..fileOffset = offset;
724 } 724 }
725 725
726 Expression buildIsNull(Expression value, int offset) { 726 Expression buildIsNull(Expression value, int offset) {
727 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset); 727 return makeBinary(value, equalsName, null, new NullLiteral(), offset: offset);
728 } 728 }
729 729
730 VariableDeclaration makeOrReuseVariable(Expression value) { 730 VariableDeclaration makeOrReuseVariable(Expression value) {
731 // TODO: Devise a way to remember if a variable declaration was reused 731 // TODO: Devise a way to remember if a variable declaration was reused
732 // or is fresh (hence needs a let binding). 732 // or is fresh (hence needs a let binding).
733 return new VariableDeclaration.forValue(value); 733 return new VariableDeclaration.forValue(value);
734 } 734 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/kernel/fasta_accessors.dart ('k') | pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698