OLD | NEW |
---|---|
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 dart2js.resolution.tree_elements; | 5 library dart2js.resolution.tree_elements; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../constants/expressions.dart'; | 8 import '../constants/expressions.dart'; |
9 import '../dart_types.dart'; | 9 import '../dart_types.dart'; |
10 import '../diagnostics/source_span.dart'; | 10 import '../diagnostics/source_span.dart'; |
11 import '../elements/elements.dart'; | 11 import '../elements/elements.dart'; |
12 import '../tree/tree.dart'; | 12 import '../tree/tree.dart'; |
13 import '../types/types.dart' show TypeMask; | |
Johnni Winther
2016/11/03 08:50:21
Nice!!
| |
14 import '../universe/selector.dart' show Selector; | 13 import '../universe/selector.dart' show Selector; |
15 import '../util/util.dart'; | 14 import '../util/util.dart'; |
16 import 'secret_tree_element.dart' show getTreeElement, setTreeElement; | 15 import 'secret_tree_element.dart' show getTreeElement, setTreeElement; |
17 import 'send_structure.dart'; | 16 import 'send_structure.dart'; |
18 | 17 |
19 abstract class TreeElements { | 18 abstract class TreeElements { |
20 AnalyzableElement get analyzedElement; | 19 AnalyzableElement get analyzedElement; |
21 Iterable<SourceSpan> get superUses; | 20 Iterable<SourceSpan> get superUses; |
22 | 21 |
23 void forEachConstantNode(f(Node n, ConstantExpression c)); | 22 void forEachConstantNode(f(Node n, ConstantExpression c)); |
24 | 23 |
25 Element operator [](Node node); | 24 Element operator [](Node node); |
26 Map<Node, DartType> get typesCache; | 25 Map<Node, DartType> get typesCache; |
27 | 26 |
28 /// Returns the [SendStructure] that describes the semantics of [node]. | 27 /// Returns the [SendStructure] that describes the semantics of [node]. |
29 SendStructure getSendStructure(Send node); | 28 SendStructure getSendStructure(Send node); |
30 | 29 |
31 /// Returns the [NewStructure] that describes the semantics of [node]. | 30 /// Returns the [NewStructure] that describes the semantics of [node]. |
32 NewStructure getNewStructure(NewExpression node); | 31 NewStructure getNewStructure(NewExpression node); |
33 | 32 |
34 // TODO(johnniwinther): Investigate whether [Node] could be a [Send]. | 33 // TODO(johnniwinther): Investigate whether [Node] could be a [Send]. |
35 Selector getSelector(Node node); | 34 Selector getSelector(Node node); |
36 Selector getGetterSelectorInComplexSendSet(SendSet node); | 35 Selector getGetterSelectorInComplexSendSet(SendSet node); |
37 Selector getOperatorSelectorInComplexSendSet(SendSet node); | 36 Selector getOperatorSelectorInComplexSendSet(SendSet node); |
38 DartType getType(Node node); | 37 DartType getType(Node node); |
39 TypeMask getTypeMask(Node node); | |
40 TypeMask getGetterTypeMaskInComplexSendSet(SendSet node); | |
41 TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node); | |
42 void setTypeMask(Node node, TypeMask mask); | |
43 void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask); | |
44 void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask); | |
45 | 38 |
46 /// Returns the for-in loop variable for [node]. | 39 /// Returns the for-in loop variable for [node]. |
47 Element getForInVariable(ForIn node); | 40 Element getForInVariable(ForIn node); |
48 TypeMask getIteratorTypeMask(ForIn node); | |
49 TypeMask getMoveNextTypeMask(ForIn node); | |
50 TypeMask getCurrentTypeMask(ForIn node); | |
51 void setIteratorTypeMask(ForIn node, TypeMask mask); | |
52 void setMoveNextTypeMask(ForIn node, TypeMask mask); | |
53 void setCurrentTypeMask(ForIn node, TypeMask mask); | |
54 void setConstant(Node node, ConstantExpression constant); | 41 void setConstant(Node node, ConstantExpression constant); |
55 ConstantExpression getConstant(Node node); | 42 ConstantExpression getConstant(Node node); |
56 | 43 |
57 /// Returns the [FunctionElement] defined by [node]. | 44 /// Returns the [FunctionElement] defined by [node]. |
58 FunctionElement getFunctionDefinition(FunctionExpression node); | 45 FunctionElement getFunctionDefinition(FunctionExpression node); |
59 | 46 |
60 /// Returns target constructor for the redirecting factory body [node]. | 47 /// Returns target constructor for the redirecting factory body [node]. |
61 ConstructorElement getRedirectingTargetConstructor( | 48 ConstructorElement getRedirectingTargetConstructor( |
62 RedirectingFactoryBody node); | 49 RedirectingFactoryBody node); |
63 | 50 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
100 /// `true` if the [analyzedElement]'s source code contains a [TryStatement]. | 87 /// `true` if the [analyzedElement]'s source code contains a [TryStatement]. |
101 bool get containsTryStatement; | 88 bool get containsTryStatement; |
102 | 89 |
103 /// Returns native data stored with [node]. | 90 /// Returns native data stored with [node]. |
104 getNativeData(Node node); | 91 getNativeData(Node node); |
105 } | 92 } |
106 | 93 |
107 class TreeElementMapping extends TreeElements { | 94 class TreeElementMapping extends TreeElements { |
108 final AnalyzableElement analyzedElement; | 95 final AnalyzableElement analyzedElement; |
109 Map<Spannable, Selector> _selectors; | 96 Map<Spannable, Selector> _selectors; |
110 Map<Spannable, TypeMask> _typeMasks; | |
111 Map<Node, DartType> _types; | 97 Map<Node, DartType> _types; |
112 | 98 |
113 Map<Node, DartType> _typesCache; | 99 Map<Node, DartType> _typesCache; |
114 Map<Node, DartType> get typesCache => _typesCache ??= <Node, DartType>{}; | 100 Map<Node, DartType> get typesCache => _typesCache ??= <Node, DartType>{}; |
115 | 101 |
116 Setlet<SourceSpan> _superUses; | 102 Setlet<SourceSpan> _superUses; |
117 Map<Node, ConstantExpression> _constants; | 103 Map<Node, ConstantExpression> _constants; |
118 Map<VariableElement, List<Node>> _potentiallyMutated; | 104 Map<VariableElement, List<Node>> _potentiallyMutated; |
119 Map<Node, Map<VariableElement, List<Node>>> _potentiallyMutatedIn; | 105 Map<Node, Map<VariableElement, List<Node>>> _potentiallyMutatedIn; |
120 Map<VariableElement, List<Node>> _potentiallyMutatedInClosure; | 106 Map<VariableElement, List<Node>> _potentiallyMutatedInClosure; |
(...skipping 314 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
435 } | 421 } |
436 _targetLabels[node] = label; | 422 _targetLabels[node] = label; |
437 } | 423 } |
438 | 424 |
439 @override | 425 @override |
440 LabelDefinition getTargetLabel(GotoStatement node) { | 426 LabelDefinition getTargetLabel(GotoStatement node) { |
441 assert(node.target != null); | 427 assert(node.target != null); |
442 return _targetLabels != null ? _targetLabels[node] : null; | 428 return _targetLabels != null ? _targetLabels[node] : null; |
443 } | 429 } |
444 | 430 |
445 TypeMask _getTypeMask(Spannable node) { | |
446 return _typeMasks != null ? _typeMasks[node] : null; | |
447 } | |
448 | |
449 void _setTypeMask(Spannable node, TypeMask mask) { | |
450 if (_typeMasks == null) { | |
451 _typeMasks = new Maplet<Spannable, TypeMask>(); | |
452 } | |
453 _typeMasks[node] = mask; | |
454 } | |
455 | |
456 @override | |
457 void setTypeMask(Node node, TypeMask mask) { | |
458 _setTypeMask(node, mask); | |
459 } | |
460 | |
461 @override | |
462 TypeMask getTypeMask(Node node) => _getTypeMask(node); | |
463 | |
464 @override | |
465 void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | |
466 _setTypeMask(node.selector, mask); | |
467 } | |
468 | |
469 @override | |
470 TypeMask getGetterTypeMaskInComplexSendSet(SendSet node) { | |
471 return _getTypeMask(node.selector); | |
472 } | |
473 | |
474 @override | |
475 void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | |
476 _setTypeMask(node.assignmentOperator, mask); | |
477 } | |
478 | |
479 @override | |
480 TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node) { | |
481 return _getTypeMask(node.assignmentOperator); | |
482 } | |
483 | |
484 // The following methods set selectors on the "for in" node. Since | |
485 // we're using three selectors, we need to use children of the node, | |
486 // and we arbitrarily choose which ones. | |
487 | |
488 @override | |
489 void setIteratorTypeMask(ForIn node, TypeMask mask) { | |
490 _setTypeMask(node, mask); | |
491 } | |
492 | |
493 @override | |
494 TypeMask getIteratorTypeMask(ForIn node) { | |
495 return _getTypeMask(node); | |
496 } | |
497 | |
498 @override | |
499 void setMoveNextTypeMask(ForIn node, TypeMask mask) { | |
500 _setTypeMask(node.forToken, mask); | |
501 } | |
502 | |
503 @override | |
504 TypeMask getMoveNextTypeMask(ForIn node) { | |
505 return _getTypeMask(node.forToken); | |
506 } | |
507 | |
508 @override | |
509 void setCurrentTypeMask(ForIn node, TypeMask mask) { | |
510 _setTypeMask(node.inToken, mask); | |
511 } | |
512 | |
513 @override | |
514 TypeMask getCurrentTypeMask(ForIn node) { | |
515 return _getTypeMask(node.inToken); | |
516 } | |
517 | |
518 void registerNativeData(Node node, dynamic nativeData) { | 431 void registerNativeData(Node node, dynamic nativeData) { |
519 if (_nativeData == null) { | 432 if (_nativeData == null) { |
520 _nativeData = <Node, dynamic>{}; | 433 _nativeData = <Node, dynamic>{}; |
521 } | 434 } |
522 _nativeData[node] = nativeData; | 435 _nativeData[node] = nativeData; |
523 } | 436 } |
524 | 437 |
525 @override | 438 @override |
526 dynamic getNativeData(Node node) { | 439 dynamic getNativeData(Node node) { |
527 return _nativeData != null ? _nativeData[node] : null; | 440 return _nativeData != null ? _nativeData[node] : null; |
528 } | 441 } |
529 } | 442 } |
OLD | NEW |