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

Side by Side Diff: frog/leg/resolver.dart

Issue 9283014: Implement field parameter for generative constructors. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 8 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, 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 interface TreeElements { 5 interface TreeElements {
6 Element operator[](Node node); 6 Element operator[](Node node);
7 } 7 }
8 8
9 class TreeElementMapping implements TreeElements { 9 class TreeElementMapping implements TreeElements {
10 Map<Node, Element> map; 10 Map<Node, Element> map;
(...skipping 618 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 visit(node.condition); 629 visit(node.condition);
630 visitIn(node.body, new BlockScope(context)); 630 visitIn(node.body, new BlockScope(context));
631 } 631 }
632 632
633 visitParenthesizedExpression(ParenthesizedExpression node) { 633 visitParenthesizedExpression(ParenthesizedExpression node) {
634 visit(node.expression); 634 visit(node.expression);
635 } 635 }
636 636
637 visitNewExpression(NewExpression node) { 637 visitNewExpression(NewExpression node) {
638 if (node.isConst()) cancel(node, 'const expressions are not implemented'); 638 if (node.isConst()) cancel(node, 'const expressions are not implemented');
639 if (node.send.selector.asTypeAnnotation() === null) {
640 cancel(
641 node, 'named constructors with type parameters are not implemented');
ahe 2012/01/24 14:28:44 parameters -> arguments.
ngeoffray 2012/01/24 14:57:04 Done.
642 }
639 643
640 visit(node.send.argumentsNode); 644 visit(node.send.argumentsNode);
641 645
642 SourceString constructorName; 646 SourceString constructorName;
643 Node typeName = node.send.selector.asTypeAnnotation().typeName; 647 Node typeName = node.send.selector.asTypeAnnotation().typeName;
644 if (typeName.asSend() !== null) { 648 if (typeName.asSend() !== null) {
645 Identifier receiver = typeName.asSend().receiver.asIdentifier(); 649 Identifier receiver = typeName.asSend().receiver.asIdentifier();
646 Identifier selector = typeName.asSend().selector.asIdentifier(); 650 Identifier selector = typeName.asSend().selector.asIdentifier();
647 SourceString className = receiver.source; 651 SourceString className = receiver.source;
648 SourceString name = selector.source; 652 SourceString name = selector.source;
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
850 } 854 }
851 resolver.visit(node.arguments.head); 855 resolver.visit(node.arguments.head);
852 return visit(node.selector); 856 return visit(node.selector);
853 } 857 }
854 858
855 SourceString visitIdentifier(Identifier node) => node.source; 859 SourceString visitIdentifier(Identifier node) => node.source;
856 860
857 visitNodeList(NodeList node) { 861 visitNodeList(NodeList node) {
858 for (Link<Node> link = node.nodes; !link.isEmpty(); link = link.tail) { 862 for (Link<Node> link = node.nodes; !link.isEmpty(); link = link.tail) {
859 SourceString name = visit(link.head); 863 SourceString name = visit(link.head);
860 VariableElement element = new VariableElement( 864 if (name !== null) {
861 name, variables, kind, resolver.context.element, node: link.head); 865 VariableElement element = new VariableElement(
862 resolver.defineElement(link.head, element); 866 name, variables, kind, resolver.context.element, node: link.head);
867 resolver.defineElement(link.head, element);
868 }
863 } 869 }
864 } 870 }
865 871
866 visit(Node node) => node.accept(this); 872 visit(Node node) => node.accept(this);
867 873
874 visitSend(Node node) {
875 // The lhs is a property access. The parser never accepts this
876 // code right now if it's not a field initializer.
877 if (kind !== ElementKind.PARAMETER || node.receiver === null) {
878 resolver.cancel('internal error');
879 }
880
881 if (resolver.element.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) {
882 resolver.error(node, MessageKind.FIELD_PARAMETER_NOT_ALLOWED, []);
883 } else if (node.receiver.asIdentifier() === null ||
884 !node.receiver.asIdentifier().isThis()) {
885 resolver.error(node, MessageKind.INVALID_FIELD_PARAMETER, []);
886 } else {
887 SourceString name = node.selector.asIdentifier().source;
888 Element field = resolver.currentClass.lookupLocalMember(name);
889 if (field.kind !== ElementKind.FIELD) {
890 resolver.error(node, MessageKind.NOT_A_FIELD, [name]);
891 } else if (!field.isInstanceMember()) {
892 resolver.error(node, MessageKind.NOT_INSTANCE_FIELD, [name]);
893 } else {
894 resolver.defineElement(node, field);
ahe 2012/01/24 14:28:44 I think we should define the element regardlessly.
ngeoffray 2012/01/24 14:57:04 Defining it.
895 }
896 }
897 return null;
898 }
899
868 visitNode(Node node) { 900 visitNode(Node node) {
869 resolver.cancel(node, 'not implemented'); 901 resolver.cancel(node, 'not implemented');
870 } 902 }
871 } 903 }
872 904
873 // TODO(ahe): Frog cannot handle generic types. 905 // TODO(ahe): Frog cannot handle generic types.
874 class ParametersVisitor extends AbstractVisitor/*<Element>*/ { 906 class ParametersVisitor extends AbstractVisitor/*<Element>*/ {
875 ResolverVisitor resolver; 907 ResolverVisitor resolver;
876 LinkBuilder<Element> elements; 908 LinkBuilder<Element> elements;
877 ParametersVisitor(this.resolver) : elements = new LinkBuilder<Element>(); 909 ParametersVisitor(this.resolver) : elements = new LinkBuilder<Element>();
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 class TopScope extends Scope { 999 class TopScope extends Scope {
968 Universe universe; 1000 Universe universe;
969 1001
970 TopScope(Universe this.universe) : super(null, null); 1002 TopScope(Universe this.universe) : super(null, null);
971 Element lookup(SourceString name) => universe.find(name); 1003 Element lookup(SourceString name) => universe.find(name);
972 1004
973 Element add(Element element) { 1005 Element add(Element element) {
974 throw "Cannot add an element in the top scope"; 1006 throw "Cannot add an element in the top scope";
975 } 1007 }
976 } 1008 }
OLDNEW
« no previous file with comments | « frog/leg/lib/core.dart ('k') | frog/leg/ssa/builder.dart » ('j') | frog/leg/warnings.dart » ('J')

Powered by Google App Engine
This is Rietveld 408576698