Chromium Code Reviews| 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 |