blob: c9370f16f5008d3d3503583dd53eb65eea86a8de [file] [log] [blame]
// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
part of 'serialization.dart';
/// Visitor that ascribes an index to all [ir.TreeNode]s that potentially
/// needed for serialization and deserialization.
class _TreeNodeIndexerVisitor extends ir.Visitor<void> {
int _currentIndex = 0;
final Map<int, ir.TreeNode> _indexToNodeMap;
final Map<ir.TreeNode, int> _nodeToIndexMap;
_TreeNodeIndexerVisitor(this._indexToNodeMap, this._nodeToIndexMap);
void registerNode(ir.TreeNode node) {
_indexToNodeMap[_currentIndex] = node;
_nodeToIndexMap[node] = _currentIndex;
_currentIndex++;
}
@override
void defaultTreeNode(ir.TreeNode node) {
node.visitChildren(this);
}
@override
void visitFunctionExpression(ir.FunctionExpression node) {
registerNode(node);
super.visitFunctionExpression(node);
}
@override
void visitFunctionDeclaration(ir.FunctionDeclaration node) {
registerNode(node);
super.visitFunctionDeclaration(node);
}
@override
void visitBlock(ir.Block node) {
registerNode(node);
super.visitBlock(node);
}
@override
void visitVariableDeclaration(ir.VariableDeclaration node) {
if (node.parent is! ir.FunctionDeclaration) {
registerNode(node);
}
super.visitVariableDeclaration(node);
}
@override
void visitSwitchStatement(ir.SwitchStatement node) {
registerNode(node);
super.visitSwitchStatement(node);
}
@override
void visitForStatement(ir.ForStatement node) {
registerNode(node);
super.visitForStatement(node);
}
@override
void visitForInStatement(ir.ForInStatement node) {
registerNode(node);
super.visitForInStatement(node);
}
@override
void visitWhileStatement(ir.WhileStatement node) {
registerNode(node);
super.visitWhileStatement(node);
}
@override
void visitDoStatement(ir.DoStatement node) {
registerNode(node);
super.visitDoStatement(node);
}
@override
void visitBreakStatement(ir.BreakStatement node) {
registerNode(node);
super.visitBreakStatement(node);
}
@override
void visitListLiteral(ir.ListLiteral node) {
registerNode(node);
super.visitListLiteral(node);
}
@override
void visitMapLiteral(ir.MapLiteral node) {
registerNode(node);
super.visitMapLiteral(node);
}
@override
void visitPropertyGet(ir.PropertyGet node) {
registerNode(node);
super.visitPropertyGet(node);
}
@override
void visitPropertySet(ir.PropertySet node) {
registerNode(node);
super.visitPropertySet(node);
}
@override
void visitMethodInvocation(ir.MethodInvocation node) {
registerNode(node);
super.visitMethodInvocation(node);
}
@override
void visitDirectPropertyGet(ir.DirectPropertyGet node) {
registerNode(node);
super.visitDirectPropertyGet(node);
}
@override
void visitDirectPropertySet(ir.DirectPropertySet node) {
registerNode(node);
super.visitDirectPropertySet(node);
}
@override
void visitDirectMethodInvocation(ir.DirectMethodInvocation node) {
registerNode(node);
super.visitDirectMethodInvocation(node);
}
@override
void visitStaticInvocation(ir.StaticInvocation node) {
registerNode(node);
super.visitStaticInvocation(node);
}
}