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.body_builder; | 5 library fasta.body_builder; |
6 | 6 |
7 import '../parser/parser.dart' show FormalParameterType, optional; | 7 import '../parser/parser.dart' show FormalParameterType, optional; |
8 | 8 |
9 import '../parser/error_kind.dart' show ErrorKind; | 9 import '../parser/error_kind.dart' show ErrorKind; |
10 | 10 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 return new TypeLiteral(type); | 190 return new TypeLiteral(type); |
191 } | 191 } |
192 } else if (node is TypeDeclarationBuilder) { | 192 } else if (node is TypeDeclarationBuilder) { |
193 return new TypeLiteral(node.buildTypesWithBuiltArguments(library, null)); | 193 return new TypeLiteral(node.buildTypesWithBuiltArguments(library, null)); |
194 } else if (node is KernelTypeBuilder) { | 194 } else if (node is KernelTypeBuilder) { |
195 return new TypeLiteral(node.build(library)); | 195 return new TypeLiteral(node.build(library)); |
196 } else if (node is Expression) { | 196 } else if (node is Expression) { |
197 return node; | 197 return node; |
198 } else if (node is PrefixBuilder) { | 198 } else if (node is PrefixBuilder) { |
199 return buildCompileTimeError("A library can't be used as an expression."); | 199 return buildCompileTimeError("A library can't be used as an expression."); |
| 200 } else if (node is ProblemBuilder) { |
| 201 return buildProblemExpression(node, -1); |
200 } else { | 202 } else { |
201 return internalError("Unhandled: ${node.runtimeType}"); | 203 return internalError("Unhandled: ${node.runtimeType}"); |
202 } | 204 } |
203 } | 205 } |
204 | 206 |
205 Expression toEffect(Object node) { | 207 Expression toEffect(Object node) { |
206 if (node is BuilderAccessor) return node.buildForEffect(); | 208 if (node is BuilderAccessor) return node.buildForEffect(); |
207 return toValue(node); | 209 return toValue(node); |
208 } | 210 } |
209 | 211 |
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 } | 713 } |
712 return null; | 714 return null; |
713 } | 715 } |
714 | 716 |
715 @override | 717 @override |
716 void beginExpression(Token token) { | 718 void beginExpression(Token token) { |
717 debugEvent("beginExpression"); | 719 debugEvent("beginExpression"); |
718 isFirstIdentifier = true; | 720 isFirstIdentifier = true; |
719 } | 721 } |
720 | 722 |
721 Builder computeSetter( | |
722 Builder builder, Scope scope, String name, int charOffset) { | |
723 if (builder.isSetter) return builder; | |
724 if (builder.isGetter) return scope.lookupSetter(name, charOffset, uri); | |
725 return builder.isField ? (builder.isFinal ? null : builder) : null; | |
726 } | |
727 | |
728 @override | 723 @override |
729 void handleIdentifier(Token token, IdentifierContext context) { | 724 void handleIdentifier(Token token, IdentifierContext context) { |
730 debugEvent("handleIdentifier"); | 725 debugEvent("handleIdentifier"); |
731 String name = token.lexeme; | 726 String name = token.lexeme; |
732 if (isFirstIdentifier) { | 727 if (isFirstIdentifier) { |
733 assert(!inInitializer || | 728 assert(!inInitializer || |
734 this.scope == enclosingScope || | 729 this.scope == enclosingScope || |
735 this.scope.parent == enclosingScope); | 730 this.scope.parent == enclosingScope); |
736 // This deals with this kind of initializer: `C(a) : a = a;` | 731 // This deals with this kind of initializer: `C(a) : a = a;` |
737 Scope scope = inInitializer ? enclosingScope : this.scope; | 732 Scope scope = inInitializer ? enclosingScope : this.scope; |
(...skipping 24 matching lines...) Expand all Loading... |
762 this, charOffset, new Name(name, library.library), null, null); | 757 this, charOffset, new Name(name, library.library), null, null); |
763 } else if (builder.isRegularMethod) { | 758 } else if (builder.isRegularMethod) { |
764 assert(builder.isStatic || builder.isTopLevel); | 759 assert(builder.isStatic || builder.isTopLevel); |
765 return new StaticAccessor(this, charOffset, builder.target, null); | 760 return new StaticAccessor(this, charOffset, builder.target, null); |
766 } else if (builder is PrefixBuilder) { | 761 } else if (builder is PrefixBuilder) { |
767 return builder; | 762 return builder; |
768 } else if (builder is MixedAccessor) { | 763 } else if (builder is MixedAccessor) { |
769 return new StaticAccessor( | 764 return new StaticAccessor( |
770 this, charOffset, builder.getter.target, builder.setter.target); | 765 this, charOffset, builder.getter.target, builder.setter.target); |
771 } else { | 766 } else { |
772 if (builder is AccessErrorBuilder) { | 767 if (builder.hasProblem && builder is! AccessErrorBuilder) return builder; |
773 AccessErrorBuilder error = builder; | 768 Builder setter; |
774 builder = error.builder; | 769 if (builder.isSetter) { |
| 770 setter = builder; |
| 771 } else if (builder.isGetter) { |
| 772 setter = scope.lookupSetter(name, charOffset, uri); |
| 773 } else if (builder.isField && !builder.isFinal) { |
| 774 setter = builder; |
775 } | 775 } |
776 if (builder.target == null) { | 776 return new StaticAccessor.fromBuilder(this, builder, charOffset, setter); |
777 return internalError("Unhandled: ${builder}"); | |
778 } | |
779 Member getter = builder.target.hasGetter ? builder.target : null; | |
780 Member setter = builder.target.hasSetter ? builder.target : null; | |
781 setter ??= computeSetter(builder, scope, name, charOffset)?.target; | |
782 return new StaticAccessor(this, charOffset, getter, setter); | |
783 } | 777 } |
784 } | 778 } |
785 | 779 |
786 @override | 780 @override |
787 void handleQualified(Token period) { | 781 void handleQualified(Token period) { |
788 debugEvent("Qualified"); | 782 debugEvent("Qualified"); |
789 Identifier name = pop(); | 783 Identifier name = pop(); |
790 var receiver = pop(); | 784 var receiver = pop(); |
791 push([receiver, name]); | 785 push([receiver, name]); |
792 } | 786 } |
(...skipping 1949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2742 } else if (node is PrefixBuilder) { | 2736 } else if (node is PrefixBuilder) { |
2743 return node.name; | 2737 return node.name; |
2744 } else if (node is ThisAccessor) { | 2738 } else if (node is ThisAccessor) { |
2745 return node.isSuper ? "super" : "this"; | 2739 return node.isSuper ? "super" : "this"; |
2746 } else if (node is BuilderAccessor) { | 2740 } else if (node is BuilderAccessor) { |
2747 return node.plainNameForRead; | 2741 return node.plainNameForRead; |
2748 } else { | 2742 } else { |
2749 return internalError("Unhandled: ${node.runtimeType}"); | 2743 return internalError("Unhandled: ${node.runtimeType}"); |
2750 } | 2744 } |
2751 } | 2745 } |
OLD | NEW |