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

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

Issue 2765943002: Improve handling of complicated getters and setters. (Closed)
Patch Set: Update status files. Created 3 years, 9 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.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
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
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
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
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 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/builder/class_builder.dart ('k') | pkg/front_end/lib/src/fasta/kernel/builder_accessors.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698