blob: 45ecc5cb0852d50daa9577a87fc5490a4fa45aa3 [file] [log] [blame]
import { Syntax } from './syntax';
export type ArgumentListElement = Expression | SpreadElement;
export type ArrayExpressionElement = Expression | SpreadElement | null;
export type ArrayPatternElement = AssignmentPattern | BindingIdentifier | BindingPattern | RestElement | null;
export type BindingPattern = ArrayPattern | ObjectPattern;
export type BindingIdentifier = Identifier;
export type Declaration = AsyncFunctionDeclaration | ClassDeclaration | ExportDeclaration | FunctionDeclaration | ImportDeclaration | VariableDeclaration;
export type ExportableDefaultDeclaration = BindingIdentifier | BindingPattern | ClassDeclaration | Expression | FunctionDeclaration;
export type ExportableNamedDeclaration = AsyncFunctionDeclaration | ClassDeclaration | FunctionDeclaration | VariableDeclaration;
export type ExportDeclaration = ExportAllDeclaration | ExportDefaultDeclaration | ExportNamedDeclaration;
export type Expression = ArrayExpression | ArrowFunctionExpression | AssignmentExpression | AsyncArrowFunctionExpression | AsyncFunctionExpression |
AwaitExpression | BinaryExpression | CallExpression | ClassExpression | ComputedMemberExpression |
ConditionalExpression | Identifier | FunctionExpression | Literal | NewExpression | ObjectExpression |
RegexLiteral | SequenceExpression | StaticMemberExpression | TaggedTemplateExpression |
ThisExpression | UnaryExpression | UpdateExpression | YieldExpression;
export type FunctionParameter = AssignmentPattern | BindingIdentifier | BindingPattern;
export type ImportDeclarationSpecifier = ImportDefaultSpecifier | ImportNamespaceSpecifier | ImportSpecifier;
export type ObjectExpressionProperty = Property | SpreadElement;
export type ObjectPatternProperty = Property | RestElement;
export type Statement = AsyncFunctionDeclaration | BreakStatement | ContinueStatement | DebuggerStatement | DoWhileStatement |
EmptyStatement | ExpressionStatement | Directive | ForStatement | ForInStatement | ForOfStatement |
FunctionDeclaration | IfStatement | ReturnStatement | SwitchStatement | ThrowStatement |
TryStatement | VariableDeclaration | WhileStatement | WithStatement;
export type PropertyKey = Identifier | Literal;
export type PropertyValue = AssignmentPattern | AsyncFunctionExpression | BindingIdentifier | BindingPattern | FunctionExpression;
export type StatementListItem = Declaration | Statement;
/* tslint:disable:max-classes-per-file */
export class ArrayExpression {
readonly type: string;
readonly elements: ArrayExpressionElement[];
constructor(elements: ArrayExpressionElement[]) {
this.type = Syntax.ArrayExpression;
this.elements = elements;
}
}
export class ArrayPattern {
readonly type: string;
readonly elements: ArrayPatternElement[];
constructor(elements: ArrayPatternElement[]) {
this.type = Syntax.ArrayPattern;
this.elements = elements;
}
}
export class ArrowFunctionExpression {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement | Expression;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(params: FunctionParameter[], body: BlockStatement | Expression, expression: boolean) {
this.type = Syntax.ArrowFunctionExpression;
this.id = null;
this.params = params;
this.body = body;
this.generator = false;
this.expression = expression;
this.async = false;
}
}
export class AssignmentExpression {
readonly type: string;
readonly operator: string;
readonly left: Expression;
readonly right: Expression;
constructor(operator: string, left: Expression, right: Expression) {
this.type = Syntax.AssignmentExpression;
this.operator = operator;
this.left = left;
this.right = right;
}
}
export class AssignmentPattern {
readonly type: string;
readonly left: BindingIdentifier | BindingPattern;
readonly right: Expression;
constructor(left: BindingIdentifier | BindingPattern, right: Expression) {
this.type = Syntax.AssignmentPattern;
this.left = left;
this.right = right;
}
}
export class AsyncArrowFunctionExpression {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement | Expression;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(params: FunctionParameter[], body: BlockStatement | Expression, expression: boolean) {
this.type = Syntax.ArrowFunctionExpression;
this.id = null;
this.params = params;
this.body = body;
this.generator = false;
this.expression = expression;
this.async = true;
}
}
export class AsyncFunctionDeclaration {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(id: Identifier | null, params: FunctionParameter[], body: BlockStatement) {
this.type = Syntax.FunctionDeclaration;
this.id = id;
this.params = params;
this.body = body;
this.generator = false;
this.expression = false;
this.async = true;
}
}
export class AsyncFunctionExpression {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(id: Identifier | null, params: FunctionParameter[], body: BlockStatement) {
this.type = Syntax.FunctionExpression;
this.id = id;
this.params = params;
this.body = body;
this.generator = false;
this.expression = false;
this.async = true;
}
}
export class AwaitExpression {
readonly type: string;
readonly argument: Expression;
constructor(argument: Expression) {
this.type = Syntax.AwaitExpression;
this.argument = argument;
}
}
export class BinaryExpression {
readonly type: string;
readonly operator: string;
readonly left: Expression;
readonly right: Expression;
constructor(operator: string, left: Expression, right: Expression) {
const logical = (operator === '||' || operator === '&&');
this.type = logical ? Syntax.LogicalExpression : Syntax.BinaryExpression;
this.operator = operator;
this.left = left;
this.right = right;
}
}
export class BlockStatement {
readonly type: string;
readonly body: Statement[];
constructor(body) {
this.type = Syntax.BlockStatement;
this.body = body;
}
}
export class BreakStatement {
readonly type: string;
readonly label: Identifier | null;
constructor(label: Identifier | null) {
this.type = Syntax.BreakStatement;
this.label = label;
}
}
export class CallExpression {
readonly type: string;
readonly callee: Expression | Import;
readonly arguments: ArgumentListElement[];
constructor(callee: Expression | Import, args: ArgumentListElement[]) {
this.type = Syntax.CallExpression;
this.callee = callee;
this.arguments = args;
}
}
export class CatchClause {
readonly type: string;
readonly param: BindingIdentifier | BindingPattern;
readonly body: BlockStatement;
constructor(param: BindingIdentifier | BindingPattern, body: BlockStatement) {
this.type = Syntax.CatchClause;
this.param = param;
this.body = body;
}
}
export class ClassBody {
readonly type: string;
readonly body: Property[];
constructor(body: Property[]) {
this.type = Syntax.ClassBody;
this.body = body;
}
}
export class ClassDeclaration {
readonly type: string;
readonly id: Identifier | null;
readonly superClass: Identifier | null;
readonly body: ClassBody;
constructor(id: Identifier | null, superClass: Identifier | null, body: ClassBody) {
this.type = Syntax.ClassDeclaration;
this.id = id;
this.superClass = superClass;
this.body = body;
}
}
export class ClassExpression {
readonly type: string;
readonly id: Identifier | null;
readonly superClass: Identifier | null;
readonly body: ClassBody;
constructor(id: Identifier | null, superClass: Identifier | null, body: ClassBody) {
this.type = Syntax.ClassExpression;
this.id = id;
this.superClass = superClass;
this.body = body;
}
}
export class ComputedMemberExpression {
readonly type: string;
readonly computed: boolean;
readonly object: Expression;
readonly property: Expression;
constructor(object: Expression, property: Expression) {
this.type = Syntax.MemberExpression;
this.computed = true;
this.object = object;
this.property = property;
}
}
export class ConditionalExpression {
readonly type: string;
readonly test: Expression;
readonly consequent: Expression;
readonly alternate: Expression;
constructor(test: Expression, consequent: Expression, alternate: Expression) {
this.type = Syntax.ConditionalExpression;
this.test = test;
this.consequent = consequent;
this.alternate = alternate;
}
}
export class ContinueStatement {
readonly type: string;
readonly label: Identifier | null;
constructor(label: Identifier | null) {
this.type = Syntax.ContinueStatement;
this.label = label;
}
}
export class DebuggerStatement {
readonly type: string;
constructor() {
this.type = Syntax.DebuggerStatement;
}
}
export class Directive {
readonly type: string;
readonly expression: Expression;
readonly directive: string;
constructor(expression: Expression, directive: string) {
this.type = Syntax.ExpressionStatement;
this.expression = expression;
this.directive = directive;
}
}
export class DoWhileStatement {
readonly type: string;
readonly body: Statement;
readonly test: Expression;
constructor(body: Statement, test: Expression) {
this.type = Syntax.DoWhileStatement;
this.body = body;
this.test = test;
}
}
export class EmptyStatement {
readonly type: string;
constructor() {
this.type = Syntax.EmptyStatement;
}
}
export class ExportAllDeclaration {
readonly type: string;
readonly source: Literal;
constructor(source: Literal) {
this.type = Syntax.ExportAllDeclaration;
this.source = source;
}
}
export class ExportDefaultDeclaration {
readonly type: string;
readonly declaration: ExportableDefaultDeclaration;
constructor(declaration: ExportableDefaultDeclaration) {
this.type = Syntax.ExportDefaultDeclaration;
this.declaration = declaration;
}
}
export class ExportNamedDeclaration {
readonly type: string;
readonly declaration: ExportableNamedDeclaration | null;
readonly specifiers: ExportSpecifier[];
readonly source: Literal | null;
constructor(declaration: ExportableNamedDeclaration | null, specifiers: ExportSpecifier[], source: Literal | null) {
this.type = Syntax.ExportNamedDeclaration;
this.declaration = declaration;
this.specifiers = specifiers;
this.source = source;
}
}
export class ExportSpecifier {
readonly type: string;
readonly exported: Identifier;
readonly local: Identifier;
constructor(local: Identifier, exported: Identifier) {
this.type = Syntax.ExportSpecifier;
this.exported = exported;
this.local = local;
}
}
export class ExpressionStatement {
readonly type: string;
readonly expression: Expression;
constructor(expression: Expression) {
this.type = Syntax.ExpressionStatement;
this.expression = expression;
}
}
export class ForInStatement {
readonly type: string;
readonly left: Expression;
readonly right: Expression;
readonly body: Statement;
readonly each: boolean;
constructor(left: Expression, right: Expression, body: Statement) {
this.type = Syntax.ForInStatement;
this.left = left;
this.right = right;
this.body = body;
this.each = false;
}
}
export class ForOfStatement {
readonly type: string;
readonly left: Expression;
readonly right: Expression;
readonly body: Statement;
constructor(left: Expression, right: Expression, body: Statement) {
this.type = Syntax.ForOfStatement;
this.left = left;
this.right = right;
this.body = body;
}
}
export class ForStatement {
readonly type: string;
readonly init: Expression | null;
readonly test: Expression | null;
readonly update: Expression | null;
body: Statement;
constructor(init: Expression | null, test: Expression | null, update: Expression | null, body: Statement) {
this.type = Syntax.ForStatement;
this.init = init;
this.test = test;
this.update = update;
this.body = body;
}
}
export class FunctionDeclaration {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(id: Identifier | null, params: FunctionParameter[], body: BlockStatement, generator: boolean) {
this.type = Syntax.FunctionDeclaration;
this.id = id;
this.params = params;
this.body = body;
this.generator = generator;
this.expression = false;
this.async = false;
}
}
export class FunctionExpression {
readonly type: string;
readonly id: Identifier | null;
readonly params: FunctionParameter[];
readonly body: BlockStatement;
readonly generator: boolean;
readonly expression: boolean;
readonly async: boolean;
constructor(id: Identifier | null, params: FunctionParameter[], body: BlockStatement, generator: boolean) {
this.type = Syntax.FunctionExpression;
this.id = id;
this.params = params;
this.body = body;
this.generator = generator;
this.expression = false;
this.async = false;
}
}
export class Identifier {
readonly type: string;
readonly name: string;
constructor(name) {
this.type = Syntax.Identifier;
this.name = name;
}
}
export class IfStatement {
readonly type: string;
readonly test: Expression;
readonly consequent: Statement;
readonly alternate: Statement | null;
constructor(test: Expression, consequent: Statement, alternate: Statement | null) {
this.type = Syntax.IfStatement;
this.test = test;
this.consequent = consequent;
this.alternate = alternate;
}
}
export class Import {
readonly type: string;
constructor() {
this.type = Syntax.Import;
}
}
export class ImportDeclaration {
readonly type: string;
readonly specifiers: ImportDeclarationSpecifier[];
readonly source: Literal;
constructor(specifiers, source) {
this.type = Syntax.ImportDeclaration;
this.specifiers = specifiers;
this.source = source;
}
}
export class ImportDefaultSpecifier {
readonly type: string;
readonly local: Identifier;
constructor(local: Identifier) {
this.type = Syntax.ImportDefaultSpecifier;
this.local = local;
}
}
export class ImportNamespaceSpecifier {
readonly type: string;
readonly local: Identifier;
constructor(local: Identifier) {
this.type = Syntax.ImportNamespaceSpecifier;
this.local = local;
}
}
export class ImportSpecifier {
readonly type: string;
readonly local: Identifier;
readonly imported: Identifier;
constructor(local: Identifier, imported: Identifier) {
this.type = Syntax.ImportSpecifier;
this.local = local;
this.imported = imported;
}
}
export class LabeledStatement {
readonly type: string;
readonly label: Identifier;
readonly body: Statement;
constructor(label: Identifier, body: Statement) {
this.type = Syntax.LabeledStatement;
this.label = label;
this.body = body;
}
}
export class Literal {
readonly type: string;
readonly value: boolean | number | string | null;
readonly raw: string;
constructor(value: boolean | number | string | null, raw: string) {
this.type = Syntax.Literal;
this.value = value;
this.raw = raw;
}
}
export class MetaProperty {
readonly type: string;
readonly meta: Identifier;
readonly property: Identifier;
constructor(meta: Identifier, property: Identifier) {
this.type = Syntax.MetaProperty;
this.meta = meta;
this.property = property;
}
}
export class MethodDefinition {
readonly type: string;
readonly key: Expression | null;
readonly computed: boolean;
readonly value: AsyncFunctionExpression | FunctionExpression | null;
readonly kind: string;
readonly static: boolean;
constructor(key: Expression | null, computed: boolean, value: AsyncFunctionExpression | FunctionExpression | null, kind: string, isStatic: boolean) {
this.type = Syntax.MethodDefinition;
this.key = key;
this.computed = computed;
this.value = value;
this.kind = kind;
this.static = isStatic;
}
}
export class Module {
readonly type: string;
readonly body: StatementListItem[];
readonly sourceType: string;
constructor(body: StatementListItem[]) {
this.type = Syntax.Program;
this.body = body;
this.sourceType = 'module';
}
}
export class NewExpression {
readonly type: string;
readonly callee: Expression;
readonly arguments: ArgumentListElement[];
constructor(callee: Expression, args: ArgumentListElement[]) {
this.type = Syntax.NewExpression;
this.callee = callee;
this.arguments = args;
}
}
export class ObjectExpression {
readonly type: string;
readonly properties: ObjectExpressionProperty[];
constructor(properties: ObjectExpressionProperty[]) {
this.type = Syntax.ObjectExpression;
this.properties = properties;
}
}
export class ObjectPattern {
readonly type: string;
readonly properties: ObjectPatternProperty[];
constructor(properties: ObjectPatternProperty[]) {
this.type = Syntax.ObjectPattern;
this.properties = properties;
}
}
export class Property {
readonly type: string;
readonly key: PropertyKey;
readonly computed: boolean;
readonly value: PropertyValue | null;
readonly kind: string;
readonly method: boolean;
readonly shorthand: boolean;
constructor(kind: string, key: PropertyKey, computed: boolean, value: PropertyValue | null, method: boolean, shorthand: boolean) {
this.type = Syntax.Property;
this.key = key;
this.computed = computed;
this.value = value;
this.kind = kind;
this.method = method;
this.shorthand = shorthand;
}
}
export class RegexLiteral {
readonly type: string;
readonly value: RegExp;
readonly raw: string;
readonly regex: { pattern: string, flags: string };
constructor(value: RegExp, raw: string, pattern: string, flags: string) {
this.type = Syntax.Literal;
this.value = value;
this.raw = raw;
this.regex = { pattern, flags };
}
}
export class RestElement {
readonly type: string;
readonly argument: BindingIdentifier | BindingPattern;
constructor(argument: BindingIdentifier | BindingPattern) {
this.type = Syntax.RestElement;
this.argument = argument;
}
}
export class ReturnStatement {
readonly type: string;
readonly argument: Expression | null;
constructor(argument: Expression | null) {
this.type = Syntax.ReturnStatement;
this.argument = argument;
}
}
export class Script {
readonly type: string;
readonly body: StatementListItem[];
readonly sourceType: string;
constructor(body: StatementListItem[]) {
this.type = Syntax.Program;
this.body = body;
this.sourceType = 'script';
}
}
export class SequenceExpression {
readonly type: string;
readonly expressions: Expression[];
constructor(expressions: Expression[]) {
this.type = Syntax.SequenceExpression;
this.expressions = expressions;
}
}
export class SpreadElement {
readonly type: string;
readonly argument: Expression;
constructor(argument: Expression) {
this.type = Syntax.SpreadElement;
this.argument = argument;
}
}
export class StaticMemberExpression {
readonly type: string;
readonly computed: boolean;
readonly object: Expression;
readonly property: Expression;
constructor(object: Expression, property: Expression) {
this.type = Syntax.MemberExpression;
this.computed = false;
this.object = object;
this.property = property;
}
}
export class Super {
readonly type: string;
constructor() {
this.type = Syntax.Super;
}
}
export class SwitchCase {
readonly type: string;
readonly test: Expression | null;
readonly consequent: Statement[];
constructor(test: Expression, consequent: Statement[]) {
this.type = Syntax.SwitchCase;
this.test = test;
this.consequent = consequent;
}
}
export class SwitchStatement {
readonly type: string;
readonly discriminant: Expression;
readonly cases: SwitchCase[];
constructor(discriminant: Expression, cases: SwitchCase[]) {
this.type = Syntax.SwitchStatement;
this.discriminant = discriminant;
this.cases = cases;
}
}
export class TaggedTemplateExpression {
readonly type: string;
readonly tag: Expression;
readonly quasi: TemplateLiteral;
constructor(tag: Expression, quasi: TemplateLiteral) {
this.type = Syntax.TaggedTemplateExpression;
this.tag = tag;
this.quasi = quasi;
}
}
interface TemplateElementValue {
cooked: string;
raw: string;
}
export class TemplateElement {
readonly type: string;
readonly value: TemplateElementValue;
readonly tail: boolean;
constructor(value: TemplateElementValue, tail: boolean) {
this.type = Syntax.TemplateElement;
this.value = value;
this.tail = tail;
}
}
export class TemplateLiteral {
readonly type: string;
readonly quasis: TemplateElement[];
readonly expressions: Expression[];
constructor(quasis: TemplateElement[], expressions: Expression[]) {
this.type = Syntax.TemplateLiteral;
this.quasis = quasis;
this.expressions = expressions;
}
}
export class ThisExpression {
readonly type: string;
constructor() {
this.type = Syntax.ThisExpression;
}
}
export class ThrowStatement {
readonly type: string;
readonly argument: Expression;
constructor(argument: Expression) {
this.type = Syntax.ThrowStatement;
this.argument = argument;
}
}
export class TryStatement {
readonly type: string;
readonly block: BlockStatement;
readonly handler: CatchClause | null;
readonly finalizer: BlockStatement | null;
constructor(block: BlockStatement, handler: CatchClause | null, finalizer: BlockStatement | null) {
this.type = Syntax.TryStatement;
this.block = block;
this.handler = handler;
this.finalizer = finalizer;
}
}
export class UnaryExpression {
readonly type: string;
readonly operator: string;
readonly argument: Expression;
readonly prefix: boolean;
constructor(operator, argument) {
this.type = Syntax.UnaryExpression;
this.operator = operator;
this.argument = argument;
this.prefix = true;
}
}
export class UpdateExpression {
readonly type: string;
readonly operator: string;
readonly argument: Expression;
readonly prefix: boolean;
constructor(operator, argument, prefix) {
this.type = Syntax.UpdateExpression;
this.operator = operator;
this.argument = argument;
this.prefix = prefix;
}
}
export class VariableDeclaration {
readonly type: string;
readonly declarations: VariableDeclarator[];
readonly kind: string;
constructor(declarations: VariableDeclarator[], kind: string) {
this.type = Syntax.VariableDeclaration;
this.declarations = declarations;
this.kind = kind;
}
}
export class VariableDeclarator {
readonly type: string;
readonly id: BindingIdentifier | BindingPattern;
readonly init: Expression | null;
constructor(id: BindingIdentifier | BindingPattern, init: Expression | null) {
this.type = Syntax.VariableDeclarator;
this.id = id;
this.init = init;
}
}
export class WhileStatement {
readonly type: string;
readonly test: Expression;
readonly body: Statement;
constructor(test: Expression, body: Statement) {
this.type = Syntax.WhileStatement;
this.test = test;
this.body = body;
}
}
export class WithStatement {
readonly type: string;
readonly object: Expression;
readonly body: Statement;
constructor(object: Expression, body: Statement) {
this.type = Syntax.WithStatement;
this.object = object;
this.body = body;
}
}
export class YieldExpression {
readonly type: string;
readonly argument: Expression | null;
readonly delegate: boolean;
constructor(argument: Expression | null, delegate: boolean) {
this.type = Syntax.YieldExpression;
this.argument = argument;
this.delegate = delegate;
}
}