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 export 'package:kernel/frontend/accessors.dart' show wrapInvalid; | 7 export 'package:kernel/frontend/accessors.dart' show wrapInvalid; |
8 | 8 |
9 import 'package:kernel/frontend/accessors.dart' | 9 import 'package:kernel/frontend/accessors.dart' |
10 show Accessor, buildIsNull, makeLet; | 10 show Accessor, buildIsNull, makeLet; |
11 | 11 |
12 import 'package:kernel/ast.dart'; | 12 import 'package:kernel/ast.dart'; |
13 | 13 |
14 import '../errors.dart' show internalError; | 14 import '../errors.dart' show internalError; |
15 | 15 |
16 import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder; | 16 import '../builder/scope.dart' show AccessErrorBuilder, ProblemBuilder; |
17 | 17 |
18 import 'package:kernel/frontend/accessors.dart' as kernel | 18 import 'package:kernel/frontend/accessors.dart' as kernel |
19 show | 19 show |
20 IndexAccessor, | 20 IndexAccessor, |
21 NullAwarePropertyAccessor, | 21 NullAwarePropertyAccessor, |
22 PropertyAccessor, | 22 PropertyAccessor, |
| 23 ReadOnlyAccessor, |
23 StaticAccessor, | 24 StaticAccessor, |
24 SuperIndexAccessor, | 25 SuperIndexAccessor, |
25 SuperPropertyAccessor, | 26 SuperPropertyAccessor, |
26 ThisIndexAccessor, | 27 ThisIndexAccessor, |
27 ThisPropertyAccessor, | 28 ThisPropertyAccessor, |
28 VariableAccessor; | 29 VariableAccessor; |
29 | 30 |
30 import 'kernel_builder.dart' | 31 import 'kernel_builder.dart' |
31 show Builder, KernelClassBuilder, PrefixBuilder, TypeDeclarationBuilder; | 32 show Builder, KernelClassBuilder, PrefixBuilder, TypeDeclarationBuilder; |
32 | 33 |
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
768 Expression doInvocation(int offset, Arguments arguments) { | 769 Expression doInvocation(int offset, Arguments arguments) { |
769 // Normally the offset is at the start of the token, but in this case, | 770 // Normally the offset is at the start of the token, but in this case, |
770 // because we insert a '.call', we want it at the end instead. | 771 // because we insert a '.call', we want it at the end instead. |
771 return buildMethodInvocation(buildSimpleRead(), callName, arguments, | 772 return buildMethodInvocation(buildSimpleRead(), callName, arguments, |
772 offset + (variable.name?.length ?? 0)); | 773 offset + (variable.name?.length ?? 0)); |
773 } | 774 } |
774 | 775 |
775 toString() => "VariableAccessor()"; | 776 toString() => "VariableAccessor()"; |
776 } | 777 } |
777 | 778 |
| 779 class ReadOnlyAccessor extends kernel.ReadOnlyAccessor with FastaAccessor { |
| 780 final BuilderHelper helper; |
| 781 |
| 782 final String plainNameForRead; |
| 783 |
| 784 ReadOnlyAccessor( |
| 785 this.helper, Expression expression, this.plainNameForRead, int offset) |
| 786 : super(expression, offset); |
| 787 |
| 788 Expression doInvocation(int offset, Arguments arguments) { |
| 789 return buildMethodInvocation( |
| 790 buildSimpleRead(), callName, arguments, offset); |
| 791 } |
| 792 } |
| 793 |
| 794 class ParenthesizedExpression extends ReadOnlyAccessor { |
| 795 ParenthesizedExpression( |
| 796 BuilderHelper helper, Expression expression, int offset) |
| 797 : super(helper, expression, "<a parenthesized expression>", offset); |
| 798 |
| 799 Expression makeInvalidWrite(Expression value) { |
| 800 return helper.buildCompileTimeError( |
| 801 "Can't assign to a parenthesized expression.", offset); |
| 802 } |
| 803 } |
| 804 |
778 bool isFieldOrGetter(Member member) { | 805 bool isFieldOrGetter(Member member) { |
779 return member is Field || (member is Procedure && member.isGetter); | 806 return member is Field || (member is Procedure && member.isGetter); |
780 } | 807 } |
781 | 808 |
782 Expression buildMethodInvocation( | 809 Expression buildMethodInvocation( |
783 Expression receiver, Name name, Arguments arguments, int offset, | 810 Expression receiver, Name name, Arguments arguments, int offset, |
784 {bool isNullAware: false}) { | 811 {bool isNullAware: false}) { |
785 if (isNullAware) { | 812 if (isNullAware) { |
786 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); | 813 VariableDeclaration variable = new VariableDeclaration.forValue(receiver); |
787 return makeLet( | 814 return makeLet( |
788 variable, | 815 variable, |
789 new ConditionalExpression( | 816 new ConditionalExpression( |
790 buildIsNull(new VariableGet(variable)), | 817 buildIsNull(new VariableGet(variable)), |
791 new NullLiteral(), | 818 new NullLiteral(), |
792 new MethodInvocation(new VariableGet(variable), name, arguments) | 819 new MethodInvocation(new VariableGet(variable), name, arguments) |
793 ..fileOffset = offset, | 820 ..fileOffset = offset, |
794 const DynamicType())); | 821 const DynamicType())); |
795 } else { | 822 } else { |
796 return new MethodInvocation(receiver, name, arguments)..fileOffset = offset; | 823 return new MethodInvocation(receiver, name, arguments)..fileOffset = offset; |
797 } | 824 } |
798 } | 825 } |
OLD | NEW |