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

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

Issue 2904673003: Remove AstFactory from the front end. (Closed)
Patch Set: 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/kernel_shadow_ast.dart'
10 show KernelArguments, KernelMethodInvocation;
11
9 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; 12 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken;
10 13
11 import 'package:front_end/src/scanner/token.dart' show Token; 14 import 'package:front_end/src/scanner/token.dart' show Token;
12 15
13 import 'frontend_accessors.dart' show Accessor, buildIsNull, makeLet; 16 import 'frontend_accessors.dart' show Accessor, buildIsNull, makeLet;
14 17
15 import 'package:front_end/src/fasta/builder/ast_factory.dart' show AstFactory;
16
17 import 'package:front_end/src/fasta/type_inference/type_promotion.dart' 18 import 'package:front_end/src/fasta/type_inference/type_promotion.dart'
18 show TypePromoter; 19 show TypePromoter;
19 20
20 import 'package:kernel/ast.dart'; 21 import 'package:kernel/ast.dart';
21 22
22 import '../errors.dart' show internalError; 23 import '../errors.dart' show internalError;
23 24
24 import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope; 25 import '../scope.dart' show AccessErrorBuilder, ProblemBuilder, Scope;
25 26
26 import 'frontend_accessors.dart' as kernel 27 import 'frontend_accessors.dart' as kernel
(...skipping 14 matching lines...) Expand all
41 42
42 import '../names.dart' show callName; 43 import '../names.dart' show callName;
43 44
44 abstract class BuilderHelper { 45 abstract class BuilderHelper {
45 Uri get uri; 46 Uri get uri;
46 47
47 TypePromoter get typePromoter; 48 TypePromoter get typePromoter;
48 49
49 int get functionNestingLevel; 50 int get functionNestingLevel;
50 51
51 AstFactory get astFactory;
52
53 Constructor lookupConstructor(Name name, {bool isSuper}); 52 Constructor lookupConstructor(Name name, {bool isSuper});
54 53
55 Expression toSuperMethodInvocation(MethodInvocation node); 54 Expression toSuperMethodInvocation(MethodInvocation node);
56 55
57 Expression toValue(node); 56 Expression toValue(node);
58 57
59 Member lookupSuperMember(Name name, {bool isSetter: false}); 58 Member lookupSuperMember(Name name, {bool isSetter: false});
60 59
61 scopeLookup(Scope scope, String name, Token token, 60 scopeLookup(Scope scope, String name, Token token,
62 {bool isQualified: false, PrefixBuilder prefix}); 61 {bool isQualified: false, PrefixBuilder prefix});
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 "Can't use $plainNameForRead here.", 110 "Can't use $plainNameForRead here.",
112 offset), 111 offset),
113 offset); 112 offset);
114 } 113 }
115 114
116 Expression makeInvalidRead() { 115 Expression makeInvalidRead() {
117 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true); 116 return buildThrowNoSuchMethodError(new Arguments.empty(), isGetter: true);
118 } 117 }
119 118
120 Expression makeInvalidWrite(Expression value) { 119 Expression makeInvalidWrite(Expression value) {
121 return buildThrowNoSuchMethodError( 120 return buildThrowNoSuchMethodError(new KernelArguments(<Expression>[value]),
122 helper.astFactory.arguments(<Expression>[value]),
123 isSetter: true); 121 isSetter: true);
124 } 122 }
125 123
126 /* Expression | FastaAccessor | Initializer */ doInvocation( 124 /* Expression | FastaAccessor | Initializer */ doInvocation(
127 int offset, Arguments arguments); 125 int offset, Arguments arguments);
128 126
129 /* Expression | FastaAccessor */ buildPropertyAccess( 127 /* Expression | FastaAccessor */ buildPropertyAccess(
130 IncompleteSend send, bool isNullAware) { 128 IncompleteSend send, bool isNullAware) {
131 if (send is SendAccessor) { 129 if (send is SendAccessor) {
132 return buildMethodInvocation(helper.astFactory, buildSimpleRead(), 130 return buildMethodInvocation(buildSimpleRead(), send.name, send.arguments,
133 send.name, send.arguments, offsetForToken(send.token), 131 offsetForToken(send.token),
134 isNullAware: isNullAware); 132 isNullAware: isNullAware);
135 } else { 133 } else {
136 return PropertyAccessor.make(helper, send.token, buildSimpleRead(), 134 return PropertyAccessor.make(helper, send.token, buildSimpleRead(),
137 send.name, null, null, isNullAware); 135 send.name, null, null, isNullAware);
138 } 136 }
139 } 137 }
140 138
141 /* Expression | FastaAccessor */ buildThrowNoSuchMethodError( 139 /* Expression | FastaAccessor */ buildThrowNoSuchMethodError(
142 Arguments arguments, 140 Arguments arguments,
143 {bool isSuper: false, 141 {bool isSuper: false,
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
203 {bool isSuper: false, 201 {bool isSuper: false,
204 isGetter: false, 202 isGetter: false,
205 isSetter: false, 203 isSetter: false,
206 String name, 204 String name,
207 int offset}) { 205 int offset}) {
208 return this; 206 return this;
209 } 207 }
210 208
211 @override 209 @override
212 Expression buildAssignment(Expression value, {bool voidContext: false}) { 210 Expression buildAssignment(Expression value, {bool voidContext: false}) {
213 return buildError(helper.astFactory.arguments(<Expression>[value]), 211 return buildError(new KernelArguments(<Expression>[value]), isSetter: true);
214 isSetter: true);
215 } 212 }
216 213
217 @override 214 @override
218 Expression buildCompoundAssignment(Name binaryOperator, Expression value, 215 Expression buildCompoundAssignment(Name binaryOperator, Expression value,
219 {int offset: TreeNode.noOffset, 216 {int offset: TreeNode.noOffset,
220 bool voidContext: false, 217 bool voidContext: false,
221 Procedure interfaceTarget}) { 218 Procedure interfaceTarget}) {
222 return buildError(helper.astFactory.arguments(<Expression>[value]), 219 return buildError(new KernelArguments(<Expression>[value]), isGetter: true);
223 isGetter: true);
224 } 220 }
225 221
226 @override 222 @override
227 Expression buildPrefixIncrement(Name binaryOperator, 223 Expression buildPrefixIncrement(Name binaryOperator,
228 {int offset: TreeNode.noOffset, 224 {int offset: TreeNode.noOffset,
229 bool voidContext: false, 225 bool voidContext: false,
230 Procedure interfaceTarget}) { 226 Procedure interfaceTarget}) {
231 return buildError( 227 return buildError(new KernelArguments(<Expression>[new IntLiteral(1)]),
232 helper.astFactory.arguments(<Expression>[new IntLiteral(1)]),
233 isGetter: true); 228 isGetter: true);
234 } 229 }
235 230
236 @override 231 @override
237 Expression buildPostfixIncrement(Name binaryOperator, 232 Expression buildPostfixIncrement(Name binaryOperator,
238 {int offset: TreeNode.noOffset, 233 {int offset: TreeNode.noOffset,
239 bool voidContext: false, 234 bool voidContext: false,
240 Procedure interfaceTarget}) { 235 Procedure interfaceTarget}) {
241 return buildError( 236 return buildError(new KernelArguments(<Expression>[new IntLiteral(1)]),
242 helper.astFactory.arguments(<Expression>[new IntLiteral(1)]),
243 isGetter: true); 237 isGetter: true);
244 } 238 }
245 239
246 @override 240 @override
247 Expression buildNullAwareAssignment(Expression value, DartType type, 241 Expression buildNullAwareAssignment(Expression value, DartType type,
248 {bool voidContext: false}) { 242 {bool voidContext: false}) {
249 return buildError(helper.astFactory.arguments(<Expression>[value]), 243 return buildError(new KernelArguments(<Expression>[value]), isSetter: true);
250 isSetter: true);
251 } 244 }
252 245
253 @override 246 @override
254 Expression buildSimpleRead() => 247 Expression buildSimpleRead() =>
255 buildError(new Arguments.empty(), isGetter: true); 248 buildError(new Arguments.empty(), isGetter: true);
256 249
257 @override 250 @override
258 Expression makeInvalidRead() => 251 Expression makeInvalidRead() =>
259 buildError(new Arguments.empty(), isGetter: true); 252 buildError(new Arguments.empty(), isGetter: true);
260 253
261 @override 254 @override
262 Expression makeInvalidWrite(Expression value) { 255 Expression makeInvalidWrite(Expression value) {
263 return buildError(helper.astFactory.arguments(<Expression>[value]), 256 return buildError(new KernelArguments(<Expression>[value]), isSetter: true);
264 isSetter: true);
265 } 257 }
266 } 258 }
267 259
268 class ThisAccessor extends FastaAccessor { 260 class ThisAccessor extends FastaAccessor {
269 final BuilderHelper helper; 261 final BuilderHelper helper;
270 262
271 final Token token; 263 final Token token;
272 264
273 final bool isInitializer; 265 final bool isInitializer;
274 266
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 } 307 }
316 308
317 buildPropertyAccess(IncompleteSend send, bool isNullAware) { 309 buildPropertyAccess(IncompleteSend send, bool isNullAware) {
318 if (isInitializer && send is SendAccessor) { 310 if (isInitializer && send is SendAccessor) {
319 return buildConstructorInitializer( 311 return buildConstructorInitializer(
320 offsetForToken(send.token), send.name, send.arguments); 312 offsetForToken(send.token), send.name, send.arguments);
321 } 313 }
322 if (send is SendAccessor) { 314 if (send is SendAccessor) {
323 // Notice that 'this' or 'super' can't be null. So we can ignore the 315 // Notice that 'this' or 'super' can't be null. So we can ignore the
324 // value of [isNullAware]. 316 // value of [isNullAware].
325 MethodInvocation result = buildMethodInvocation( 317 MethodInvocation result = buildMethodInvocation(new ThisExpression(),
326 helper.astFactory, 318 send.name, send.arguments, offsetForToken(token));
327 new ThisExpression(),
328 send.name,
329 send.arguments,
330 offsetForToken(token));
331 return isSuper ? helper.toSuperMethodInvocation(result) : result; 319 return isSuper ? helper.toSuperMethodInvocation(result) : result;
332 } else { 320 } else {
333 if (isSuper) { 321 if (isSuper) {
334 Member getter = helper.lookupSuperMember(send.name); 322 Member getter = helper.lookupSuperMember(send.name);
335 Member setter = helper.lookupSuperMember(send.name, isSetter: true); 323 Member setter = helper.lookupSuperMember(send.name, isSetter: true);
336 return new SuperPropertyAccessor( 324 return new SuperPropertyAccessor(
337 helper, send.token, send.name, getter, setter); 325 helper, send.token, send.name, getter, setter);
338 } else { 326 } else {
339 return new ThisPropertyAccessor( 327 return new ThisPropertyAccessor(
340 helper, send.token, send.name, null, null); 328 helper, send.token, send.name, null, null);
341 } 329 }
342 } 330 }
343 } 331 }
344 332
345 doInvocation(int offset, Arguments arguments) { 333 doInvocation(int offset, Arguments arguments) {
346 if (isInitializer) { 334 if (isInitializer) {
347 return buildConstructorInitializer(offset, new Name(""), arguments); 335 return buildConstructorInitializer(offset, new Name(""), arguments);
348 } else { 336 } else {
349 return buildMethodInvocation( 337 return buildMethodInvocation(
350 helper.astFactory, new ThisExpression(), callName, arguments, offset); 338 new ThisExpression(), callName, arguments, offset);
351 } 339 }
352 } 340 }
353 341
354 Initializer buildConstructorInitializer( 342 Initializer buildConstructorInitializer(
355 int offset, Name name, Arguments arguments) { 343 int offset, Name name, Arguments arguments) {
356 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper); 344 Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
357 if (constructor == null || 345 if (constructor == null ||
358 !helper.checkArguments( 346 !helper.checkArguments(
359 constructor.function, arguments, <TypeParameter>[])) { 347 constructor.function, arguments, <TypeParameter>[])) {
360 return helper.buildInvalidIntializer( 348 return helper.buildInvalidIntializer(
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 if (builder == null || builder is AccessErrorBuilder) { 484 if (builder == null || builder is AccessErrorBuilder) {
497 return buildThrowNoSuchMethodError(arguments); 485 return buildThrowNoSuchMethodError(arguments);
498 } 486 }
499 if (builder.hasProblem) { 487 if (builder.hasProblem) {
500 result = helper.buildProblemExpression(builder, offsetForToken(token)); 488 result = helper.buildProblemExpression(builder, offsetForToken(token));
501 } else { 489 } else {
502 Member target = builder.target; 490 Member target = builder.target;
503 if (target != null) { 491 if (target != null) {
504 if (target is Field) { 492 if (target is Field) {
505 result = buildMethodInvocation( 493 result = buildMethodInvocation(
506 helper.astFactory,
507 new StaticGet(target), 494 new StaticGet(target),
508 callName, 495 callName,
509 arguments, 496 arguments,
510 offsetForToken(token) + (target.name?.name?.length ?? 0), 497 offsetForToken(token) + (target.name?.name?.length ?? 0),
511 isNullAware: isNullAware); 498 isNullAware: isNullAware);
512 } else { 499 } else {
513 result = helper.buildStaticInvocation(target, arguments) 500 result = helper.buildStaticInvocation(target, arguments)
514 ..fileOffset = offsetForToken(token); 501 ..fileOffset = offsetForToken(token);
515 } 502 }
516 } else { 503 } else {
517 result = buildThrowNoSuchMethodError(arguments) 504 result = buildThrowNoSuchMethodError(arguments)
518 ..fileOffset = offsetForToken(token); 505 ..fileOffset = offsetForToken(token);
519 } 506 }
520 } 507 }
521 } else { 508 } else {
522 result = buildMethodInvocation(helper.astFactory, 509 result = buildMethodInvocation(
523 helper.toValue(receiver), name, arguments, offsetForToken(token), 510 helper.toValue(receiver), name, arguments, offsetForToken(token),
524 isNullAware: isNullAware); 511 isNullAware: isNullAware);
525 } 512 }
526 return result; 513 return result;
527 } 514 }
528 515
529 Expression buildNullAwareAssignment(Expression value, DartType type, 516 Expression buildNullAwareAssignment(Expression value, DartType type,
530 {bool voidContext: false}) { 517 {bool voidContext: false}) {
531 return internalError("Unhandled"); 518 return internalError("Unhandled");
532 } 519 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 IndexAccessor.internal(this.helper, Token token, Expression receiver, 630 IndexAccessor.internal(this.helper, Token token, Expression receiver,
644 Expression index, Procedure getter, Procedure setter) 631 Expression index, Procedure getter, Procedure setter)
645 : super.internal(helper, receiver, index, getter, setter, token); 632 : super.internal(helper, receiver, index, getter, setter, token);
646 633
647 String get plainNameForRead => "[]"; 634 String get plainNameForRead => "[]";
648 635
649 String get plainNameForWrite => "[]="; 636 String get plainNameForWrite => "[]=";
650 637
651 Expression doInvocation(int offset, Arguments arguments) { 638 Expression doInvocation(int offset, Arguments arguments) {
652 return buildMethodInvocation( 639 return buildMethodInvocation(
653 helper.astFactory, buildSimpleRead(), callName, arguments, offset); 640 buildSimpleRead(), callName, arguments, offset);
654 } 641 }
655 642
656 toString() => "IndexAccessor()"; 643 toString() => "IndexAccessor()";
657 644
658 static FastaAccessor make( 645 static FastaAccessor make(
659 BuilderHelper helper, 646 BuilderHelper helper,
660 Token token, 647 Token token,
661 Expression receiver, 648 Expression receiver,
662 Expression index, 649 Expression index,
663 Procedure getter, 650 Procedure getter,
(...skipping 12 matching lines...) Expand all
676 663
677 PropertyAccessor.internal(this.helper, Token token, Expression receiver, 664 PropertyAccessor.internal(this.helper, Token token, Expression receiver,
678 Name name, Member getter, Member setter) 665 Name name, Member getter, Member setter)
679 : super.internal(helper, receiver, name, getter, setter, token); 666 : super.internal(helper, receiver, name, getter, setter, token);
680 667
681 String get plainNameForRead => name.name; 668 String get plainNameForRead => name.name;
682 669
683 bool get isThisPropertyAccessor => receiver is ThisExpression; 670 bool get isThisPropertyAccessor => receiver is ThisExpression;
684 671
685 Expression doInvocation(int offset, Arguments arguments) { 672 Expression doInvocation(int offset, Arguments arguments) {
686 return buildMethodInvocation( 673 return buildMethodInvocation(receiver, name, arguments, offset);
687 helper.astFactory, receiver, name, arguments, offset);
688 } 674 }
689 675
690 toString() => "PropertyAccessor()"; 676 toString() => "PropertyAccessor()";
691 677
692 static FastaAccessor make( 678 static FastaAccessor make(
693 BuilderHelper helper, 679 BuilderHelper helper,
694 Token token, 680 Token token,
695 Expression receiver, 681 Expression receiver,
696 Name name, 682 Name name,
697 Member getter, 683 Member getter,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 setter = builderSetter.target; 720 setter = builderSetter.target;
735 } 721 }
736 } 722 }
737 return new StaticAccessor(helper, token, getter, setter); 723 return new StaticAccessor(helper, token, getter, setter);
738 } 724 }
739 725
740 String get plainNameForRead => (readTarget ?? writeTarget).name.name; 726 String get plainNameForRead => (readTarget ?? writeTarget).name.name;
741 727
742 Expression doInvocation(int offset, Arguments arguments) { 728 Expression doInvocation(int offset, Arguments arguments) {
743 if (readTarget == null || isFieldOrGetter(readTarget)) { 729 if (readTarget == null || isFieldOrGetter(readTarget)) {
744 return buildMethodInvocation(helper.astFactory, buildSimpleRead(), 730 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
745 callName, arguments, offset + (readTarget?.name?.name?.length ?? 0)); 731 offset + (readTarget?.name?.name?.length ?? 0));
746 } else { 732 } else {
747 return helper.buildStaticInvocation(readTarget, arguments) 733 return helper.buildStaticInvocation(readTarget, arguments)
748 ..fileOffset = offset; 734 ..fileOffset = offset;
749 } 735 }
750 } 736 }
751 737
752 toString() => "StaticAccessor()"; 738 toString() => "StaticAccessor()";
753 } 739 }
754 740
755 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor 741 class SuperPropertyAccessor extends kernel.SuperPropertyAccessor
756 with FastaAccessor { 742 with FastaAccessor {
757 SuperPropertyAccessor(BuilderHelper helper, Token token, Name name, 743 SuperPropertyAccessor(BuilderHelper helper, Token token, Name name,
758 Member getter, Member setter) 744 Member getter, Member setter)
759 : super(helper, name, getter, setter, token); 745 : super(helper, name, getter, setter, token);
760 746
761 String get plainNameForRead => name.name; 747 String get plainNameForRead => name.name;
762 748
763 Expression doInvocation(int offset, Arguments arguments) { 749 Expression doInvocation(int offset, Arguments arguments) {
764 if (getter == null || isFieldOrGetter(getter)) { 750 if (getter == null || isFieldOrGetter(getter)) {
765 return buildMethodInvocation( 751 return buildMethodInvocation(
766 helper.astFactory, buildSimpleRead(), callName, arguments, offset); 752 buildSimpleRead(), callName, arguments, offset);
767 } else { 753 } else {
768 return new DirectMethodInvocation(new ThisExpression(), getter, arguments) 754 return new DirectMethodInvocation(new ThisExpression(), getter, arguments)
769 ..fileOffset = offset; 755 ..fileOffset = offset;
770 } 756 }
771 } 757 }
772 758
773 toString() => "SuperPropertyAccessor()"; 759 toString() => "SuperPropertyAccessor()";
774 } 760 }
775 761
776 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { 762 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor {
777 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index, 763 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index,
778 Procedure getter, Procedure setter) 764 Procedure getter, Procedure setter)
779 : super(helper, index, getter, setter, token); 765 : super(helper, index, getter, setter, token);
780 766
781 String get plainNameForRead => "[]"; 767 String get plainNameForRead => "[]";
782 768
783 String get plainNameForWrite => "[]="; 769 String get plainNameForWrite => "[]=";
784 770
785 Expression doInvocation(int offset, Arguments arguments) { 771 Expression doInvocation(int offset, Arguments arguments) {
786 return buildMethodInvocation( 772 return buildMethodInvocation(
787 helper.astFactory, buildSimpleRead(), callName, arguments, offset); 773 buildSimpleRead(), callName, arguments, offset);
788 } 774 }
789 775
790 toString() => "ThisIndexAccessor()"; 776 toString() => "ThisIndexAccessor()";
791 } 777 }
792 778
793 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor { 779 class SuperIndexAccessor extends kernel.SuperIndexAccessor with FastaAccessor {
794 SuperIndexAccessor(BuilderHelper helper, Token token, Expression index, 780 SuperIndexAccessor(BuilderHelper helper, Token token, Expression index,
795 Member getter, Member setter) 781 Member getter, Member setter)
796 : super(helper, index, getter, setter, token); 782 : super(helper, index, getter, setter, token);
797 783
798 String get plainNameForRead => "[]"; 784 String get plainNameForRead => "[]";
799 785
800 String get plainNameForWrite => "[]="; 786 String get plainNameForWrite => "[]=";
801 787
802 Expression doInvocation(int offset, Arguments arguments) { 788 Expression doInvocation(int offset, Arguments arguments) {
803 return buildMethodInvocation( 789 return buildMethodInvocation(
804 helper.astFactory, buildSimpleRead(), callName, arguments, offset); 790 buildSimpleRead(), callName, arguments, offset);
805 } 791 }
806 792
807 toString() => "SuperIndexAccessor()"; 793 toString() => "SuperIndexAccessor()";
808 } 794 }
809 795
810 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor 796 class ThisPropertyAccessor extends kernel.ThisPropertyAccessor
811 with FastaAccessor { 797 with FastaAccessor {
812 final BuilderHelper helper; 798 final BuilderHelper helper;
813 799
814 ThisPropertyAccessor( 800 ThisPropertyAccessor(
815 this.helper, Token token, Name name, Member getter, Member setter) 801 this.helper, Token token, Name name, Member getter, Member setter)
816 : super(helper, name, getter, setter, token); 802 : super(helper, name, getter, setter, token);
817 803
818 String get plainNameForRead => name.name; 804 String get plainNameForRead => name.name;
819 805
820 bool get isThisPropertyAccessor => true; 806 bool get isThisPropertyAccessor => true;
821 807
822 Expression doInvocation(int offset, Arguments arguments) { 808 Expression doInvocation(int offset, Arguments arguments) {
823 Member interfaceTarget = getter; 809 Member interfaceTarget = getter;
824 if (interfaceTarget is Field) { 810 if (interfaceTarget is Field) {
825 // TODO(ahe): In strong mode we should probably rewrite this to 811 // TODO(ahe): In strong mode we should probably rewrite this to
826 // `this.name.call(arguments)`. 812 // `this.name.call(arguments)`.
827 interfaceTarget = null; 813 interfaceTarget = null;
828 } 814 }
829 return buildMethodInvocation( 815 return buildMethodInvocation(new ThisExpression(), name, arguments, offset);
830 helper.astFactory, new ThisExpression(), name, arguments, offset);
831 } 816 }
832 817
833 toString() => "ThisPropertyAccessor()"; 818 toString() => "ThisPropertyAccessor()";
834 } 819 }
835 820
836 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor 821 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor
837 with FastaAccessor { 822 with FastaAccessor {
838 final BuilderHelper helper; 823 final BuilderHelper helper;
839 824
840 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, 825 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver,
(...skipping 13 matching lines...) Expand all
854 VariableAccessor( 839 VariableAccessor(
855 BuilderHelper helper, Token token, VariableDeclaration variable, 840 BuilderHelper helper, Token token, VariableDeclaration variable,
856 [DartType promotedType]) 841 [DartType promotedType])
857 : super(helper, variable, promotedType, token); 842 : super(helper, variable, promotedType, token);
858 843
859 String get plainNameForRead => variable.name; 844 String get plainNameForRead => variable.name;
860 845
861 Expression doInvocation(int offset, Arguments arguments) { 846 Expression doInvocation(int offset, Arguments arguments) {
862 // Normally the offset is at the start of the token, but in this case, 847 // Normally the offset is at the start of the token, but in this case,
863 // because we insert a '.call', we want it at the end instead. 848 // because we insert a '.call', we want it at the end instead.
864 return buildMethodInvocation(helper.astFactory, buildSimpleRead(), callName, 849 return buildMethodInvocation(buildSimpleRead(), callName, arguments,
865 arguments, offset + (variable.name?.length ?? 0)); 850 offset + (variable.name?.length ?? 0));
866 } 851 }
867 852
868 toString() => "VariableAccessor()"; 853 toString() => "VariableAccessor()";
869 } 854 }
870 855
871 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor { 856 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor {
872 final String plainNameForRead; 857 final String plainNameForRead;
873 858
874 ReadOnlyAccessor(BuilderHelper helper, Expression expression, 859 ReadOnlyAccessor(BuilderHelper helper, Expression expression,
875 this.plainNameForRead, Token token) 860 this.plainNameForRead, Token token)
876 : super(helper, expression, token); 861 : super(helper, expression, token);
877 862
878 Expression doInvocation(int offset, Arguments arguments) { 863 Expression doInvocation(int offset, Arguments arguments) {
879 return buildMethodInvocation( 864 return buildMethodInvocation(
880 helper.astFactory, buildSimpleRead(), callName, arguments, offset); 865 buildSimpleRead(), callName, arguments, offset);
881 } 866 }
882 } 867 }
883 868
884 class ParenthesizedExpression extends ReadOnlyAccessor { 869 class ParenthesizedExpression extends ReadOnlyAccessor {
885 ParenthesizedExpression( 870 ParenthesizedExpression(
886 BuilderHelper helper, Expression expression, Token token) 871 BuilderHelper helper, Expression expression, Token token)
887 : super(helper, expression, "<a parenthesized expression>", token); 872 : super(helper, expression, "<a parenthesized expression>", token);
888 873
889 Expression makeInvalidWrite(Expression value) { 874 Expression makeInvalidWrite(Expression value) {
890 return helper.buildCompileTimeError( 875 return helper.buildCompileTimeError(
(...skipping 23 matching lines...) Expand all
914 return helper.throwNoSuchMethodError( 899 return helper.throwNoSuchMethodError(
915 plainNameForRead, arguments, offset ?? offsetForToken(this.token), 900 plainNameForRead, arguments, offset ?? offsetForToken(this.token),
916 isGetter: isGetter, isSetter: isSetter); 901 isGetter: isGetter, isSetter: isSetter);
917 } 902 }
918 } 903 }
919 904
920 bool isFieldOrGetter(Member member) { 905 bool isFieldOrGetter(Member member) {
921 return member is Field || (member is Procedure && member.isGetter); 906 return member is Field || (member is Procedure && member.isGetter);
922 } 907 }
923 908
924 Expression buildMethodInvocation(AstFactory astFactory, Expression receiver, 909 Expression buildMethodInvocation(
925 Name name, Arguments arguments, int offset, 910 Expression receiver, Name name, Arguments arguments, int offset,
926 {bool isNullAware: false}) { 911 {bool isNullAware: false}) {
927 if (isNullAware) { 912 if (isNullAware) {
928 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); 913 VariableDeclaration variable = new VariableDeclaration.forValue(receiver);
929 return makeLet( 914 return makeLet(
930 variable, 915 variable,
931 new ConditionalExpression( 916 new ConditionalExpression(
932 buildIsNull(astFactory, new VariableGet(variable)), 917 buildIsNull(new VariableGet(variable)),
933 new NullLiteral(), 918 new NullLiteral(),
934 astFactory.methodInvocation( 919 new KernelMethodInvocation(
935 new VariableGet(variable), name, arguments) 920 new VariableGet(variable), name, arguments)
936 ..fileOffset = offset, 921 ..fileOffset = offset,
937 const DynamicType())); 922 const DynamicType()));
938 } else { 923 } else {
939 return astFactory.methodInvocation(receiver, name, arguments) 924 return new KernelMethodInvocation(receiver, name, arguments)
940 ..fileOffset = offset; 925 ..fileOffset = offset;
941 } 926 }
942 } 927 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698