OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 part of resolution; | 5 part of resolution; |
6 | 6 |
7 abstract class TreeElements { | 7 abstract class TreeElements { |
8 Element get currentElement; | 8 Element get currentElement; |
9 Set<Node> get superUses; | 9 Set<Node> get superUses; |
10 | 10 |
11 /// A set of additional dependencies. See [registerDependency] below. | 11 /// A set of additional dependencies. See [registerDependency] below. |
12 Set<Element> get otherDependencies; | 12 Set<Element> get otherDependencies; |
13 | 13 |
14 Element operator[](Node node); | 14 Element operator[](Node node); |
15 Selector getSelector(Send send); | 15 Selector getSelector(Send send); |
16 Selector getGetterSelectorInComplexSendSet(SendSet node); | 16 Selector getGetterSelectorInComplexSendSet(SendSet node); |
17 Selector getOperatorSelectorInComplexSendSet(SendSet node); | 17 Selector getOperatorSelectorInComplexSendSet(SendSet node); |
18 DartType getType(Node node); | 18 DartType getType(Node node); |
19 void setSelector(Node node, Selector selector); | 19 void setSelector(Node node, Selector selector); |
20 void setGetterSelectorInComplexSendSet(SendSet node, Selector selector); | 20 void setGetterSelectorInComplexSendSet(SendSet node, Selector selector); |
21 void setOperatorSelectorInComplexSendSet(SendSet node, Selector selector); | 21 void setOperatorSelectorInComplexSendSet(SendSet node, Selector selector); |
22 Selector getIteratorSelector(ForIn node); | 22 Selector getIteratorSelector(ForIn node); |
23 Selector getMoveNextSelector(ForIn node); | 23 Selector getMoveNextSelector(ForIn node); |
24 Selector getCurrentSelector(ForIn node); | 24 Selector getCurrentSelector(ForIn node); |
25 Selector setIteratorSelector(ForIn node, Selector selector); | 25 Selector setIteratorSelector(ForIn node, Selector selector); |
26 Selector setMoveNextSelector(ForIn node, Selector selector); | 26 Selector setMoveNextSelector(ForIn node, Selector selector); |
27 Selector setCurrentSelector(ForIn node, Selector selector); | 27 Selector setCurrentSelector(ForIn node, Selector selector); |
28 | 28 |
| 29 /** |
| 30 * Returns [:true:] if [node] is a type literal. |
| 31 * |
| 32 * Resolution marks this by setting the type on the node to be the |
| 33 * [:Type:] type. |
| 34 */ |
| 35 bool isTypeLiteral(Send node); |
| 36 |
29 /// Register additional dependencies required by [currentElement]. | 37 /// Register additional dependencies required by [currentElement]. |
30 /// For example, elements that are used by a backend. | 38 /// For example, elements that are used by a backend. |
31 void registerDependency(Element element); | 39 void registerDependency(Element element); |
32 } | 40 } |
33 | 41 |
34 class TreeElementMapping implements TreeElements { | 42 class TreeElementMapping implements TreeElements { |
35 final Element currentElement; | 43 final Element currentElement; |
36 final Map<Spannable, Selector> selectors = | 44 final Map<Spannable, Selector> selectors = |
37 new LinkedHashMap<Spannable, Selector>(); | 45 new LinkedHashMap<Spannable, Selector>(); |
38 final Map<Node, DartType> types = new LinkedHashMap<Node, DartType>(); | 46 final Map<Node, DartType> types = new LinkedHashMap<Node, DartType>(); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 } | 133 } |
126 | 134 |
127 Selector setCurrentSelector(ForIn node, Selector selector) { | 135 Selector setCurrentSelector(ForIn node, Selector selector) { |
128 selectors[node.inToken] = selector; | 136 selectors[node.inToken] = selector; |
129 } | 137 } |
130 | 138 |
131 Selector getCurrentSelector(ForIn node) { | 139 Selector getCurrentSelector(ForIn node) { |
132 return selectors[node.inToken]; | 140 return selectors[node.inToken]; |
133 } | 141 } |
134 | 142 |
| 143 bool isTypeLiteral(Send node) { |
| 144 return getType(node) != null; |
| 145 } |
| 146 |
135 void registerDependency(Element element) { | 147 void registerDependency(Element element) { |
136 otherDependencies.add(element.implementation); | 148 otherDependencies.add(element.implementation); |
137 } | 149 } |
138 | 150 |
139 String toString() => 'TreeElementMapping($currentElement)'; | 151 String toString() => 'TreeElementMapping($currentElement)'; |
140 } | 152 } |
141 | 153 |
142 class ResolverTask extends CompilerTask { | 154 class ResolverTask extends CompilerTask { |
143 ResolverTask(Compiler compiler) : super(compiler); | 155 ResolverTask(Compiler compiler) : super(compiler); |
144 | 156 |
(...skipping 2158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2303 MessageKind.CANNOT_RESOLVE_GETTER); | 2315 MessageKind.CANNOT_RESOLVE_GETTER); |
2304 } | 2316 } |
2305 } else if (target.isTypeVariable()) { | 2317 } else if (target.isTypeVariable()) { |
2306 ClassElement cls = target.getEnclosingClass(); | 2318 ClassElement cls = target.getEnclosingClass(); |
2307 assert(enclosingElement.getEnclosingClass() == cls); | 2319 assert(enclosingElement.getEnclosingClass() == cls); |
2308 compiler.backend.registerClassUsingVariableExpression(cls); | 2320 compiler.backend.registerClassUsingVariableExpression(cls); |
2309 compiler.backend.registerTypeVariableExpression(mapping); | 2321 compiler.backend.registerTypeVariableExpression(mapping); |
2310 // Set the type of the node to [Type] to mark this send as a | 2322 // Set the type of the node to [Type] to mark this send as a |
2311 // type variable expression. | 2323 // type variable expression. |
2312 mapping.setType(node, compiler.typeClass.computeType(compiler)); | 2324 mapping.setType(node, compiler.typeClass.computeType(compiler)); |
2313 world.registerInstantiatedClass(compiler.typeClass, mapping); | 2325 world.registerTypeLiteral(target, mapping); |
2314 } else if (target.impliesType() && !sendIsMemberAccess) { | 2326 } else if (target.impliesType() && !sendIsMemberAccess) { |
2315 // Set the type of the node to [Type] to mark this send as a | 2327 // Set the type of the node to [Type] to mark this send as a |
2316 // type literal. | 2328 // type literal. |
2317 mapping.setType(node, compiler.typeClass.computeType(compiler)); | 2329 mapping.setType(node, compiler.typeClass.computeType(compiler)); |
2318 world.registerTypeLiteral(target, mapping); | 2330 world.registerTypeLiteral(target, mapping); |
2319 } | 2331 } |
2320 } | 2332 } |
2321 | 2333 |
2322 bool resolvedArguments = false; | 2334 bool resolvedArguments = false; |
2323 if (node.isOperator) { | 2335 if (node.isOperator) { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2467 | 2479 |
2468 // Make sure we include the + and - operators if we are using | 2480 // Make sure we include the + and - operators if we are using |
2469 // the ++ and -- ones. Also, if op= form is used, include op itself. | 2481 // the ++ and -- ones. Also, if op= form is used, include op itself. |
2470 void registerBinaryOperator(SourceString name) { | 2482 void registerBinaryOperator(SourceString name) { |
2471 Selector binop = new Selector.binaryOperator(name); | 2483 Selector binop = new Selector.binaryOperator(name); |
2472 world.registerDynamicInvocation(binop); | 2484 world.registerDynamicInvocation(binop); |
2473 mapping.setOperatorSelectorInComplexSendSet(node, binop); | 2485 mapping.setOperatorSelectorInComplexSendSet(node, binop); |
2474 } | 2486 } |
2475 if (identical(source, '++')) { | 2487 if (identical(source, '++')) { |
2476 registerBinaryOperator(const SourceString('+')); | 2488 registerBinaryOperator(const SourceString('+')); |
| 2489 world.registerInstantiatedClass(compiler.intClass, mapping); |
2477 } else if (identical(source, '--')) { | 2490 } else if (identical(source, '--')) { |
2478 registerBinaryOperator(const SourceString('-')); | 2491 registerBinaryOperator(const SourceString('-')); |
| 2492 world.registerInstantiatedClass(compiler.intClass, mapping); |
2479 } else if (source.endsWith('=')) { | 2493 } else if (source.endsWith('=')) { |
2480 registerBinaryOperator(Elements.mapToUserOperator(operatorName)); | 2494 registerBinaryOperator(Elements.mapToUserOperator(operatorName)); |
2481 } | 2495 } |
2482 } | 2496 } |
2483 | 2497 |
2484 registerSend(selector, setter); | 2498 registerSend(selector, setter); |
2485 return useElement(node, setter); | 2499 return useElement(node, setter); |
2486 } | 2500 } |
2487 | 2501 |
2488 void registerSend(Selector selector, Element target) { | 2502 void registerSend(Selector selector, Element target) { |
(...skipping 1661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4150 return e; | 4164 return e; |
4151 } | 4165 } |
4152 | 4166 |
4153 /// Assumed to be called by [resolveRedirectingFactory]. | 4167 /// Assumed to be called by [resolveRedirectingFactory]. |
4154 Element visitReturn(Return node) { | 4168 Element visitReturn(Return node) { |
4155 Node expression = node.expression; | 4169 Node expression = node.expression; |
4156 return finishConstructorReference(visit(expression), | 4170 return finishConstructorReference(visit(expression), |
4157 expression, expression); | 4171 expression, expression); |
4158 } | 4172 } |
4159 } | 4173 } |
OLD | NEW |