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

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

Issue 9315028: Support default values for optional parameters. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 8 years, 10 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
« no previous file with comments | « dart/frog/leg/emitter.dart ('k') | dart/frog/leg/ssa/builder.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 Selector getSelector(Send send); 7 Selector getSelector(Send send);
8 } 8 }
9 9
10 class TreeElementMapping implements TreeElements { 10 class TreeElementMapping implements TreeElements {
(...skipping 24 matching lines...) Expand all
35 TreeElements resolve(Element element) { 35 TreeElements resolve(Element element) {
36 return measure(() { 36 return measure(() {
37 switch (element.kind) { 37 switch (element.kind) {
38 case ElementKind.GENERATIVE_CONSTRUCTOR: 38 case ElementKind.GENERATIVE_CONSTRUCTOR:
39 case ElementKind.FUNCTION: 39 case ElementKind.FUNCTION:
40 case ElementKind.GETTER: 40 case ElementKind.GETTER:
41 case ElementKind.SETTER: 41 case ElementKind.SETTER:
42 return resolveMethodElement(element); 42 return resolveMethodElement(element);
43 43
44 case ElementKind.FIELD: 44 case ElementKind.FIELD:
45 return resolveFieldElement(element); 45 case ElementKind.PARAMETER:
46 return resolveVariableElement(element);
46 47
47 default: 48 default:
48 compiler.unimplemented( 49 compiler.unimplemented(
49 "resolver", node: element.parseNode(compiler)); 50 "resolver", node: element.parseNode(compiler));
50 } 51 }
51 }); 52 });
52 } 53 }
53 54
54 TreeElements resolveMethodElement(FunctionElement element) { 55 TreeElements resolveMethodElement(FunctionElement element) {
55 FunctionExpression tree = element.parseNode(compiler); 56 FunctionExpression tree = element.parseNode(compiler);
(...skipping 12 matching lines...) Expand all
68 ClassElement classElement = toResolve.removeFirst(); 69 ClassElement classElement = toResolve.removeFirst();
69 if (!classElement.isResolved) { 70 if (!classElement.isResolved) {
70 classElement.resolve(compiler); 71 classElement.resolve(compiler);
71 } 72 }
72 newResolvedClasses = newResolvedClasses.prepend(classElement); 73 newResolvedClasses = newResolvedClasses.prepend(classElement);
73 } 74 }
74 checkClassHierarchy(newResolvedClasses); 75 checkClassHierarchy(newResolvedClasses);
75 return visitor.mapping; 76 return visitor.mapping;
76 } 77 }
77 78
78 TreeElements resolveFieldElement(Element element) { 79 TreeElements resolveVariableElement(Element element) {
79 Node tree = element.parseNode(compiler); 80 Node tree = element.parseNode(compiler);
80 ResolverVisitor visitor = new FullResolverVisitor(compiler, element); 81 ResolverVisitor visitor = new FullResolverVisitor(compiler, element);
81 if (tree is SendSet) { 82 if (tree is SendSet) {
82 SendSet send = tree; 83 SendSet send = tree;
83 visitor.visit(send.arguments.head); 84 visitor.visit(send.arguments.head);
84 } 85 }
85 return visitor.mapping; 86 return visitor.mapping;
86 } 87 }
87 88
88 Type resolveType(ClassElement element) { 89 Type resolveType(ClassElement element) {
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
339 : this.compiler = compiler, 340 : this.compiler = compiler,
340 this.mapping = new TreeElementMapping(), 341 this.mapping = new TreeElementMapping(),
341 this.enclosingElement = element, 342 this.enclosingElement = element,
342 inInstanceContext = element.isInstanceMember() 343 inInstanceContext = element.isInstanceMember()
343 || element.isGenerativeConstructor(), 344 || element.isGenerativeConstructor(),
344 this.context = element.isMember() 345 this.context = element.isMember()
345 ? new ClassScope(element.enclosingElement, compiler.universe) 346 ? new ClassScope(element.enclosingElement, compiler.universe)
346 : new TopScope(compiler.universe), 347 : new TopScope(compiler.universe),
347 this.currentClass = element.isMember() ? element.enclosingElement : null; 348 this.currentClass = element.isMember() ? element.enclosingElement : null;
348 349
350 ResolverVisitor.from(ResolverVisitor other)
351 : this.compiler = other.compiler,
352 this.mapping = other.mapping,
353 this.enclosingElement = other.enclosingElement,
354 this.inInstanceContext = other.inInstanceContext,
355 this.context = other.context,
356 this.currentClass = other.currentClass;
357
349 void error(Node node, MessageKind kind, [arguments = const []]) { 358 void error(Node node, MessageKind kind, [arguments = const []]) {
350 ResolutionError error = new ResolutionError(kind, arguments); 359 ResolutionError error = new ResolutionError(kind, arguments);
351 compiler.reportError(node, error); 360 compiler.reportError(node, error);
352 } 361 }
353 362
354 void warning(Node node, MessageKind kind, [arguments = const []]) { 363 void warning(Node node, MessageKind kind, [arguments = const []]) {
355 ResolutionWarning warning = new ResolutionWarning(kind, arguments); 364 ResolutionWarning warning = new ResolutionWarning(kind, arguments);
356 compiler.reportWarning(node, warning); 365 compiler.reportWarning(node, warning);
357 } 366 }
358 367
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
468 visitNode(Node node) { 477 visitNode(Node node) {
469 cancel(node, 'not implemented'); 478 cancel(node, 'not implemented');
470 } 479 }
471 } 480 }
472 481
473 class FullResolverVisitor extends ResolverVisitor { 482 class FullResolverVisitor extends ResolverVisitor {
474 483
475 FullResolverVisitor(Compiler compiler, Element element) 484 FullResolverVisitor(Compiler compiler, Element element)
476 : super(compiler, element); 485 : super(compiler, element);
477 486
487 FullResolverVisitor.from(ResolverVisitor other) : super.from(other);
488
478 Element visitClassNode(ClassNode node) { 489 Element visitClassNode(ClassNode node) {
479 cancel(node, "shouldn't be called"); 490 cancel(node, "shouldn't be called");
480 } 491 }
481 492
482 visitIn(Node node, Scope scope) { 493 visitIn(Node node, Scope scope) {
483 context = scope; 494 context = scope;
484 Element element = visit(node); 495 Element element = visit(node);
485 context = context.parent; 496 context = context.parent;
486 return element; 497 return element;
487 } 498 }
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
1027 } 1038 }
1028 1039
1029 Element visitIdentifier(Identifier node) { 1040 Element visitIdentifier(Identifier node) {
1030 Element variables = new VariableListElement.node(currentDefinitions, 1041 Element variables = new VariableListElement.node(currentDefinitions,
1031 ElementKind.VARIABLE_LIST, enclosingElement); 1042 ElementKind.VARIABLE_LIST, enclosingElement);
1032 return new VariableElement(node.source, variables, 1043 return new VariableElement(node.source, variables,
1033 ElementKind.PARAMETER, enclosingElement, node: node); 1044 ElementKind.PARAMETER, enclosingElement, node: node);
1034 } 1045 }
1035 1046
1036 Element visitSend(Send node) { 1047 Element visitSend(Send node) {
1037 if (node.receiver === null) {
1038 cancel(node, 'internal error: no receiver on a parameter send');
1039 }
1040 Element element; 1048 Element element;
1041 if (node.receiver.asIdentifier() === null || 1049 if (node.receiver.asIdentifier() === null ||
1042 !node.receiver.asIdentifier().isThis()) { 1050 !node.receiver.asIdentifier().isThis()) {
1043 error(node, MessageKind.INVALID_PARAMETER, []); 1051 error(node, MessageKind.INVALID_PARAMETER, []);
1044 } else if (enclosingElement.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) { 1052 } else if (enclosingElement.kind !== ElementKind.GENERATIVE_CONSTRUCTOR) {
1045 error(node, MessageKind.FIELD_PARAMETER_NOT_ALLOWED, []); 1053 error(node, MessageKind.FIELD_PARAMETER_NOT_ALLOWED, []);
1046 } else { 1054 } else {
1047 if (node.selector.asIdentifier() == null) { 1055 if (node.selector.asIdentifier() == null) {
1048 cancel(node, 1056 cancel(node,
1049 'internal error: unimplemented receiver on parameter send'); 1057 'internal error: unimplemented receiver on parameter send');
1050 } 1058 }
1051 SourceString name = node.selector.asIdentifier().source; 1059 SourceString name = node.selector.asIdentifier().source;
1052 element = currentClass.lookupLocalMember(name); 1060 element = currentClass.lookupLocalMember(name);
1053 if (element.kind !== ElementKind.FIELD) { 1061 if (element.kind !== ElementKind.FIELD) {
1054 error(node, MessageKind.NOT_A_FIELD, [name]); 1062 error(node, MessageKind.NOT_A_FIELD, [name]);
1055 } else if (!element.isInstanceMember()) { 1063 } else if (!element.isInstanceMember()) {
1056 error(node, MessageKind.NOT_INSTANCE_FIELD, [name]); 1064 error(node, MessageKind.NOT_INSTANCE_FIELD, [name]);
1057 } 1065 }
1058 } 1066 }
1067 // TODO(ngeoffray): it's not right to put the field element in
1068 // the parameters element. Create another element instead.
1069 return element;
1070 }
1071
1072 Element visitSendSet(SendSet node) {
1073 Element element;
1074 if (node.receiver != null) {
1075 // TODO(ngeoffray): it's not right to put the field element in
1076 // the parameters element. Create another element instead.
1077 element = visitSend(node);
1078 } else if (node.selector.asIdentifier() != null) {
1079 Element variables = new VariableListElement.node(currentDefinitions,
1080 ElementKind.VARIABLE_LIST, enclosingElement);
1081 element = new VariableElement(node.selector.asIdentifier().source,
1082 variables, ElementKind.PARAMETER, enclosingElement, node: node);
1083 }
1084 // Visit the value. The compile time constant handler will
1085 // make sure it's a compile time constant.
1086 new FullResolverVisitor.from(this).visit(node.arguments.head);
1087 compiler.enqueue(new WorkItem.toCompile(element));
1059 return element; 1088 return element;
1060 } 1089 }
1061 1090
1062 Element visit(Node node) { 1091 Element visit(Node node) {
1063 if (node == null) return null; 1092 if (node == null) return null;
1064 return node.accept(this); 1093 return node.accept(this);
1065 } 1094 }
1066 1095
1067 Element visitNode(Node node) { 1096 Element visitNode(Node node) {
1068 cancel(node, 'not implemented'); 1097 cancel(node, 'not implemented');
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 class TopScope extends Scope { 1154 class TopScope extends Scope {
1126 Universe universe; 1155 Universe universe;
1127 1156
1128 TopScope(Universe this.universe) : super(null, null); 1157 TopScope(Universe this.universe) : super(null, null);
1129 Element lookup(SourceString name) => universe.find(name); 1158 Element lookup(SourceString name) => universe.find(name);
1130 1159
1131 Element add(Element element) { 1160 Element add(Element element) {
1132 throw "Cannot add an element in the top scope"; 1161 throw "Cannot add an element in the top scope";
1133 } 1162 }
1134 } 1163 }
OLDNEW
« no previous file with comments | « dart/frog/leg/emitter.dart ('k') | dart/frog/leg/ssa/builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698