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

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

Issue 2841863002: Change accessors and AstFactory to use tokens rather than file offsets. (Closed)
Patch Set: Created 3 years, 8 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 library fasta.fasta_accessors; 5 library fasta.fasta_accessors;
6 6
7 export 'frontend_accessors.dart' show wrapInvalid; 7 export 'frontend_accessors.dart' show wrapInvalid;
8 8
9 import 'package:front_end/src/fasta/scanner/token.dart'
10 show Token, offsetForToken;
11
9 import 'frontend_accessors.dart' show Accessor, buildIsNull, makeLet; 12 import 'frontend_accessors.dart' show Accessor, buildIsNull, makeLet;
10 13
11 import 'package:kernel/ast.dart'; 14 import 'package:kernel/ast.dart';
12 15
13 import '../errors.dart' show internalError; 16 import '../errors.dart' show internalError;
14 17
15 import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope; 18 import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope;
16 19
17 import 'frontend_accessors.dart' as kernel 20 import 'frontend_accessors.dart' as kernel
18 show 21 show
(...skipping 17 matching lines...) Expand all
36 Uri get uri; 39 Uri get uri;
37 40
38 Constructor lookupConstructor(Name name, {bool isSuper}); 41 Constructor lookupConstructor(Name name, {bool isSuper});
39 42
40 Expression toSuperMethodInvocation(MethodInvocation node); 43 Expression toSuperMethodInvocation(MethodInvocation node);
41 44
42 Expression toValue(node); 45 Expression toValue(node);
43 46
44 Member lookupSuperMember(Name name, {bool isSetter: false}); 47 Member lookupSuperMember(Name name, {bool isSetter: false});
45 48
46 scopeLookup(Scope scope, String name, int offset, 49 scopeLookup(Scope scope, String name, Token token,
47 {bool isQualified: false, PrefixBuilder prefix}); 50 {bool isQualified: false, PrefixBuilder prefix});
48 51
49 finishSend(Object receiver, Arguments arguments, int offset); 52 finishSend(Object receiver, Arguments arguments, int offset);
50 53
51 Expression buildCompileTimeError(error, [int offset]); 54 Expression buildCompileTimeError(error, [int offset]);
52 55
53 Initializer buildInvalidIntializer(Expression expression, [int offset]); 56 Initializer buildInvalidIntializer(Expression expression, [int offset]);
54 57
55 Initializer buildSuperInitializer( 58 Initializer buildSuperInitializer(
56 Constructor constructor, Arguments arguments, 59 Constructor constructor, Arguments arguments,
57 [int offset]); 60 [int offset]);
58 61
59 Initializer buildRedirectingInitializer( 62 Initializer buildRedirectingInitializer(
60 Constructor constructor, Arguments arguments, 63 Constructor constructor, Arguments arguments,
61 [int charOffset = -1]); 64 [int charOffset = -1]);
62 65
63 Expression buildStaticInvocation(Procedure target, Arguments arguments); 66 Expression buildStaticInvocation(Procedure target, Arguments arguments);
64 67
65 Expression buildProblemExpression(ProblemBuilder builder, int offset); 68 Expression buildProblemExpression(ProblemBuilder builder, int offset);
66 69
67 Expression throwNoSuchMethodError( 70 Expression throwNoSuchMethodError(
68 String name, Arguments arguments, int offset, 71 String name, Arguments arguments, int offset,
69 {bool isSuper: false, isGetter: false, isSetter: false}); 72 {bool isSuper: false, isGetter: false, isSetter: false});
70 73
71 bool checkArguments(FunctionNode function, Arguments arguments, 74 bool checkArguments(FunctionNode function, Arguments arguments,
72 List<TypeParameter> typeParameters); 75 List<TypeParameter> typeParameters);
73 76
74 StaticGet makeStaticGet(Member readTarget, int offset); 77 StaticGet makeStaticGet(Member readTarget, Token token);
75 } 78 }
76 79
77 abstract class FastaAccessor implements Accessor { 80 abstract class FastaAccessor implements Accessor {
78 BuilderHelper get helper; 81 BuilderHelper get helper;
79 82
80 String get plainNameForRead; 83 String get plainNameForRead;
81 84
82 Uri get uri => helper.uri; 85 Uri get uri => helper.uri;
83 86
84 String get plainNameForWrite => plainNameForRead; 87 String get plainNameForWrite => plainNameForRead;
85 88
86 bool get isInitializer => false; 89 bool get isInitializer => false;
87 90
88 Expression buildForEffect() => buildSimpleRead(); 91 Expression buildForEffect() => buildSimpleRead();
89 92
90 Initializer buildFieldInitializer( 93 Initializer buildFieldInitializer(
91 Map<String, FieldInitializer> initializers) { 94 Map<String, FieldInitializer> initializers) {
95 int offset = offsetForToken(token);
92 return helper.buildInvalidIntializer( 96 return helper.buildInvalidIntializer(
93 helper.buildCompileTimeError( 97 helper.buildCompileTimeError(
94 // TODO(ahe): This error message is really bad. 98 // TODO(ahe): This error message is really bad.
95 "Can't use $plainNameForRead here.", 99 "Can't use $plainNameForRead here.",
96 offset), 100 offset),
97 offset); 101 offset);
98 } 102 }
99 103
100 Expression makeInvalidRead() { 104 Expression makeInvalidRead() {
101 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true); 105 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true);
102 } 106 }
103 107
104 Expression makeInvalidWrite(Expression value) { 108 Expression makeInvalidWrite(Expression value) {
105 return buildThrowNoSuchMethodError(new Arguments(<Expression>[value]), 109 return buildThrowNoSuchMethodError(new Arguments(<Expression>[value]),
106 isSetter: true); 110 isSetter: true);
107 } 111 }
108 112
109 /* Expression | FastaAccessor | Initializer */ doInvocation( 113 /* Expression | FastaAccessor | Initializer */ doInvocation(
110 int offset, Arguments arguments); 114 int offset, Arguments arguments);
111 115
112 /* Expression | FastaAccessor */ buildPropertyAccess( 116 /* Expression | FastaAccessor */ buildPropertyAccess(
113 IncompleteSend send, bool isNullAware) { 117 IncompleteSend send, bool isNullAware) {
114 if (send is SendAccessor) { 118 if (send is SendAccessor) {
115 return buildMethodInvocation( 119 return buildMethodInvocation(buildSimpleRead(), send.name, send.arguments,
116 buildSimpleRead(), send.name, send.arguments, send.offset, 120 offsetForToken(send.token),
117 isNullAware: isNullAware); 121 isNullAware: isNullAware);
118 } else { 122 } else {
119 return PropertyAccessor.make(helper, send.offset, buildSimpleRead(), 123 return PropertyAccessor.make(helper, send.token, buildSimpleRead(),
120 send.name, null, null, isNullAware); 124 send.name, null, null, isNullAware);
121 } 125 }
122 } 126 }
123 127
124 /* Expression | FastaAccessor */ buildThrowNoSuchMethodError( 128 /* Expression | FastaAccessor */ buildThrowNoSuchMethodError(
125 Arguments arguments, 129 Arguments arguments,
126 {bool isSuper: false, 130 {bool isSuper: false,
127 bool isGetter: false, 131 bool isGetter: false,
128 bool isSetter: false, 132 bool isSetter: false,
129 String name, 133 String name,
130 int offset}) { 134 int offset}) {
131 return helper.throwNoSuchMethodError( 135 return helper.throwNoSuchMethodError(name ?? plainNameForWrite, arguments,
132 name ?? plainNameForWrite, arguments, offset ?? this.offset, 136 offset ?? offsetForToken(this.token),
133 isGetter: isGetter, isSetter: isSetter, isSuper: isSuper); 137 isGetter: isGetter, isSetter: isSetter, isSuper: isSuper);
134 } 138 }
135 139
136 bool get isThisPropertyAccessor => false; 140 bool get isThisPropertyAccessor => false;
137 } 141 }
138 142
139 abstract class ErrorAccessor implements FastaAccessor { 143 abstract class ErrorAccessor implements FastaAccessor {
140 @override 144 @override
141 Expression get builtBinary => internalError("Unsupported operation."); 145 Expression get builtBinary => internalError("Unsupported operation.");
142 146
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
238 242
239 @override 243 @override
240 Expression makeInvalidWrite(Expression value) { 244 Expression makeInvalidWrite(Expression value) {
241 return buildError(new Arguments(<Expression>[value]), isSetter: true); 245 return buildError(new Arguments(<Expression>[value]), isSetter: true);
242 } 246 }
243 } 247 }
244 248
245 class ThisAccessor extends FastaAccessor { 249 class ThisAccessor extends FastaAccessor {
246 final BuilderHelper helper; 250 final BuilderHelper helper;
247 251
248 final int offset; 252 final Token token;
249 253
250 final bool isInitializer; 254 final bool isInitializer;
251 255
252 final bool isSuper; 256 final bool isSuper;
253 257
254 ThisAccessor(this.helper, this.offset, this.isInitializer, 258 ThisAccessor(this.helper, this.token, this.isInitializer,
255 {this.isSuper: false}); 259 {this.isSuper: false});
256 260
257 @override 261 @override
258 Expression get builtBinary => internalError("Unsupported operation."); 262 Expression get builtBinary => internalError("Unsupported operation.");
259 263
260 @override 264 @override
261 void set builtBinary(Expression expression) { 265 void set builtBinary(Expression expression) {
262 internalError("Unsupported operation."); 266 internalError("Unsupported operation.");
263 } 267 }
264 268
265 @override 269 @override
266 Expression get builtGetter => internalError("Unsupported operation."); 270 Expression get builtGetter => internalError("Unsupported operation.");
267 271
268 @override 272 @override
269 void set builtGetter(Expression expression) { 273 void set builtGetter(Expression expression) {
270 internalError("Unsupported operation."); 274 internalError("Unsupported operation.");
271 } 275 }
272 276
273 String get plainNameForRead => internalError(isSuper ? "super" : "this"); 277 String get plainNameForRead => internalError(isSuper ? "super" : "this");
274 278
275 Expression buildSimpleRead() { 279 Expression buildSimpleRead() {
276 if (!isSuper) { 280 if (!isSuper) {
277 return new ThisExpression(); 281 return new ThisExpression();
278 } else { 282 } else {
279 return helper.buildCompileTimeError( 283 return helper.buildCompileTimeError(
280 "Can't use `super` as an expression.", offset); 284 "Can't use `super` as an expression.", offsetForToken(token));
281 } 285 }
282 } 286 }
283 287
284 Initializer buildFieldInitializer( 288 Initializer buildFieldInitializer(
285 Map<String, FieldInitializer> initializers) { 289 Map<String, FieldInitializer> initializers) {
286 String keyword = isSuper ? "super" : "this"; 290 String keyword = isSuper ? "super" : "this";
291 int offset = offsetForToken(token);
287 return helper.buildInvalidIntializer( 292 return helper.buildInvalidIntializer(
288 helper.buildCompileTimeError( 293 helper.buildCompileTimeError(
289 "Can't use '$keyword' here, did you mean '$keyword()'?", offset), 294 "Can't use '$keyword' here, did you mean '$keyword()'?", offset),
290 offset); 295 offset);
291 } 296 }
292 297
293 buildPropertyAccess(IncompleteSend send, bool isNullAware) { 298 buildPropertyAccess(IncompleteSend send, bool isNullAware) {
294 if (isInitializer && send is SendAccessor) { 299 if (isInitializer && send is SendAccessor) {
295 return buildConstructorInitializer( 300 return buildConstructorInitializer(
296 send.offset, send.name, send.arguments); 301 offsetForToken(send.token), send.name, send.arguments);
297 } 302 }
298 if (send is SendAccessor) { 303 if (send is SendAccessor) {
299 // Notice that 'this' or 'super' can't be null. So we can ignore the 304 // Notice that 'this' or 'super' can't be null. So we can ignore the
300 // value of [isNullAware]. 305 // value of [isNullAware].
301 MethodInvocation result = buildMethodInvocation( 306 MethodInvocation result = buildMethodInvocation(new ThisExpression(),
302 new ThisExpression(), send.name, send.arguments, offset); 307 send.name, send.arguments, offsetForToken(token));
303 return isSuper ? helper.toSuperMethodInvocation(result) : result; 308 return isSuper ? helper.toSuperMethodInvocation(result) : result;
304 } else { 309 } else {
305 if (isSuper) { 310 if (isSuper) {
306 Member getter = helper.lookupSuperMember(send.name); 311 Member getter = helper.lookupSuperMember(send.name);
307 Member setter = helper.lookupSuperMember(send.name, isSetter: true); 312 Member setter = helper.lookupSuperMember(send.name, isSetter: true);
308 return new SuperPropertyAccessor( 313 return new SuperPropertyAccessor(
309 helper, send.offset, send.name, getter, setter); 314 helper, send.token, send.name, getter, setter);
310 } else { 315 } else {
311 return new ThisPropertyAccessor( 316 return new ThisPropertyAccessor(
312 helper, send.offset, send.name, null, null); 317 helper, send.token, send.name, null, null);
313 } 318 }
314 } 319 }
315 } 320 }
316 321
317 doInvocation(int offset, Arguments arguments) { 322 doInvocation(int offset, Arguments arguments) {
318 if (isInitializer) { 323 if (isInitializer) {
319 return buildConstructorInitializer(offset, new Name(""), arguments); 324 return buildConstructorInitializer(offset, new Name(""), arguments);
320 } else { 325 } else {
321 return buildMethodInvocation( 326 return buildMethodInvocation(
322 new ThisExpression(), callName, arguments, offset); 327 new ThisExpression(), callName, arguments, offset);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 Expression buildPostfixIncrement(Name binaryOperator, 371 Expression buildPostfixIncrement(Name binaryOperator,
367 {int offset: TreeNode.noOffset, 372 {int offset: TreeNode.noOffset,
368 bool voidContext: false, 373 bool voidContext: false,
369 Procedure interfaceTarget}) { 374 Procedure interfaceTarget}) {
370 return buildAssignmentError(); 375 return buildAssignmentError();
371 } 376 }
372 377
373 Expression buildAssignmentError() { 378 Expression buildAssignmentError() {
374 String message = 379 String message =
375 isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'."; 380 isSuper ? "Can't assign to 'super'." : "Can't assign to 'this'.";
376 return helper.buildCompileTimeError(message, offset); 381 return helper.buildCompileTimeError(message, offsetForToken(token));
377 } 382 }
378 383
379 toString() => "ThisAccessor($offset${isSuper ? ', super' : ''})"; 384 toString() {
385 int offset = offsetForToken(token);
386 return "ThisAccessor($offset${isSuper ? ', super' : ''})";
387 }
380 } 388 }
381 389
382 abstract class IncompleteSend extends FastaAccessor { 390 abstract class IncompleteSend extends FastaAccessor {
383 final BuilderHelper helper; 391 final BuilderHelper helper;
384 392
385 @override 393 @override
386 final int offset; 394 final Token token;
387 395
388 final Name name; 396 final Name name;
389 397
390 IncompleteSend(this.helper, this.offset, this.name); 398 IncompleteSend(this.helper, this.token, this.name);
391 399
392 @override 400 @override
393 Expression get builtBinary => internalError("Unsupported operation."); 401 Expression get builtBinary => internalError("Unsupported operation.");
394 402
395 @override 403 @override
396 void set builtBinary(Expression expression) { 404 void set builtBinary(Expression expression) {
397 internalError("Unsupported operation."); 405 internalError("Unsupported operation.");
398 } 406 }
399 407
400 @override 408 @override
401 Expression get builtGetter => internalError("Unsupported operation."); 409 Expression get builtGetter => internalError("Unsupported operation.");
402 410
403 @override 411 @override
404 void set builtGetter(Expression expression) { 412 void set builtGetter(Expression expression) {
405 internalError("Unsupported operation."); 413 internalError("Unsupported operation.");
406 } 414 }
407 415
408 withReceiver(Object receiver, {bool isNullAware}); 416 withReceiver(Object receiver, {bool isNullAware});
409 } 417 }
410 418
411 class IncompleteError extends IncompleteSend with ErrorAccessor { 419 class IncompleteError extends IncompleteSend with ErrorAccessor {
412 final Object error; 420 final Object error;
413 421
414 IncompleteError(BuilderHelper helper, int offset, this.error) 422 IncompleteError(BuilderHelper helper, Token token, this.error)
415 : super(helper, offset, null); 423 : super(helper, token, null);
416 424
417 @override 425 @override
418 Expression buildError(Arguments arguments, 426 Expression buildError(Arguments arguments,
419 {bool isGetter: false, bool isSetter: false, int offset}) { 427 {bool isGetter: false, bool isSetter: false, int offset}) {
420 return helper.buildCompileTimeError(error, offset ?? this.offset); 428 return helper.buildCompileTimeError(
429 error, offset ?? offsetForToken(this.token));
421 } 430 }
422 431
423 @override 432 @override
424 doInvocation(int offset, Arguments arguments) => this; 433 doInvocation(int offset, Arguments arguments) => this;
425 } 434 }
426 435
427 class SendAccessor extends IncompleteSend { 436 class SendAccessor extends IncompleteSend {
428 final Arguments arguments; 437 final Arguments arguments;
429 438
430 SendAccessor(BuilderHelper helper, int offset, Name name, this.arguments) 439 SendAccessor(BuilderHelper helper, Token token, Name name, this.arguments)
431 : super(helper, offset, name) { 440 : super(helper, token, name) {
432 assert(arguments != null); 441 assert(arguments != null);
433 } 442 }
434 443
435 String get plainNameForRead => name.name; 444 String get plainNameForRead => name.name;
436 445
437 Expression buildSimpleRead() { 446 Expression buildSimpleRead() {
438 return internalError("Unhandled"); 447 return internalError("Unhandled");
439 } 448 }
440 449
441 Expression buildAssignment(Expression value, {bool voidContext: false}) { 450 Expression buildAssignment(Expression value, {bool voidContext: false}) {
442 return internalError("Unhandled"); 451 return internalError("Unhandled");
443 } 452 }
444 453
445 withReceiver(Object receiver, {bool isNullAware: false}) { 454 withReceiver(Object receiver, {bool isNullAware: false}) {
446 if (receiver is TypeDeclarationBuilder) { 455 if (receiver is TypeDeclarationBuilder) {
447 /// `SomeType?.toString` is the same as `SomeType.toString`, not 456 /// `SomeType?.toString` is the same as `SomeType.toString`, not
448 /// `(SomeType).toString`. 457 /// `(SomeType).toString`.
449 isNullAware = false; 458 isNullAware = false;
450 } 459 }
451 if (receiver is FastaAccessor) { 460 if (receiver is FastaAccessor) {
452 return receiver.buildPropertyAccess(this, isNullAware); 461 return receiver.buildPropertyAccess(this, isNullAware);
453 } 462 }
454 if (receiver is PrefixBuilder) { 463 if (receiver is PrefixBuilder) {
455 PrefixBuilder prefix = receiver; 464 PrefixBuilder prefix = receiver;
456 receiver = helper.scopeLookup(prefix.exports, name.name, offset, 465 receiver = helper.scopeLookup(prefix.exports, name.name, token,
457 isQualified: true, prefix: prefix); 466 isQualified: true, prefix: prefix);
458 return helper.finishSend(receiver, arguments, offset); 467 return helper.finishSend(receiver, arguments, offsetForToken(token));
459 } 468 }
460 Expression result; 469 Expression result;
461 if (receiver is KernelClassBuilder) { 470 if (receiver is KernelClassBuilder) {
462 Builder builder = receiver.findStaticBuilder(name.name, offset, uri); 471 Builder builder =
472 receiver.findStaticBuilder(name.name, offsetForToken(token), uri);
463 if (builder == null || builder is AccessErrorBuilder) { 473 if (builder == null || builder is AccessErrorBuilder) {
464 return buildThrowNoSuchMethodError(arguments); 474 return buildThrowNoSuchMethodError(arguments);
465 } 475 }
466 if (builder.hasProblem) { 476 if (builder.hasProblem) {
467 result = helper.buildProblemExpression(builder, offset); 477 result = helper.buildProblemExpression(builder, offsetForToken(token));
468 } else { 478 } else {
469 Member target = builder.target; 479 Member target = builder.target;
470 if (target != null) { 480 if (target != null) {
471 if (target is Field) { 481 if (target is Field) {
472 result = buildMethodInvocation(new StaticGet(target), callName, 482 result = buildMethodInvocation(
473 arguments, offset + (target.name?.name?.length ?? 0), 483 new StaticGet(target),
484 callName,
485 arguments,
486 offsetForToken(token) + (target.name?.name?.length ?? 0),
ahe 2017/04/25 17:39:59 You can also test this with the service tests. I
Paul Berry 2017/04/25 22:00:55 Is the idea that this is supposed to be the offset
474 isNullAware: isNullAware); 487 isNullAware: isNullAware);
475 } else { 488 } else {
476 result = helper.buildStaticInvocation(target, arguments) 489 result = helper.buildStaticInvocation(target, arguments)
477 ..fileOffset = offset; 490 ..fileOffset = offsetForToken(token);
478 } 491 }
479 } else { 492 } else {
480 result = buildThrowNoSuchMethodError(arguments)..fileOffset = offset; 493 result = buildThrowNoSuchMethodError(arguments)
494 ..fileOffset = offsetForToken(token);
481 } 495 }
482 } 496 }
483 } else { 497 } else {
484 result = buildMethodInvocation( 498 result = buildMethodInvocation(
485 helper.toValue(receiver), name, arguments, offset, 499 helper.toValue(receiver), name, arguments, offsetForToken(token),
486 isNullAware: isNullAware); 500 isNullAware: isNullAware);
487 } 501 }
488 return result; 502 return result;
489 } 503 }
490 504
491 Expression buildNullAwareAssignment(Expression value, DartType type, 505 Expression buildNullAwareAssignment(Expression value, DartType type,
492 {bool voidContext: false}) { 506 {bool voidContext: false}) {
493 return internalError("Unhandled"); 507 return internalError("Unhandled");
494 } 508 }
495 509
496 Expression buildCompoundAssignment(Name binaryOperator, Expression value, 510 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
497 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 511 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
498 return internalError("Unhandled"); 512 return internalError("Unhandled");
499 } 513 }
500 514
501 Expression buildPrefixIncrement(Name binaryOperator, 515 Expression buildPrefixIncrement(Name binaryOperator,
502 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 516 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
503 return internalError("Unhandled"); 517 return internalError("Unhandled");
504 } 518 }
505 519
506 Expression buildPostfixIncrement(Name binaryOperator, 520 Expression buildPostfixIncrement(Name binaryOperator,
507 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 521 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
508 return internalError("Unhandled"); 522 return internalError("Unhandled");
509 } 523 }
510 524
511 Expression doInvocation(int offset, Arguments arguments) { 525 Expression doInvocation(int offset, Arguments arguments) {
512 return internalError("Unhandled"); 526 return internalError("Unhandled");
513 } 527 }
514 528
515 toString() => "SendAccessor($offset, $name, $arguments)"; 529 toString() {
530 int offset = offsetForToken(token);
531 return "SendAccessor($offset, $name, $arguments)";
532 }
516 } 533 }
517 534
518 class IncompletePropertyAccessor extends IncompleteSend { 535 class IncompletePropertyAccessor extends IncompleteSend {
519 IncompletePropertyAccessor(BuilderHelper helper, int offset, Name name) 536 IncompletePropertyAccessor(BuilderHelper helper, Token token, Name name)
520 : super(helper, offset, name); 537 : super(helper, token, name);
521 538
522 String get plainNameForRead => name.name; 539 String get plainNameForRead => name.name;
523 540
524 Expression buildSimpleRead() => internalError("Unhandled"); 541 Expression buildSimpleRead() => internalError("Unhandled");
525 542
526 Expression buildAssignment(Expression value, {bool voidContext: false}) { 543 Expression buildAssignment(Expression value, {bool voidContext: false}) {
527 return internalError("Unhandled"); 544 return internalError("Unhandled");
528 } 545 }
529 546
530 withReceiver(Object receiver, {bool isNullAware: false}) { 547 withReceiver(Object receiver, {bool isNullAware: false}) {
531 if (receiver is TypeDeclarationBuilder) { 548 if (receiver is TypeDeclarationBuilder) {
532 /// For reasons beyond comprehension, `SomeType?.toString` is the same as 549 /// For reasons beyond comprehension, `SomeType?.toString` is the same as
533 /// `SomeType.toString`, not `(SomeType).toString`. WTAF!?! 550 /// `SomeType.toString`, not `(SomeType).toString`. WTAF!?!
534 // 551 //
535 isNullAware = false; 552 isNullAware = false;
536 } 553 }
537 if (receiver is FastaAccessor) { 554 if (receiver is FastaAccessor) {
538 return receiver.buildPropertyAccess(this, isNullAware); 555 return receiver.buildPropertyAccess(this, isNullAware);
539 } 556 }
540 if (receiver is PrefixBuilder) { 557 if (receiver is PrefixBuilder) {
541 PrefixBuilder prefix = receiver; 558 PrefixBuilder prefix = receiver;
542 return helper.scopeLookup(prefix.exports, name.name, offset, 559 return helper.scopeLookup(prefix.exports, name.name, token,
543 isQualified: true, prefix: prefix); 560 isQualified: true, prefix: prefix);
544 } 561 }
545 if (receiver is KernelClassBuilder) { 562 if (receiver is KernelClassBuilder) {
546 Builder builder = receiver.findStaticBuilder(name.name, offset, uri); 563 Builder builder =
564 receiver.findStaticBuilder(name.name, offsetForToken(token), uri);
547 if (builder == null) { 565 if (builder == null) {
548 // If we find a setter, [builder] is an [AccessErrorBuilder], not null. 566 // If we find a setter, [builder] is an [AccessErrorBuilder], not null.
549 return buildThrowNoSuchMethodError(new Arguments.empty(), 567 return buildThrowNoSuchMethodError(new Arguments.empty(),
550 isGetter: true); 568 isGetter: true);
551 } 569 }
552 Builder setter; 570 Builder setter;
553 if (builder.isSetter) { 571 if (builder.isSetter) {
554 setter = builder; 572 setter = builder;
555 } else if (builder.isGetter) { 573 } else if (builder.isGetter) {
556 setter = 574 setter = receiver.findStaticBuilder(
557 receiver.findStaticBuilder(name.name, offset, uri, isSetter: true); 575 name.name, offsetForToken(token), uri,
576 isSetter: true);
558 } else if (builder.isField && !builder.isFinal) { 577 } else if (builder.isField && !builder.isFinal) {
559 setter = builder; 578 setter = builder;
560 } 579 }
561 return new StaticAccessor.fromBuilder(helper, builder, offset, setter); 580 return new StaticAccessor.fromBuilder(helper, builder, token, setter);
562 } 581 }
563 return PropertyAccessor.make(helper, offset, helper.toValue(receiver), name, 582 return PropertyAccessor.make(
564 null, null, isNullAware); 583 helper, token, helper.toValue(receiver), name, null, null, isNullAware);
565 } 584 }
566 585
567 Expression buildNullAwareAssignment(Expression value, DartType type, 586 Expression buildNullAwareAssignment(Expression value, DartType type,
568 {bool voidContext: false}) { 587 {bool voidContext: false}) {
569 return internalError("Unhandled"); 588 return internalError("Unhandled");
570 } 589 }
571 590
572 Expression buildCompoundAssignment(Name binaryOperator, Expression value, 591 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
573 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 592 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
574 return internalError("Unhandled"); 593 return internalError("Unhandled");
575 } 594 }
576 595
577 Expression buildPrefixIncrement(Name binaryOperator, 596 Expression buildPrefixIncrement(Name binaryOperator,
578 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 597 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
579 return internalError("Unhandled"); 598 return internalError("Unhandled");
580 } 599 }
581 600
582 Expression buildPostfixIncrement(Name binaryOperator, 601 Expression buildPostfixIncrement(Name binaryOperator,
583 {int offset, bool voidContext: false, Procedure interfaceTarget}) { 602 {int offset, bool voidContext: false, Procedure interfaceTarget}) {
584 return internalError("Unhandled"); 603 return internalError("Unhandled");
585 } 604 }
586 605
587 Expression doInvocation(int offset, Arguments arguments) { 606 Expression doInvocation(int offset, Arguments arguments) {
588 return internalError("Unhandled"); 607 return internalError("Unhandled");
589 } 608 }
590 609
591 toString() => "IncompletePropertyAccessor($offset, $name)"; 610 toString() {
611 int offset = offsetForToken(token);
612 return "IncompletePropertyAccessor($offset, $name)";
613 }
592 } 614 }
593 615
594 class IndexAccessor extends kernel.IndexAccessor with FastaAccessor { 616 class IndexAccessor extends kernel.IndexAccessor with FastaAccessor {
595 final BuilderHelper helper; 617 final BuilderHelper helper;
596 618
597 IndexAccessor.internal(this.helper, int offset, Expression receiver, 619 IndexAccessor.internal(this.helper, Token token, Expression receiver,
598 Expression index, Procedure getter, Procedure setter) 620 Expression index, Procedure getter, Procedure setter)
599 : super.internal(receiver, index, getter, setter, offset); 621 : super.internal(receiver, index, getter, setter, token);
600 622
601 String get plainNameForRead => "[]"; 623 String get plainNameForRead => "[]";
602 624
603 String get plainNameForWrite => "[]="; 625 String get plainNameForWrite => "[]=";
604 626
605 Expression doInvocation(int offset, Arguments arguments) { 627 Expression doInvocation(int offset, Arguments arguments) {
606 return buildMethodInvocation( 628 return buildMethodInvocation(
607 buildSimpleRead(), callName, arguments, offset); 629 buildSimpleRead(), callName, arguments, offset);
608 } 630 }
609 631
610 toString() => "IndexAccessor()"; 632 toString() => "IndexAccessor()";
611 633
612 static FastaAccessor make( 634 static FastaAccessor make(
613 BuilderHelper helper, 635 BuilderHelper helper,
614 int offset, 636 Token token,
615 Expression receiver, 637 Expression receiver,
616 Expression index, 638 Expression index,
617 Procedure getter, 639 Procedure getter,
618 Procedure setter) { 640 Procedure setter) {
619 if (receiver is ThisExpression) { 641 if (receiver is ThisExpression) {
620 return new ThisIndexAccessor(helper, offset, index, getter, setter); 642 return new ThisIndexAccessor(helper, token, index, getter, setter);
621 } else { 643 } else {
622 return new IndexAccessor.internal( 644 return new IndexAccessor.internal(
623 helper, offset, receiver, index, getter, setter); 645 helper, token, receiver, index, getter, setter);
624 } 646 }
625 } 647 }
626 } 648 }
627 649
628 class PropertyAccessor extends kernel.PropertyAccessor with FastaAccessor { 650 class PropertyAccessor extends kernel.PropertyAccessor with FastaAccessor {
629 final BuilderHelper helper; 651 final BuilderHelper helper;
630 652
631 PropertyAccessor.internal(this.helper, int offset, Expression receiver, 653 PropertyAccessor.internal(this.helper, Token token, Expression receiver,
632 Name name, Member getter, Member setter) 654 Name name, Member getter, Member setter)
633 : super.internal(receiver, name, getter, setter, offset); 655 : super.internal(receiver, name, getter, setter, token);
634 656
635 String get plainNameForRead => name.name; 657 String get plainNameForRead => name.name;
636 658
637 bool get isThisPropertyAccessor => receiver is ThisExpression; 659 bool get isThisPropertyAccessor => receiver is ThisExpression;
638 660
639 Expression doInvocation(int offset, Arguments arguments) { 661 Expression doInvocation(int offset, Arguments arguments) {
640 return buildMethodInvocation(receiver, name, arguments, offset); 662 return buildMethodInvocation(receiver, name, arguments, offset);
641 } 663 }
642 664
643 toString() => "PropertyAccessor()"; 665 toString() => "PropertyAccessor()";
644 666
645 static FastaAccessor make( 667 static FastaAccessor make(
646 BuilderHelper helper, 668 BuilderHelper helper,
647 int offset, 669 Token token,
648 Expression receiver, 670 Expression receiver,
649 Name name, 671 Name name,
650 Member getter, 672 Member getter,
651 Member setter, 673 Member setter,
652 bool isNullAware) { 674 bool isNullAware) {
653 if (receiver is ThisExpression) { 675 if (receiver is ThisExpression) {
654 return new ThisPropertyAccessor(helper, offset, name, getter, setter); 676 return new ThisPropertyAccessor(helper, token, name, getter, setter);
655 } else { 677 } else {
656 return isNullAware 678 return isNullAware
657 ? new NullAwarePropertyAccessor( 679 ? new NullAwarePropertyAccessor(
658 helper, offset, receiver, name, getter, setter, null) 680 helper, token, receiver, name, getter, setter, null)
659 : new PropertyAccessor.internal( 681 : new PropertyAccessor.internal(
660 helper, offset, receiver, name, getter, setter); 682 helper, token, receiver, name, getter, setter);
661 } 683 }
662 } 684 }
663 } 685 }
664 686
665 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor { 687 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor {
666 StaticAccessor( 688 StaticAccessor(
667 BuilderHelper helper, int offset, Member readTarget, Member writeTarget) 689 BuilderHelper helper, Token token, Member readTarget, Member writeTarget)
668 : super(helper, readTarget, writeTarget, offset) { 690 : super(helper, readTarget, writeTarget, token) {
669 assert(readTarget != null || writeTarget != null); 691 assert(readTarget != null || writeTarget != null);
670 } 692 }
671 693
672 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, 694 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder,
673 int offset, Builder builderSetter) { 695 Token token, Builder builderSetter) {
674 if (builder is AccessErrorBuilder) { 696 if (builder is AccessErrorBuilder) {
675 AccessErrorBuilder error = builder; 697 AccessErrorBuilder error = builder;
676 builder = error.builder; 698 builder = error.builder;
677 // We should only see an access error here if we've looked up a setter 699 // We should only see an access error here if we've looked up a setter
678 // when not explicitly looking for a setter. 700 // when not explicitly looking for a setter.
679 assert(builder.isSetter); 701 assert(builder.isSetter);
680 } else if (builder.target == null) { 702 } else if (builder.target == null) {
681 return internalError("Unhandled: ${builder}"); 703 return internalError("Unhandled: ${builder}");
682 } 704 }
683 Member getter = builder.target.hasGetter ? builder.target : null; 705 Member getter = builder.target.hasGetter ? builder.target : null;
684 Member setter = builder.target.hasSetter ? builder.target : null; 706 Member setter = builder.target.hasSetter ? builder.target : null;
685 if (setter == null) { 707 if (setter == null) {
686 if (builderSetter?.target?.hasSetter ?? false) { 708 if (builderSetter?.target?.hasSetter ?? false) {
687 setter = builderSetter.target; 709 setter = builderSetter.target;
688 } 710 }
689 } 711 }
690 return new StaticAccessor(helper, offset, getter, setter); 712 return new StaticAccessor(helper, token, getter, setter);
691 } 713 }
692 714
693 String get plainNameForRead => (readTarget ?? writeTarget).name.name; 715 String get plainNameForRead => (readTarget ?? writeTarget).name.name;
694 716
695 Expression doInvocation(int offset, Arguments arguments) { 717 Expression doInvocation(int offset, Arguments arguments) {
696 if (readTarget == null || isFieldOrGetter(readTarget)) { 718 if (readTarget == null || isFieldOrGetter(readTarget)) {
697 return buildMethodInvocation(buildSimpleRead(), callName, arguments, 719 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
698 offset + (readTarget?.name?.name?.length ?? 0)); 720 offset + (readTarget?.name?.name?.length ?? 0));
699 } else { 721 } else {
700 return helper.buildStaticInvocation(readTarget, arguments) 722 return helper.buildStaticInvocation(readTarget, arguments)
701 ..fileOffset = offset; 723 ..fileOffset = offset;
702 } 724 }
703 } 725 }
704 726
705 toString() => "StaticAccessor()"; 727 toString() => "StaticAccessor()";
706 } 728 }
707 729
708 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor 730 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
709 with FastaAccessor { 731 with FastaAccessor {
710 final BuilderHelper helper; 732 final BuilderHelper helper;
711 733
712 SuperPropertyAccessor( 734 SuperPropertyAccessor(
713 this.helper, int offset, Name name, Member getter, Member setter) 735 this.helper, Token token, Name name, Member getter, Member setter)
714 : super(name, getter, setter, offset); 736 : super(name, getter, setter, token);
715 737
716 String get plainNameForRead => name.name; 738 String get plainNameForRead => name.name;
717 739
718 Expression doInvocation(int offset, Arguments arguments) { 740 Expression doInvocation(int offset, Arguments arguments) {
719 if (getter == null || isFieldOrGetter(getter)) { 741 if (getter == null || isFieldOrGetter(getter)) {
720 return buildMethodInvocation( 742 return buildMethodInvocation(
721 buildSimpleRead(), callName, arguments, offset); 743 buildSimpleRead(), callName, arguments, offset);
722 } else { 744 } else {
723 return new DirectMethodInvocation(new ThisExpression(), getter, arguments) 745 return new DirectMethodInvocation(new ThisExpression(), getter, arguments)
724 ..fileOffset = offset; 746 ..fileOffset = offset;
725 } 747 }
726 } 748 }
727 749
728 toString() => "SuperPropertyAccessor()"; 750 toString() => "SuperPropertyAccessor()";
729 } 751 }
730 752
731 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { 753 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor {
732 final BuilderHelper helper; 754 final BuilderHelper helper;
733 755
734 ThisIndexAccessor(this.helper, int offset, Expression index, Procedure getter, 756 ThisIndexAccessor(this.helper, Token token, Expression index,
735 Procedure setter) 757 Procedure getter, Procedure setter)
736 : super(index, getter, setter, offset); 758 : super(index, getter, setter, token);
737 759
738 String get plainNameForRead => "[]"; 760 String get plainNameForRead => "[]";
739 761
740 String get plainNameForWrite => "[]="; 762 String get plainNameForWrite => "[]=";
741 763
742 Expression doInvocation(int offset, Arguments arguments) { 764 Expression doInvocation(int offset, Arguments arguments) {
743 return buildMethodInvocation( 765 return buildMethodInvocation(
744 buildSimpleRead(), callName, arguments, offset); 766 buildSimpleRead(), callName, arguments, offset);
745 } 767 }
746 768
747 toString() => "ThisIndexAccessor()"; 769 toString() => "ThisIndexAccessor()";
748 } 770 }
749 771
750 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor { 772 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor {
751 final BuilderHelper helper; 773 final BuilderHelper helper;
752 774
753 SuperIndexAccessor( 775 SuperIndexAccessor(
754 this.helper, int offset, Expression index, Member getter, Member setter) 776 this.helper, Token token, Expression index, Member getter, Member setter)
755 : super(index, getter, setter, offset); 777 : super(index, getter, setter, token);
756 778
757 String get plainNameForRead => "[]"; 779 String get plainNameForRead => "[]";
758 780
759 String get plainNameForWrite => "[]="; 781 String get plainNameForWrite => "[]=";
760 782
761 Expression doInvocation(int offset, Arguments arguments) { 783 Expression doInvocation(int offset, Arguments arguments) {
762 return buildMethodInvocation( 784 return buildMethodInvocation(
763 buildSimpleRead(), callName, arguments, offset); 785 buildSimpleRead(), callName, arguments, offset);
764 } 786 }
765 787
766 toString() => "SuperIndexAccessor()"; 788 toString() => "SuperIndexAccessor()";
767 } 789 }
768 790
769 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor 791 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
770 with FastaAccessor { 792 with FastaAccessor {
771 final BuilderHelper helper; 793 final BuilderHelper helper;
772 794
773 ThisPropertyAccessor( 795 ThisPropertyAccessor(
774 this.helper, int offset, Name name, Member getter, Member setter) 796 this.helper, Token token, Name name, Member getter, Member setter)
775 : super(name, getter, setter, offset); 797 : super(name, getter, setter, token);
776 798
777 String get plainNameForRead => name.name; 799 String get plainNameForRead => name.name;
778 800
779 bool get isThisPropertyAccessor => true; 801 bool get isThisPropertyAccessor => true;
780 802
781 Expression doInvocation(int offset, Arguments arguments) { 803 Expression doInvocation(int offset, Arguments arguments) {
782 Member interfaceTarget = getter; 804 Member interfaceTarget = getter;
783 if (interfaceTarget is Field) { 805 if (interfaceTarget is Field) {
784 // TODO(ahe): In strong mode we should probably rewrite this to 806 // TODO(ahe): In strong mode we should probably rewrite this to
785 // `this.name.call(arguments)`. 807 // `this.name.call(arguments)`.
786 interfaceTarget = null; 808 interfaceTarget = null;
787 } 809 }
788 return buildMethodInvocation(new ThisExpression(), name, arguments, offset); 810 return buildMethodInvocation(new ThisExpression(), name, arguments, offset);
789 } 811 }
790 812
791 toString() => "ThisPropertyAccessor()"; 813 toString() => "ThisPropertyAccessor()";
792 } 814 }
793 815
794 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor 816 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
795 with FastaAccessor { 817 with FastaAccessor {
796 final BuilderHelper helper; 818 final BuilderHelper helper;
797 819
798 NullAwarePropertyAccessor(this.helper, int offset, Expression receiver, 820 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver,
799 Name name, Member getter, Member setter, DartType type) 821 Name name, Member getter, Member setter, DartType type)
800 : super(receiver, name, getter, setter, type, offset); 822 : super(receiver, name, getter, setter, type, token);
801 823
802 String get plainNameForRead => name.name; 824 String get plainNameForRead => name.name;
803 825
804 Expression doInvocation(int offset, Arguments arguments) { 826 Expression doInvocation(int offset, Arguments arguments) {
805 return internalError("Not implemented yet."); 827 return internalError("Not implemented yet.");
806 } 828 }
807 829
808 toString() => "NullAwarePropertyAccessor()"; 830 toString() => "NullAwarePropertyAccessor()";
809 } 831 }
810 832
811 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor { 833 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor {
812 final BuilderHelper helper; 834 final BuilderHelper helper;
813 835
814 VariableAccessor(this.helper, int offset, VariableDeclaration variable, 836 VariableAccessor(this.helper, Token token, VariableDeclaration variable,
815 [DartType promotedType]) 837 [DartType promotedType])
816 : super(variable, promotedType, offset); 838 : super(variable, promotedType, token);
817 839
818 String get plainNameForRead => variable.name; 840 String get plainNameForRead => variable.name;
819 841
820 Expression doInvocation(int offset, Arguments arguments) { 842 Expression doInvocation(int offset, Arguments arguments) {
821 // Normally the offset is at the start of the token, but in this case, 843 // Normally the offset is at the start of the token, but in this case,
822 // because we insert a '.call', we want it at the end instead. 844 // because we insert a '.call', we want it at the end instead.
823 return buildMethodInvocation(buildSimpleRead(), callName, arguments, 845 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
824 offset + (variable.name?.length ?? 0)); 846 offset + (variable.name?.length ?? 0));
825 } 847 }
826 848
827 toString() => "VariableAccessor()"; 849 toString() => "VariableAccessor()";
828 } 850 }
829 851
830 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor { 852 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor {
831 final BuilderHelper helper; 853 final BuilderHelper helper;
832 854
833 final String plainNameForRead; 855 final String plainNameForRead;
834 856
835 ReadOnlyAccessor( 857 ReadOnlyAccessor(
836 this.helper, Expression expression, this.plainNameForRead, int offset) 858 this.helper, Expression expression, this.plainNameForRead, Token token)
837 : super(expression, offset); 859 : super(expression, token);
838 860
839 Expression doInvocation(int offset, Arguments arguments) { 861 Expression doInvocation(int offset, Arguments arguments) {
840 return buildMethodInvocation( 862 return buildMethodInvocation(
841 buildSimpleRead(), callName, arguments, offset); 863 buildSimpleRead(), callName, arguments, offset);
842 } 864 }
843 } 865 }
844 866
845 class ParenthesizedExpression extends ReadOnlyAccessor { 867 class ParenthesizedExpression extends ReadOnlyAccessor {
846 ParenthesizedExpression( 868 ParenthesizedExpression(
847 BuilderHelper helper, Expression expression, int offset) 869 BuilderHelper helper, Expression expression, Token token)
848 : super(helper, expression, "<a parenthesized expression>", offset); 870 : super(helper, expression, "<a parenthesized expression>", token);
849 871
850 Expression makeInvalidWrite(Expression value) { 872 Expression makeInvalidWrite(Expression value) {
851 return helper.buildCompileTimeError( 873 return helper.buildCompileTimeError(
852 "Can't assign to a parenthesized expression.", offset); 874 "Can't assign to a parenthesized expression.", offsetForToken(token));
853 } 875 }
854 } 876 }
855 877
856 class UnresolvedAccessor extends FastaAccessor with ErrorAccessor { 878 class UnresolvedAccessor extends FastaAccessor with ErrorAccessor {
857 @override 879 @override
858 final int offset; 880 final Token token;
859 881
860 @override 882 @override
861 final BuilderHelper helper; 883 final BuilderHelper helper;
862 884
863 @override 885 @override
864 final Name name; 886 final Name name;
865 887
866 UnresolvedAccessor(this.helper, this.name, this.offset); 888 UnresolvedAccessor(this.helper, this.name, this.token);
867 889
868 Expression doInvocation(int charOffset, Arguments arguments) { 890 Expression doInvocation(int charOffset, Arguments arguments) {
869 return buildError(arguments, offset: charOffset); 891 return buildError(arguments, offset: charOffset);
870 } 892 }
871 893
872 @override 894 @override
873 Expression buildError(Arguments arguments, 895 Expression buildError(Arguments arguments,
874 {bool isGetter: false, bool isSetter: false, int offset}) { 896 {bool isGetter: false, bool isSetter: false, int offset}) {
875 return helper.throwNoSuchMethodError( 897 return helper.throwNoSuchMethodError(
876 plainNameForRead, arguments, offset ?? this.offset, 898 plainNameForRead, arguments, offset ?? offsetForToken(this.token),
877 isGetter: isGetter, isSetter: isSetter); 899 isGetter: isGetter, isSetter: isSetter);
878 } 900 }
879 } 901 }
880 902
881 bool isFieldOrGetter(Member member) { 903 bool isFieldOrGetter(Member member) {
882 return member is Field || (member is Procedure && member.isGetter); 904 return member is Field || (member is Procedure && member.isGetter);
883 } 905 }
884 906
885 Expression buildMethodInvocation( 907 Expression buildMethodInvocation(
886 Expression receiver, Name name, Arguments arguments, int offset, 908 Expression receiver, Name name, Arguments arguments, int offset,
887 {bool isNullAware: false}) { 909 {bool isNullAware: false}) {
888 if (isNullAware) { 910 if (isNullAware) {
889 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); 911 VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
890 return makeLet( 912 return makeLet(
891 variable, 913 variable,
892 new ConditionalExpression( 914 new ConditionalExpression(
893 buildIsNull(new VariableGet(variable)), 915 buildIsNull(new VariableGet(variable)),
894 new NullLiteral(), 916 new NullLiteral(),
895 new MethodInvocation(new VariableGet(variable), name, arguments) 917 new MethodInvocation(new VariableGet(variable), name, arguments)
896 ..fileOffset = offset, 918 ..fileOffset = offset,
897 const DynamicType())); 919 const DynamicType()));
898 } else { 920 } else {
899 return new MethodInvocation(receiver, name, arguments)..fileOffset = offset; 921 return new MethodInvocation(receiver, name, arguments)..fileOffset = offset;
900 } 922 }
901 } 923 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698