| Index: pkg/compiler/lib/src/resolution/tree_elements.dart
|
| diff --git a/pkg/compiler/lib/src/resolution/tree_elements.dart b/pkg/compiler/lib/src/resolution/tree_elements.dart
|
| index 1d1ddce2c262aa9cbdc457011f8b948cb85fb09e..9c607454e647145dc0187a7440e018c73c302e36 100644
|
| --- a/pkg/compiler/lib/src/resolution/tree_elements.dart
|
| +++ b/pkg/compiler/lib/src/resolution/tree_elements.dart
|
| @@ -100,6 +100,9 @@ abstract class TreeElements {
|
|
|
| /// `true` if the [analyzedElement]'s source code contains a [TryStatement].
|
| bool get containsTryStatement;
|
| +
|
| + /// Returns native data stored with [node].
|
| + getNativeData(Node node);
|
| }
|
|
|
| class TreeElementMapping extends TreeElements {
|
| @@ -133,6 +136,9 @@ class TreeElementMapping extends TreeElements {
|
| /// Map from labeled goto statements to the labels they target.
|
| Map<GotoStatement, LabelDefinition> _targetLabels;
|
|
|
| + /// Map from nodes to native data.
|
| + Map<Node, dynamic> _nativeData;
|
| +
|
| final int hashCode = ++_hashCodeCounter;
|
| static int _hashCodeCounter = 0;
|
|
|
| @@ -156,8 +162,10 @@ class TreeElementMapping extends TreeElements {
|
| setTreeElement(node, element);
|
| }
|
|
|
| + @override
|
| operator [](Node node) => getTreeElement(node);
|
|
|
| + @override
|
| SendStructure getSendStructure(Send node) {
|
| if (_sendStructureMap == null) return null;
|
| return _sendStructureMap[node];
|
| @@ -170,6 +178,7 @@ class TreeElementMapping extends TreeElements {
|
| _sendStructureMap[node] = sendStructure;
|
| }
|
|
|
| + @override
|
| NewStructure getNewStructure(NewExpression node) {
|
| if (_newStructureMap == null) return null;
|
| return _newStructureMap[node];
|
| @@ -189,8 +198,10 @@ class TreeElementMapping extends TreeElements {
|
| _types[node] = type;
|
| }
|
|
|
| + @override
|
| DartType getType(Node node) => _types != null ? _types[node] : null;
|
|
|
| + @override
|
| Iterable<SourceSpan> get superUses {
|
| return _superUses != null ? _superUses : const <SourceSpan>[];
|
| }
|
| @@ -217,6 +228,7 @@ class TreeElementMapping extends TreeElements {
|
| _setSelector(node, selector);
|
| }
|
|
|
| + @override
|
| Selector getSelector(Node node) => _getSelector(node);
|
|
|
| int getSelectorCount() => _selectors == null ? 0 : _selectors.length;
|
| @@ -225,6 +237,7 @@ class TreeElementMapping extends TreeElements {
|
| _setSelector(node.selector, selector);
|
| }
|
|
|
| + @override
|
| Selector getGetterSelectorInComplexSendSet(SendSet node) {
|
| return _getSelector(node.selector);
|
| }
|
| @@ -233,14 +246,17 @@ class TreeElementMapping extends TreeElements {
|
| _setSelector(node.assignmentOperator, selector);
|
| }
|
|
|
| + @override
|
| Selector getOperatorSelectorInComplexSendSet(SendSet node) {
|
| return _getSelector(node.assignmentOperator);
|
| }
|
|
|
| + @override
|
| Element getForInVariable(ForIn node) {
|
| return this[node];
|
| }
|
|
|
| + @override
|
| void setConstant(Node node, ConstantExpression constant) {
|
| if (_constants == null) {
|
| _constants = new Maplet<Node, ConstantExpression>();
|
| @@ -248,18 +264,22 @@ class TreeElementMapping extends TreeElements {
|
| _constants[node] = constant;
|
| }
|
|
|
| + @override
|
| ConstantExpression getConstant(Node node) {
|
| return _constants != null ? _constants[node] : null;
|
| }
|
|
|
| + @override
|
| bool isTypeLiteral(Send node) {
|
| return getType(node) != null;
|
| }
|
|
|
| + @override
|
| DartType getTypeLiteralType(Send node) {
|
| return getType(node);
|
| }
|
|
|
| + @override
|
| List<Node> getPotentialMutations(VariableElement element) {
|
| if (_potentiallyMutated == null) return const <Node>[];
|
| List<Node> mutations = _potentiallyMutated[element];
|
| @@ -274,6 +294,7 @@ class TreeElementMapping extends TreeElements {
|
| _potentiallyMutated.putIfAbsent(element, () => <Node>[]).add(mutationNode);
|
| }
|
|
|
| + @override
|
| List<Node> getPotentialMutationsIn(Node node, VariableElement element) {
|
| if (_potentiallyMutatedIn == null) return const <Node>[];
|
| Map<VariableElement, List<Node>> mutationsIn = _potentiallyMutatedIn[node];
|
| @@ -295,6 +316,7 @@ class TreeElementMapping extends TreeElements {
|
| mutationMap.putIfAbsent(element, () => <Node>[]).add(mutationNode);
|
| }
|
|
|
| + @override
|
| List<Node> getPotentialMutationsInClosure(VariableElement element) {
|
| if (_potentiallyMutatedInClosure == null) return const <Node>[];
|
| List<Node> mutations = _potentiallyMutatedInClosure[element];
|
| @@ -312,6 +334,7 @@ class TreeElementMapping extends TreeElements {
|
| .add(mutationNode);
|
| }
|
|
|
| + @override
|
| List<Node> getAccessesByClosureIn(Node node, VariableElement element) {
|
| if (_accessedByClosureIn == null) return const <Node>[];
|
| Map<VariableElement, List<Node>> accessesIn = _accessedByClosureIn[node];
|
| @@ -334,16 +357,19 @@ class TreeElementMapping extends TreeElements {
|
|
|
| String toString() => 'TreeElementMapping($analyzedElement)';
|
|
|
| + @override
|
| void forEachConstantNode(f(Node n, ConstantExpression c)) {
|
| if (_constants != null) {
|
| _constants.forEach(f);
|
| }
|
| }
|
|
|
| + @override
|
| FunctionElement getFunctionDefinition(FunctionExpression node) {
|
| return this[node];
|
| }
|
|
|
| + @override
|
| ConstructorElement getRedirectingTargetConstructor(
|
| RedirectingFactoryBody node) {
|
| return this[node];
|
| @@ -365,6 +391,7 @@ class TreeElementMapping extends TreeElements {
|
| }
|
| }
|
|
|
| + @override
|
| JumpTarget getTargetDefinition(Node node) {
|
| return _definedTargets != null ? _definedTargets[node] : null;
|
| }
|
| @@ -376,6 +403,7 @@ class TreeElementMapping extends TreeElements {
|
| _usedTargets[node] = target;
|
| }
|
|
|
| + @override
|
| JumpTarget getTargetOf(GotoStatement node) {
|
| return _usedTargets != null ? _usedTargets[node] : null;
|
| }
|
| @@ -396,6 +424,7 @@ class TreeElementMapping extends TreeElements {
|
| }
|
| }
|
|
|
| + @override
|
| LabelDefinition getLabelDefinition(Label label) {
|
| return _definedLabels != null ? _definedLabels[label] : null;
|
| }
|
| @@ -408,6 +437,7 @@ class TreeElementMapping extends TreeElements {
|
| _targetLabels[node] = label;
|
| }
|
|
|
| + @override
|
| LabelDefinition getTargetLabel(GotoStatement node) {
|
| assert(node.target != null);
|
| return _targetLabels != null ? _targetLabels[node] : null;
|
| @@ -424,24 +454,30 @@ class TreeElementMapping extends TreeElements {
|
| _typeMasks[node] = mask;
|
| }
|
|
|
| + @override
|
| void setTypeMask(Node node, TypeMask mask) {
|
| _setTypeMask(node, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getTypeMask(Node node) => _getTypeMask(node);
|
|
|
| + @override
|
| void setGetterTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
|
| _setTypeMask(node.selector, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getGetterTypeMaskInComplexSendSet(SendSet node) {
|
| return _getTypeMask(node.selector);
|
| }
|
|
|
| + @override
|
| void setOperatorTypeMaskInComplexSendSet(SendSet node, TypeMask mask) {
|
| _setTypeMask(node.assignmentOperator, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getOperatorTypeMaskInComplexSendSet(SendSet node) {
|
| return _getTypeMask(node.assignmentOperator);
|
| }
|
| @@ -450,27 +486,45 @@ class TreeElementMapping extends TreeElements {
|
| // we're using three selectors, we need to use children of the node,
|
| // and we arbitrarily choose which ones.
|
|
|
| + @override
|
| void setIteratorTypeMask(ForIn node, TypeMask mask) {
|
| _setTypeMask(node, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getIteratorTypeMask(ForIn node) {
|
| return _getTypeMask(node);
|
| }
|
|
|
| + @override
|
| void setMoveNextTypeMask(ForIn node, TypeMask mask) {
|
| _setTypeMask(node.forToken, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getMoveNextTypeMask(ForIn node) {
|
| return _getTypeMask(node.forToken);
|
| }
|
|
|
| + @override
|
| void setCurrentTypeMask(ForIn node, TypeMask mask) {
|
| _setTypeMask(node.inToken, mask);
|
| }
|
|
|
| + @override
|
| TypeMask getCurrentTypeMask(ForIn node) {
|
| return _getTypeMask(node.inToken);
|
| }
|
| +
|
| + void registerNativeData(Node node, dynamic nativeData) {
|
| + if (_nativeData == null) {
|
| + _nativeData = <Node, dynamic>{};
|
| + }
|
| + _nativeData[node] = nativeData;
|
| + }
|
| +
|
| + @override
|
| + dynamic getNativeData(Node node) {
|
| + return _nativeData != null ? _nativeData[node] : null;
|
| + }
|
| }
|
|
|