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 part of resolution; | 5 part of resolution; |
6 | 6 |
7 abstract class TreeElements { | 7 abstract class TreeElements { |
8 AnalyzableElement get analyzedElement; | 8 AnalyzableElement get analyzedElement; |
9 Iterable<Node> get superUses; | 9 Iterable<Node> get superUses; |
10 | 10 |
11 /// Iterables of the dependencies that this [TreeElement] records of | 11 /// Iterables of the dependencies that this [TreeElement] records of |
12 /// [analyzedElement]. | 12 /// [analyzedElement]. |
13 Iterable<Element> get allElements; | 13 Iterable<Element> get allElements; |
14 void forEachConstantNode(f(Node n, ConstantExpression c)); | 14 void forEachConstantNode(f(Node n, ConstantExpression c)); |
15 | 15 |
16 /// A set of additional dependencies. See [registerDependency] below. | 16 /// A set of additional dependencies. See [registerDependency] below. |
17 Iterable<Element> get otherDependencies; | 17 Iterable<Element> get otherDependencies; |
18 | 18 |
19 Element operator[](Node node); | 19 Element operator[](Node node); |
20 | 20 |
21 SendStructure getSendStructure(Send send); | 21 SendStructure getSendStructure(Send send); |
22 | 22 |
23 // TODO(johnniwinther): Investigate whether [Node] could be a [Send]. | 23 // TODO(johnniwinther): Investigate whether [Node] could be a [Send]. |
24 Selector getSelector(Node node); | 24 Selector getSelector(Node node); |
25 Selector getGetterSelectorInComplexSendSet(SendSet node); | 25 Selector getGetterSelectorInComplexSendSet(SendSet node); |
26 Selector getOperatorSelectorInComplexSendSet(SendSet node); | 26 Selector getOperatorSelectorInComplexSendSet(SendSet node); |
27 DartType getType(Node node); | 27 DartType getType(Node node); |
28 TypeMask getTypeMask(Node node); | 28 void setSelector(Node node, Selector selector); |
29 TypeMask getGetterTypeMaskInComplexSendSet(SendSet node); | 29 void setGetterSelectorInComplexSendSet(SendSet node, Selector selector); |
30 TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node); | 30 void setOperatorSelectorInComplexSendSet(SendSet node, Selector selector); |
31 void setTypeMask(Node node, TypeMask mask); | |
32 void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask); | |
33 void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask); | |
34 | 31 |
35 /// Returns the for-in loop variable for [node]. | 32 /// Returns the for-in loop variable for [node]. |
36 Element getForInVariable(ForIn node); | 33 Element getForInVariable(ForIn node); |
37 Selector getIteratorSelector(ForIn node); | 34 Selector getIteratorSelector(ForIn node); |
38 Selector getMoveNextSelector(ForIn node); | 35 Selector getMoveNextSelector(ForIn node); |
39 Selector getCurrentSelector(ForIn node); | 36 Selector getCurrentSelector(ForIn node); |
40 TypeMask getIteratorTypeMask(ForIn node); | 37 void setIteratorSelector(ForIn node, Selector selector); |
41 TypeMask getMoveNextTypeMask(ForIn node); | 38 void setMoveNextSelector(ForIn node, Selector selector); |
42 TypeMask getCurrentTypeMask(ForIn node); | 39 void setCurrentSelector(ForIn node, Selector selector); |
43 void setIteratorTypeMask(ForIn node, TypeMask mask); | |
44 void setMoveNextTypeMask(ForIn node, TypeMask mask); | |
45 void setCurrentTypeMask(ForIn node, TypeMask mask); | |
46 void setConstant(Node node, ConstantExpression constant); | 40 void setConstant(Node node, ConstantExpression constant); |
47 ConstantExpression getConstant(Node node); | 41 ConstantExpression getConstant(Node node); |
48 bool isAssert(Send send); | 42 bool isAssert(Send send); |
49 | 43 |
50 /// Returns the [FunctionElement] defined by [node]. | 44 /// Returns the [FunctionElement] defined by [node]. |
51 FunctionElement getFunctionDefinition(FunctionExpression node); | 45 FunctionElement getFunctionDefinition(FunctionExpression node); |
52 | 46 |
53 /// Returns target constructor for the redirecting factory body [node]. | 47 /// Returns target constructor for the redirecting factory body [node]. |
54 ConstructorElement getRedirectingTargetConstructor( | 48 ConstructorElement getRedirectingTargetConstructor( |
55 RedirectingFactoryBody node); | 49 RedirectingFactoryBody node); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 /// Returns the jump target of the [node]. | 82 /// Returns the jump target of the [node]. |
89 JumpTarget getTargetOf(GotoStatement node); | 83 JumpTarget getTargetOf(GotoStatement node); |
90 | 84 |
91 /// Returns the label defined by [node]. | 85 /// Returns the label defined by [node]. |
92 LabelDefinition getLabelDefinition(Label node); | 86 LabelDefinition getLabelDefinition(Label node); |
93 | 87 |
94 /// Returns the label that [node] targets. | 88 /// Returns the label that [node] targets. |
95 LabelDefinition getTargetLabel(GotoStatement node); | 89 LabelDefinition getTargetLabel(GotoStatement node); |
96 } | 90 } |
97 | 91 |
98 class TreeElementMapping extends TreeElements { | 92 class TreeElementMapping implements TreeElements { |
99 final AnalyzableElement analyzedElement; | 93 final AnalyzableElement analyzedElement; |
100 Map<Spannable, Selector> _selectors; | 94 Map<Spannable, Selector> _selectors; |
101 Map<Spannable, TypeMask> _typeMasks; | |
102 Map<Node, DartType> _types; | 95 Map<Node, DartType> _types; |
103 Setlet<Node> _superUses; | 96 Setlet<Node> _superUses; |
104 Setlet<Element> _otherDependencies; | 97 Setlet<Element> _otherDependencies; |
105 Map<Node, ConstantExpression> _constants; | 98 Map<Node, ConstantExpression> _constants; |
106 Map<VariableElement, List<Node>> _potentiallyMutated; | 99 Map<VariableElement, List<Node>> _potentiallyMutated; |
107 Map<Node, Map<VariableElement, List<Node>>> _potentiallyMutatedIn; | 100 Map<Node, Map<VariableElement, List<Node>>> _potentiallyMutatedIn; |
108 Map<VariableElement, List<Node>> _potentiallyMutatedInClosure; | 101 Map<VariableElement, List<Node>> _potentiallyMutatedInClosure; |
109 Map<Node, Map<VariableElement, List<Node>>> _accessedByClosureIn; | 102 Map<Node, Map<VariableElement, List<Node>>> _accessedByClosureIn; |
110 Setlet<Element> _elements; | 103 Setlet<Element> _elements; |
111 Setlet<Send> _asserts; | 104 Setlet<Send> _asserts; |
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 if (_targetLabels == null) { | 434 if (_targetLabels == null) { |
442 _targetLabels = new Maplet<GotoStatement, LabelDefinition>(); | 435 _targetLabels = new Maplet<GotoStatement, LabelDefinition>(); |
443 } | 436 } |
444 _targetLabels[node] = label; | 437 _targetLabels[node] = label; |
445 } | 438 } |
446 | 439 |
447 LabelDefinition getTargetLabel(GotoStatement node) { | 440 LabelDefinition getTargetLabel(GotoStatement node) { |
448 assert(node.target != null); | 441 assert(node.target != null); |
449 return _targetLabels != null ? _targetLabels[node] : null; | 442 return _targetLabels != null ? _targetLabels[node] : null; |
450 } | 443 } |
451 | |
452 TypeMask _getTypeMask(Spannable node) { | |
453 return _typeMasks != null ? _typeMasks[node] : null; | |
454 } | |
455 | |
456 void _setTypeMask(Spannable node, TypeMask mask) { | |
457 if (_typeMasks == null) { | |
458 _typeMasks = new Maplet<Spannable, TypeMask>(); | |
459 } | |
460 _typeMasks[node] = mask; | |
461 } | |
462 | |
463 void setTypeMask(Node node, TypeMask mask) { | |
464 _setTypeMask(node, mask); | |
465 } | |
466 | |
467 TypeMask getTypeMask(Node node) => _getTypeMask(node); | |
468 | |
469 void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | |
470 _setTypeMask(node.selector, mask); | |
471 } | |
472 | |
473 TypeMask getGetterTypeMaskInComplexSendSet(SendSet node) { | |
474 return _getTypeMask(node.selector); | |
475 } | |
476 | |
477 void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) { | |
478 _setTypeMask(node.assignmentOperator, mask); | |
479 } | |
480 | |
481 TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node) { | |
482 return _getTypeMask(node.assignmentOperator); | |
483 } | |
484 | |
485 // The following methods set selectors on the "for in" node. Since | |
486 // we're using three selectors, we need to use children of the node, | |
487 // and we arbitrarily choose which ones. | |
488 | |
489 void setIteratorTypeMask(ForIn node, TypeMask mask) { | |
490 _setTypeMask(node, mask); | |
491 } | |
492 | |
493 TypeMask getIteratorTypeMask(ForIn node) { | |
494 return _getTypeMask(node); | |
495 } | |
496 | |
497 void setMoveNextTypeMask(ForIn node, TypeMask mask) { | |
498 _setTypeMask(node.forToken, mask); | |
499 } | |
500 | |
501 TypeMask getMoveNextTypeMask(ForIn node) { | |
502 return _getTypeMask(node.forToken); | |
503 } | |
504 | |
505 void setCurrentTypeMask(ForIn node, TypeMask mask) { | |
506 _setTypeMask(node.inToken, mask); | |
507 } | |
508 | |
509 TypeMask getCurrentTypeMask(ForIn node) { | |
510 return _getTypeMask(node.inToken); | |
511 } | |
512 } | 444 } |
513 | 445 |
514 TreeElements _ensureTreeElements(AnalyzableElementX element) { | 446 TreeElements _ensureTreeElements(AnalyzableElementX element) { |
515 if (element._treeElements == null) { | 447 if (element._treeElements == null) { |
516 element._treeElements = new TreeElementMapping(element); | 448 element._treeElements = new TreeElementMapping(element); |
517 } | 449 } |
518 return element._treeElements; | 450 return element._treeElements; |
519 } | 451 } |
520 | 452 |
521 abstract class AnalyzableElementX implements AnalyzableElement { | 453 abstract class AnalyzableElementX implements AnalyzableElement { |
522 TreeElements _treeElements; | 454 TreeElements _treeElements; |
523 | 455 |
524 bool get hasTreeElements => _treeElements != null; | 456 bool get hasTreeElements => _treeElements != null; |
525 | 457 |
526 TreeElements get treeElements { | 458 TreeElements get treeElements { |
527 assert(invariant(this, _treeElements !=null, | 459 assert(invariant(this, _treeElements !=null, |
528 message: "TreeElements have not been computed for $this.")); | 460 message: "TreeElements have not been computed for $this.")); |
529 return _treeElements; | 461 return _treeElements; |
530 } | 462 } |
531 | 463 |
532 void reuseElement() { | 464 void reuseElement() { |
533 _treeElements = null; | 465 _treeElements = null; |
534 } | 466 } |
535 } | 467 } |
OLD | NEW |