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

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

Powered by Google App Engine
This is Rietveld 408576698