OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |