| 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 |