OLD | NEW |
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 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' | 7 import 'package:front_end/src/fasta/kernel/kernel_shadow_ast.dart' |
8 show | 8 show |
9 KernelArguments, | 9 KernelArguments, |
10 KernelComplexAssignment, | 10 KernelComplexAssignment, |
11 KernelIndexAssign, | 11 KernelIndexAssign, |
| 12 KernelPropertyAssign, |
12 KernelStaticAssignment, | 13 KernelStaticAssignment, |
13 KernelThisExpression, | 14 KernelThisExpression, |
14 KernelVariableAssignment; | 15 KernelVariableAssignment; |
15 | 16 |
16 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; | 17 import 'package:front_end/src/fasta/kernel/utils.dart' show offsetForToken; |
17 | 18 |
18 import 'package:front_end/src/scanner/token.dart' show Token; | 19 import 'package:front_end/src/scanner/token.dart' show Token; |
19 | 20 |
20 import 'frontend_accessors.dart' show Accessor; | 21 import 'frontend_accessors.dart' show Accessor; |
21 | 22 |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
668 if (receiver is ThisExpression) { | 669 if (receiver is ThisExpression) { |
669 return new ThisPropertyAccessor(helper, token, name, getter, setter); | 670 return new ThisPropertyAccessor(helper, token, name, getter, setter); |
670 } else { | 671 } else { |
671 return isNullAware | 672 return isNullAware |
672 ? new NullAwarePropertyAccessor( | 673 ? new NullAwarePropertyAccessor( |
673 helper, token, receiver, name, getter, setter, null) | 674 helper, token, receiver, name, getter, setter, null) |
674 : new PropertyAccessor.internal( | 675 : new PropertyAccessor.internal( |
675 helper, token, receiver, name, getter, setter); | 676 helper, token, receiver, name, getter, setter); |
676 } | 677 } |
677 } | 678 } |
| 679 |
| 680 @override |
| 681 KernelComplexAssignment startComplexAssignment(Expression rhs) => |
| 682 new KernelPropertyAssign(receiver, rhs); |
678 } | 683 } |
679 | 684 |
680 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor { | 685 class StaticAccessor extends kernel.StaticAccessor with FastaAccessor { |
681 StaticAccessor( | 686 StaticAccessor( |
682 BuilderHelper helper, Token token, Member readTarget, Member writeTarget) | 687 BuilderHelper helper, Token token, Member readTarget, Member writeTarget) |
683 : super(helper, readTarget, writeTarget, token) { | 688 : super(helper, readTarget, writeTarget, token) { |
684 assert(readTarget != null || writeTarget != null); | 689 assert(readTarget != null || writeTarget != null); |
685 } | 690 } |
686 | 691 |
687 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, | 692 factory StaticAccessor.fromBuilder(BuilderHelper helper, Builder builder, |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
765 | 770 |
766 Expression makeInvalidWrite(Expression value) { | 771 Expression makeInvalidWrite(Expression value) { |
767 return helper.invokeSuperNoSuchMethod( | 772 return helper.invokeSuperNoSuchMethod( |
768 plainNameForRead, | 773 plainNameForRead, |
769 new Arguments(<Expression>[value])..fileOffset = value.fileOffset, | 774 new Arguments(<Expression>[value])..fileOffset = value.fileOffset, |
770 offsetForToken(token), | 775 offsetForToken(token), |
771 isSetter: true); | 776 isSetter: true); |
772 } | 777 } |
773 | 778 |
774 toString() => "SuperPropertyAccessor()"; | 779 toString() => "SuperPropertyAccessor()"; |
| 780 |
| 781 @override |
| 782 KernelComplexAssignment startComplexAssignment(Expression rhs) => |
| 783 new KernelPropertyAssign(null, rhs, isSuper: true); |
775 } | 784 } |
776 | 785 |
777 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { | 786 class ThisIndexAccessor extends kernel.ThisIndexAccessor with FastaAccessor { |
778 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index, | 787 ThisIndexAccessor(BuilderHelper helper, Token token, Expression index, |
779 Procedure getter, Procedure setter) | 788 Procedure getter, Procedure setter) |
780 : super(helper, index, getter, setter, token); | 789 : super(helper, index, getter, setter, token); |
781 | 790 |
782 String get plainNameForRead => "[]"; | 791 String get plainNameForRead => "[]"; |
783 | 792 |
784 String get plainNameForWrite => "[]="; | 793 String get plainNameForWrite => "[]="; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
827 if (interfaceTarget is Field) { | 836 if (interfaceTarget is Field) { |
828 // TODO(ahe): In strong mode we should probably rewrite this to | 837 // TODO(ahe): In strong mode we should probably rewrite this to |
829 // `this.name.call(arguments)`. | 838 // `this.name.call(arguments)`. |
830 interfaceTarget = null; | 839 interfaceTarget = null; |
831 } | 840 } |
832 return helper.buildMethodInvocation( | 841 return helper.buildMethodInvocation( |
833 new KernelThisExpression(), name, arguments, offset); | 842 new KernelThisExpression(), name, arguments, offset); |
834 } | 843 } |
835 | 844 |
836 toString() => "ThisPropertyAccessor()"; | 845 toString() => "ThisPropertyAccessor()"; |
| 846 |
| 847 @override |
| 848 KernelComplexAssignment startComplexAssignment(Expression rhs) => |
| 849 new KernelPropertyAssign(null, rhs); |
837 } | 850 } |
838 | 851 |
839 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor | 852 class NullAwarePropertyAccessor extends kernel.NullAwarePropertyAccessor |
840 with FastaAccessor { | 853 with FastaAccessor { |
841 final BuilderHelper helper; | 854 final BuilderHelper helper; |
842 | 855 |
843 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, | 856 NullAwarePropertyAccessor(this.helper, Token token, Expression receiver, |
844 Name name, Member getter, Member setter, DartType type) | 857 Name name, Member getter, Member setter, DartType type) |
845 : super(helper, receiver, name, getter, setter, type, token); | 858 : super(helper, receiver, name, getter, setter, type, token); |
846 | 859 |
847 String get plainNameForRead => name.name; | 860 String get plainNameForRead => name.name; |
848 | 861 |
849 Expression doInvocation(int offset, Arguments arguments) { | 862 Expression doInvocation(int offset, Arguments arguments) { |
850 return internalError("Not implemented yet."); | 863 return internalError("Not implemented yet."); |
851 } | 864 } |
852 | 865 |
853 toString() => "NullAwarePropertyAccessor()"; | 866 toString() => "NullAwarePropertyAccessor()"; |
| 867 |
| 868 @override |
| 869 KernelComplexAssignment startComplexAssignment(Expression rhs) => |
| 870 new KernelPropertyAssign(receiverExpression, rhs); |
854 } | 871 } |
855 | 872 |
856 int adjustForImplicitCall(String name, int offset) { | 873 int adjustForImplicitCall(String name, int offset) { |
857 // Normally the offset is at the start of the token, but in this case, | 874 // Normally the offset is at the start of the token, but in this case, |
858 // because we insert a '.call', we want it at the end instead. | 875 // because we insert a '.call', we want it at the end instead. |
859 return offset + (name?.length ?? 0); | 876 return offset + (name?.length ?? 0); |
860 } | 877 } |
861 | 878 |
862 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor { | 879 class VariableAccessor extends kernel.VariableAccessor with FastaAccessor { |
863 VariableAccessor( | 880 VariableAccessor( |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 offset ??= offsetForToken(this.token); | 1033 offset ??= offsetForToken(this.token); |
1017 return helper.throwNoSuchMethodError(new NullLiteral()..fileOffset = offset, | 1034 return helper.throwNoSuchMethodError(new NullLiteral()..fileOffset = offset, |
1018 plainNameForRead, arguments, offset, | 1035 plainNameForRead, arguments, offset, |
1019 isGetter: isGetter, isSetter: isSetter); | 1036 isGetter: isGetter, isSetter: isSetter); |
1020 } | 1037 } |
1021 } | 1038 } |
1022 | 1039 |
1023 bool isFieldOrGetter(Member member) { | 1040 bool isFieldOrGetter(Member member) { |
1024 return member is Field || (member is Procedure && member.isGetter); | 1041 return member is Field || (member is Procedure && member.isGetter); |
1025 } | 1042 } |
OLD | NEW |