blob: 5a0672c16eab1633841cb5ad3c77abf7917c4e16 [file] [log] [blame]
// Copyright (c) 2013, 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.
// IrNodes are kept in a separate library to have precise control over their
// dependencies on other parts of the system.
library dart2js.ir_nodes;
import '../dart2jslib.dart' show Constant;
import 'ir_pickler.dart' show Pickler;
/**
* A pair of source offset and an identifier name. Identifier names are used in
* the Javascript backend to generate source maps.
*/
class PositionWithIdentifierName {
final int offset;
final String sourceName;
PositionWithIdentifierName(this.offset, this.sourceName);
}
abstract class IrNode {
static int hashCount = 0;
final int hashCode = hashCount = (hashCount + 1) & 0x3fffffff;
final /* int | PositionWithIdentifierName */ position;
const IrNode(this.position);
int get offset => (position is int) ? position : position.offset;
String get sourceName => (position is int) ? null : position.sourceName;
List<int> pickle() => new Pickler().pickle(this);
accept(IrNodesVisitor visitor);
}
class IrFunction extends IrNode {
final List<IrNode> statements;
final int endOffset;
final int namePosition;
IrFunction(position, this.endOffset, this.namePosition, this.statements)
: super(position);
accept(IrNodesVisitor visitor) => visitor.visitIrFunction(this);
}
class IrReturn extends IrNode {
final IrNode value;
IrReturn(position, this.value) : super(position);
accept(IrNodesVisitor visitor) => visitor.visitIrReturn(this);
}
class IrConstant extends IrNode {
final Constant value;
IrConstant(position, this.value) : super(position);
accept(IrNodesVisitor visitor) => visitor.visitIrConstant(this);
}
abstract class IrNodesVisitor<T> {
T visit(IrNode node) => node.accept(this);
void visitAll(List<IrNode> nodes) {
for (IrNode n in nodes) visit(n);
}
T visitNode(IrNode node);
T visitIrFunction(IrFunction node) => visitNode(node);
T visitIrReturn(IrReturn node) => visitNode(node);
T visitIrConstant(IrConstant node) => visitNode(node);
}