This document specifies the core ESTree AST node types that support the ES5 grammar. - [Node objects](#node-objects) - [Identifier](#identifier) - [Literal](#literal) - [RegExpLiteral](#regexpliteral) - [Programs](#programs) - [Functions](#functions) - [Statements](#statements) - [ExpressionStatement](#expressionstatement) - [BlockStatement](#blockstatement) - [EmptyStatement](#emptystatement) - [DebuggerStatement](#debuggerstatement) - [WithStatement](#withstatement) - [Control flow](#control-flow) - [ReturnStatement](#returnstatement) - [LabeledStatement](#labeledstatement) - [BreakStatement](#breakstatement) - [ContinueStatement](#continuestatement) - [Choice](#choice) - [IfStatement](#ifstatement) - [SwitchStatement](#switchstatement) - [SwitchCase](#switchcase) - [Exceptions](#exceptions) - [ThrowStatement](#throwstatement) - [TryStatement](#trystatement) - [CatchClause](#catchclause) - [Loops](#loops) - [WhileStatement](#whilestatement) - [DoWhileStatement](#dowhilestatement) - [ForStatement](#forstatement) - [ForInStatement](#forinstatement) - [Declarations](#declarations) - [FunctionDeclaration](#functiondeclaration) - [VariableDeclaration](#variabledeclaration) - [VariableDeclarator](#variabledeclarator) - [Expressions](#expressions) - [ThisExpression](#thisexpression) - [ArrayExpression](#arrayexpression) - [ObjectExpression](#objectexpression) - [Property](#property) - [FunctionExpression](#functionexpression) - [Unary operations](#unary-operations) - [UnaryExpression](#unaryexpression) - [UnaryOperator](#unaryoperator) - [UpdateExpression](#updateexpression) - [UpdateOperator](#updateoperator) - [Binary operations](#binary-operations) - [BinaryExpression](#binaryexpression) - [BinaryOperator](#binaryoperator) - [AssignmentExpression](#assignmentexpression) - [AssignmentOperator](#assignmentoperator) - [LogicalExpression](#logicalexpression) - [LogicalOperator](#logicaloperator) - [MemberExpression](#memberexpression) - [ConditionalExpression](#conditionalexpression) - [CallExpression](#callexpression) - [NewExpression](#newexpression) - [SequenceExpression](#sequenceexpression) - [Patterns](#patterns) # Node objects ESTree AST nodes are represented as `Node` objects, which may have any prototype inheritance but which implement the following interface: ```js interface Node { type: string; loc: SourceLocation | null; } ``` The `type` field is a string representing the AST variant type. Each subtype of `Node` is documented below with the specific string of its `type` field. You can use this field to determine which interface a node implements. The `loc` field represents the source location information of the node. If the node contains no information about the source location, the field is `null`; otherwise it is an object consisting of a start position (the position of the first character of the parsed source region) and an end position (the position of the first character after the parsed source region): ```js interface SourceLocation { source: string | null; start: Position; end: Position; } ``` Each `Position` object consists of a `line` number (1-indexed) and a `column` number (0-indexed): ```js interface Position { line: number; // >= 1 column: number; // >= 0 } ``` # Identifier ```js interface Identifier <: Expression, Pattern { type: "Identifier"; name: string; } ``` An identifier. Note that an identifier may be an expression or a destructuring pattern. # Literal ```js interface Literal <: Expression { type: "Literal"; value: string | boolean | null | number | RegExp; } ``` A literal token. Note that a literal can be an expression. ## RegExpLiteral ```js interface RegExpLiteral <: Literal { regex: { pattern: string; flags: string; }; } ``` The `regex` property allows regexes to be represented in environments that don’t support certain flags such as `y` or `u`. In environments that don't support these flags `value` will be `null` as the regex can't be represented natively. # Programs ```js interface Program <: Node { type: "Program"; body: [ Directive | Statement ]; } ``` A complete program source tree. # Functions ```js interface Function <: Node { id: Identifier | null; params: [ Pattern ]; body: FunctionBody; } ``` A function [declaration](#functiondeclaration) or [expression](#functionexpression). # Statements ```js interface Statement <: Node { } ``` Any statement. ## ExpressionStatement ```js interface ExpressionStatement <: Statement { type: "ExpressionStatement"; expression: Expression; } ``` An expression statement, i.e., a statement consisting of a single expression. ## Directive ```js interface Directive <: ExpressionStatement { expression: Literal; directive: string; } ``` A directive from the directive prologue of a script or function. The `directive` property is the raw string source of the directive without quotes. ## BlockStatement ```js interface BlockStatement <: Statement { type: "BlockStatement"; body: [ Statement ]; } ``` A block statement, i.e., a sequence of statements surrounded by braces. ## FunctionBody ```js interface FunctionBody <: BlockStatement { body: [ Directive | Statement ]; } ``` The body of a function, which is a block statement that may begin with directives. ## EmptyStatement ```js interface EmptyStatement <: Statement { type: "EmptyStatement"; } ``` An empty statement, i.e., a solitary semicolon. ## DebuggerStatement ```js interface DebuggerStatement <: Statement { type: "DebuggerStatement"; } ``` A `debugger` statement. ## WithStatement ```js interface WithStatement <: Statement { type: "WithStatement"; object: Expression; body: Statement; } ``` A `with` statement. ## Control flow ### ReturnStatement ```js interface ReturnStatement <: Statement { type: "ReturnStatement"; argument: Expression | null; } ``` A `return` statement. ### LabeledStatement ```js interface LabeledStatement <: Statement { type: "LabeledStatement"; label: Identifier; body: Statement; } ``` A labeled statement, i.e., a statement prefixed by a `break`/`continue` label. ### BreakStatement ```js interface BreakStatement <: Statement { type: "BreakStatement"; label: Identifier | null; } ``` A `break` statement. ### ContinueStatement ```js interface ContinueStatement <: Statement { type: "ContinueStatement"; label: Identifier | null; } ``` A `continue` statement. ## Choice ### IfStatement ```js interface IfStatement <: Statement { type: "IfStatement"; test: Expression; consequent: Statement; alternate: Statement | null; } ``` An `if` statement. ### SwitchStatement ```js interface SwitchStatement <: Statement { type: "SwitchStatement"; discriminant: Expression; cases: [ SwitchCase ]; } ``` A `switch` statement. #### SwitchCase ```js interface SwitchCase <: Node { type: "SwitchCase"; test: Expression | null; consequent: [ Statement ]; } ``` A `case` (if `test` is an `Expression`) or `default` (if `test === null`) clause in the body of a `switch` statement. ## Exceptions ### ThrowStatement ```js interface ThrowStatement <: Statement { type: "ThrowStatement"; argument: Expression; } ``` A `throw` statement. ### TryStatement ```js interface TryStatement <: Statement { type: "TryStatement"; block: BlockStatement; handler: CatchClause | null; finalizer: BlockStatement | null; } ``` A `try` statement. If `handler` is `null` then `finalizer` must be a `BlockStatement`. #### CatchClause ```js interface CatchClause <: Node { type: "CatchClause"; param: Pattern; body: BlockStatement; } ``` A `catch` clause following a `try` block. ## Loops ### WhileStatement ```js interface WhileStatement <: Statement { type: "WhileStatement"; test: Expression; body: Statement; } ``` A `while` statement. ### DoWhileStatement ```js interface DoWhileStatement <: Statement { type: "DoWhileStatement"; body: Statement; test: Expression; } ``` A `do`/`while` statement. ### ForStatement ```js interface ForStatement <: Statement { type: "ForStatement"; init: VariableDeclaration | Expression | null; test: Expression | null; update: Expression | null; body: Statement; } ``` A `for` statement. ### ForInStatement ```js interface ForInStatement <: Statement { type: "ForInStatement"; left: VariableDeclaration | Pattern; right: Expression; body: Statement; } ``` A `for`/`in` statement. # Declarations ```js interface Declaration <: Statement { } ``` Any declaration node. Note that declarations are considered statements; this is because declarations can appear in any statement context. ## FunctionDeclaration ```js interface FunctionDeclaration <: Function, Declaration { type: "FunctionDeclaration"; id: Identifier; } ``` A function declaration. Note that unlike in the parent interface `Function`, the `id` cannot be `null`. ## VariableDeclaration ```js interface VariableDeclaration <: Declaration { type: "VariableDeclaration"; declarations: [ VariableDeclarator ]; kind: "var"; } ``` A variable declaration. ### VariableDeclarator ```js interface VariableDeclarator <: Node { type: "VariableDeclarator"; id: Pattern; init: Expression | null; } ``` A variable declarator. # Expressions ```js interface Expression <: Node { } ``` Any expression node. Since the left-hand side of an assignment may be any expression in general, an expression can also be a pattern. ## ThisExpression ```js interface ThisExpression <: Expression { type: "ThisExpression"; } ``` A `this` expression. ## ArrayExpression ```js interface ArrayExpression <: Expression { type: "ArrayExpression"; elements: [ Expression | null ]; } ``` An array expression. An element might be `null` if it represents a hole in a sparse array. E.g. `[1,,2]`. ## ObjectExpression ```js interface ObjectExpression <: Expression { type: "ObjectExpression"; properties: [ Property ]; } ``` An object expression. ### Property ```js interface Property <: Node { type: "Property"; key: Literal | Identifier; value: Expression; kind: "init" | "get" | "set"; } ``` A literal property in an object expression can have either a string or number as its `key`. Ordinary property initializers have a `kind` value `"init"`; getters and setters have the kind values `"get"` and `"set"`, respectively. ## FunctionExpression ```js interface FunctionExpression <: Function, Expression { type: "FunctionExpression"; } ``` A `function` expression. ## Unary operations ### UnaryExpression ```js interface UnaryExpression <: Expression { type: "UnaryExpression"; operator: UnaryOperator; prefix: boolean; argument: Expression; } ``` A unary operator expression. #### UnaryOperator ```js enum UnaryOperator { "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" } ``` A unary operator token. ### UpdateExpression ```js interface UpdateExpression <: Expression { type: "UpdateExpression"; operator: UpdateOperator; argument: Expression; prefix: boolean; } ``` An update (increment or decrement) operator expression. #### UpdateOperator ```js enum UpdateOperator { "++" | "--" } ``` An update (increment or decrement) operator token. ## Binary operations ### BinaryExpression ```js interface BinaryExpression <: Expression { type: "BinaryExpression"; operator: BinaryOperator; left: Expression; right: Expression; } ``` A binary operator expression. #### BinaryOperator ```js enum BinaryOperator { "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "|" | "^" | "&" | "in" | "instanceof" } ``` A binary operator token. ### AssignmentExpression ```js interface AssignmentExpression <: Expression { type: "AssignmentExpression"; operator: AssignmentOperator; left: Pattern | Expression; right: Expression; } ``` An assignment operator expression. #### AssignmentOperator ```js enum AssignmentOperator { "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" } ``` An assignment operator token. ### LogicalExpression ```js interface LogicalExpression <: Expression { type: "LogicalExpression"; operator: LogicalOperator; left: Expression; right: Expression; } ``` A logical operator expression. #### LogicalOperator ```js enum LogicalOperator { "||" | "&&" } ``` A logical operator token. ### MemberExpression ```js interface MemberExpression <: Expression, Pattern { type: "MemberExpression"; object: Expression; property: Expression; computed: boolean; } ``` A member expression. If `computed` is `true`, the node corresponds to a computed (`a[b]`) member expression and `property` is an `Expression`. If `computed` is `false`, the node corresponds to a static (`a.b`) member expression and `property` is an `Identifier`. ## ConditionalExpression ```js interface ConditionalExpression <: Expression { type: "ConditionalExpression"; test: Expression; alternate: Expression; consequent: Expression; } ``` A conditional expression, i.e., a ternary `?`/`:` expression. ## CallExpression ```js interface CallExpression <: Expression { type: "CallExpression"; callee: Expression; arguments: [ Expression ]; } ``` A function or method call expression. ## NewExpression ```js interface NewExpression <: Expression { type: "NewExpression"; callee: Expression; arguments: [ Expression ]; } ``` A `new` expression. ## SequenceExpression ```js interface SequenceExpression <: Expression { type: "SequenceExpression"; expressions: [ Expression ]; } ``` A sequence expression, i.e., a comma-separated sequence of expressions. # Patterns Destructuring binding and assignment are not part of ES5, but all binding positions accept `Pattern` to allow for destructuring in ES6. Nevertheless, for ES5, the only `Pattern` subtype is [`Identifier`](#identifier). ```js interface Pattern <: Node { } ```