About
This page serves as a consolidated, navigable reference for the SpiderMonkey Parser API and is under the terms of the same CC BY-SA 2.5 license. Spot an error or want to make an improvement? Fork the GitHub repository!
Red sections denote SpiderMonkey-specifc features that may not be supported elsewhere. Green sections denote deviations from the specification.
Node objects
interface Node { type: string; loc: SourceLocation | null; }
interface SourceLocation { source: string | null; start: Position; end: Position; }
interface Position { line: uint32 >= 1; column: uint32 >= 0; }
Programs
A complete program source tree.
interface Program <: Node { type: "Program"; body: [ Statement ]; } program(body[, loc]) body: [ Statement ] loc: SourceLocation
Functions
A function declaration or expression.
interface Function <: Node { id: Identifier | null; params: [ Pattern ]; defaults: [ Expression ]; rest: Identifier | null; body: BlockStatement | Expression; generator: boolean; expression: boolean; }
Statements
Any statement.
interface Statement <: Node { }
An empty statement, i.e., a solitary semicolon.
interface EmptyStatement <: Statement { type: "EmptyStatement"; } emptyStatement([loc]) loc: SourceLocation
A block statement, i.e., a sequence of statements surrounded by braces.
The builder differs from that specified in the Mozilla Parser API: body is an Array of Statements instead of a single Statement.
interface BlockStatement <: Statement { type: "BlockStatement"; body: [ Statement ]; } blockStatement(body[, loc]) body: [ Statement ] loc: SourceLocation
An expression statement, i.e., a statement consisting of a single expression.
interface ExpressionStatement <: Statement { type: "ExpressionStatement"; expression: Expression; } expressionStatement(expr[, loc]) expr: Expression loc: SourceLocation
An if
statement.
interface IfStatement <: Statement { type: "IfStatement"; test: Expression; consequent: Statement; alternate: Statement | null; } ifStatement(test, cons, alt[, loc]) test: Expression cons: Statement alt: Statement | null loc: SourceLocation
A labeled statement, i.e., a statement prefixed by a break
/continue
label.
interface LabeledStatement <: Statement { type: "LabeledStatement"; label: Identifier; body: Statement; } labeledStatement(label, body[, loc]) label: Identifier body: Statement loc: SourceLocation
A break
statement.
interface BreakStatement <: Statement { type: "BreakStatement"; label: Identifier | null; } breakStatement(label[, loc]) label: Identifier | null loc: SourceLocation
A continue
statement.
interface ContinueStatement <: Statement { type: "ContinueStatement"; label: Identifier | null; } continueStatement(label[, loc]) label: Identifier | null loc: SourceLocation
A with
statement.
interface WithStatement <: Statement { type: "WithStatement"; object: Expression; body: Statement; } withStatement(obj, body[, loc]) obj: Expression body: Statement loc: SourceLocation
A switch
statement.
The lexical flag is metadata indicating whether the switch statement contains any unnested let
declarations (and therefore introduces a new lexical scope).
interface SwitchStatement <: Statement { type: "SwitchStatement"; discriminant: Expression; cases: [ SwitchCase ]; lexical: boolean; } switchStatement(disc, cases, isLexical[, loc]) disc: Expression cases: [ SwitchCase ] isLexical: boolean loc: SourceLocation
A return
statement.
interface ReturnStatement <: Statement { type: "ReturnStatement"; argument: Expression | null; } returnStatement(arg[, loc]) arg: Expression | null loc: SourceLocation
A throw
statement.
interface ThrowStatement <: Statement { type: "ThrowStatement"; argument: Expression; } throwStatement(arg[, loc]) arg: Expression loc: SourceLocation
A try
statement.
The builder in the Mozilla Parser API accepts multiple handlers. This only accepts a single handler.
interface TryStatement <: Statement { type: "TryStatement"; block: BlockStatement; handler: CatchClause | null; guardedHandlers: [ CatchClause ]; finalizer: BlockStatement | null; } tryStatement(body, handler, fin[, loc]) body: Statement handler: CatchClause fin: Statement | null loc: SourceLocation
A while
statement.
interface WhileStatement <: Statement { type: "WhileStatement"; test: Expression; body: Statement; } whileStatement(test, body[, loc]) test: Expression body: Statement loc: SourceLocation
A do/while
statement.
interface DoWhileStatement <: Statement { type: "DoWhileStatement"; body: Statement; test: Expression; } doWhileStatement(body, test[, loc]) body: Statement test: Expression loc: SourceLocation
A for
statement.
interface ForStatement <: Statement { type: "ForStatement"; init: VariableDeclaration | Expression | null; test: Expression | null; update: Expression | null; body: Statement; } forStatement(init, test, update, body[, loc]) init: VariableDeclaration | Expression | null test: Expression | null update: Expression | null body: Statement loc: SourceLocation
A for/in
statement, or, if each is true, a for each/in
statement.
interface ForInStatement <: Statement { type: "ForInStatement"; left: VariableDeclaration | Expression; right: Expression; body: Statement; each: boolean; } forInStatement(left, right, body, isForEach[, loc]) left: VariableDeclaration | Expression right: Expression body: Statement isForEach: boolean loc: SourceLocation
A for/of
statement.
The Mozilla Parser API does not define a builder, so one has been defined here.
interface ForOfStatement <: Statement { type: "ForOfStatement"; left: VariableDeclaration | Expression; right: Expression; body: Statement; } forOfStatement(left, right, body[, loc]) left: VariableDeclaration | Expression right: Expression body: Statement
A let
statement.
interface LetStatement <: Statement { type: "LetStatement"; head: [ { id: Pattern, init: Expression | null } ]; body: Statement; } letStatement(head, body[, loc]) head: [ Declarator ] body: Statement loc: SourceLocation
A debugger
statement.
interface DebuggerStatement <: Statement { type: "DebuggerStatement"; } debuggerStatement([loc]) loc: SourceLocation
Declarations
Any declaration node.
interface Declaration <: Statement { }
A function declaration.
The builder intentionally differs from the Mozilla Parser API in its arguments instead of (name, args, body, isGenerator, isExpression[, loc]).
interface FunctionDeclaration <: Function, Declaration { type: "FunctionDeclaration"; id: Identifier; params: [ Pattern ]; defaults: [ Expression ]; rest: Identifier | null; body: BlockStatement | Expression; generator: boolean; expression: boolean; } functionDeclaration(id, params, defaults, rest, body, isGenerator, isExpression[, loc]) id: Identifier params: [ Pattern ] defaults: [ Expression ] rest: Identifier | null body: BlockStatement | Expression isGenerator: boolean isExpression: boolean loc: SourceLocation
A variable declaration, via one of var, let, or const.
interface VariableDeclaration <: Declaration { type: "VariableDeclaration"; declarations: [ VariableDeclarator ]; kind: "var" | "let" | "const"; } variableDeclaration(kind, dtors[, loc]) kind: "var" | "let" | "const" dtors: [ Declarator ] loc: SourceLocation
A variable declarator.
interface VariableDeclarator <: Node { type: "VariableDeclarator"; id: Pattern; init: Expression | null; } variableDeclarator(patt, init[, loc]) patt: Pattern init: Expression | null loc: SourceLocation
Expressions
Any expression node.
interface Expression <: Node, Pattern { }
A this expression.
interface ThisExpression <: Expression { type: "ThisExpression"; } thisExpression([loc]) loc: SourceLocation
An array expression.
interface ArrayExpression <: Expression { type: "ArrayExpression"; elements: [ Expression | null ]; } arrayExpression(elts[, loc]) elts: [ Expression | null ] loc: SourceLocation
An object expression.
A literal property in an object expression can have either a string or number as its value.
Ordinary property initializers have a kind value "init"; getters and setters have the kind values "get" and "set", respectively.
interface ObjectExpression <: Expression { type: "ObjectExpression"; properties: [ Property ]; } objectExpression(props[, loc]) props: [ Property ] loc: SourceLocation
A function expression.
The builder intentionally differs from the Mozilla Parser API in its arguments instead of (name, args, body, isGenerator, isExpression[, loc]).
interface FunctionExpression <: Function, Expression { type: "FunctionExpression"; id: Identifier | null; params: [ Pattern ]; defaults: [ Expression ]; rest: Identifier | null; body: BlockStatement | Expression; generator: boolean; expression: boolean; } functionExpression(id, params, defaults, rest, body, isGenerator, isExpression[, loc]) id: Identifier | null params: [ Pattern ] defaults: [ Expression ] rest: Identifier | null body: BlockStatement | Expression isGenerator: boolean isExpression: boolean loc: SourceLocation
A fat arrow function expression, i.e., `let foo = (bar) => { /* body */ }`.
The Mozilla Parser API does not specify a builder for the ArrowFunction node, so one has been created here.
interface ArrowExpression <: Function, Expression { type: "ArrowExpression"; params: [ Pattern ]; defaults: [ Expression ]; rest: Identifier | null; body: BlockStatement | Expression; generator: boolean; expression: boolean; } arrowExpression(params, defaults, rest, body, isGenerator, isExpression[, loc]) params: [ Pattern ] defaults: [ Expression ] rest: Identifier | null body: BlockStatement | Expression isGenerator: boolean isExpression: boolean loc: SourceLocation
A sequence expression, i.e., a comma-separated sequence of expressions.
interface SequenceExpression <: Expression { type: "SequenceExpression"; expressions: [ Expression ]; } sequenceExpression(exprs[, loc]) exprs: [ Expression ] loc: SourceLocation
A unary operator expression.
interface UnaryExpression <: Expression { type: "UnaryExpression"; operator: UnaryOperator; prefix: boolean; argument: Expression; } unaryExpression(op, arg, isPrefix[, loc]) op: UnaryOperator arg: Expression isPrefix: boolean loc: SourceLocation
A binary operator expression.
interface BinaryExpression <: Expression { type: "BinaryExpression"; operator: BinaryOperator; left: Expression; right: Expression; } binaryExpression(op, left, right[, loc]) op: BinaryOperator left: Expression right: Expression loc: SourceLocation
An assignment operator expression.
interface AssignmentExpression <: Expression { type: "AssignmentExpression"; operator: AssignmentOperator; left: Expression; right: Expression; } assignmentExpression(op, left, right[, loc]) op: AssignmentOperator left: Expression right: Expression loc: SourceLocation
An update (increment or decrement) operator expression.
interface UpdateExpression <: Expression { type: "UpdateExpression"; operator: UpdateOperator; argument: Expression; prefix: boolean; } updateExpression(op, arg, isPrefix[, loc]) op: UpdateOperator arg: Expression isPrefix: boolean loc: SourceLocation
A logical operator expression.
interface LogicalExpression <: Expression { type: "LogicalExpression"; operator: LogicalOperator; left: Expression; right: Expression; } logicalExpression(op, left, right[, loc]) op: LogicalOperator left: Expression right: Expression loc: SourceLocation
A conditional expression, i.e., a ternary ?/: expression.
interface ConditionalExpression <: Expression { type: "ConditionalExpression"; test: Expression; alternate: Expression; consequent: Expression; } conditionalExpression(test, cons, alt[, loc]) test: Expression cons: Expression alt: Expression loc: SourceLocation
A new expression.
interface NewExpression <: Expression { type: "NewExpression"; callee: Expression; arguments: [ Expression | null ]; } newExpression(callee, args[, loc]) callee: Expression args: [ Expression ] loc: SourceLocation
A function or method call expression.
interface CallExpression <: Expression { type: "CallExpression"; callee: Expression; arguments: [ Expression | null ]; } callExpression(callee, args[, loc]) callee: Expression args: [ Expression ] loc: SourceLocation
A member expression.
If computed === true, the node corresponds to a computed e1[e2] expression and property is an Expression. If computed === false, the node corresponds to a static e1.x expression and property is an Identifier.
interface MemberExpression <: Expression { type: "MemberExpression"; object: Expression; property: Identifier | Expression; computed: boolean; } memberExpression(obj, prop, isComputed[, loc]) obj: Expression prop: Identifier | Expression isComputed: boolean loc: SourceLocation
A yield expression.
The Mozilla Parser API does not specify a type
property for YieldExpression, so one has been added here.
interface YieldExpression <: Expression { type: "YieldExpression"; argument: Expression | null; } yieldExpression(arg[, loc]) arg: Expression loc: SourceLocation
An array comprehension.
The blocks array corresponds to the sequence of for and for each blocks.
The optional filter expression corresponds to the final if clause, if present.
The Mozilla Parser API does not specify a type
property for ComprehensionExpression, so one has been added here.
interface ComprehensionExpression <: Expression { type: "ComprehensionExpression"; body: Expression; blocks: [ ComprehensionBlock ]; filter: Expression | null; } comprehensionExpression(body, blocks, filter[, loc]) body: Expression blocks: [ ComprehensionBlock ] filter: Expression | null loc: SourceLocation
A generator expression.
As with array comprehensions, the blocks array corresponds to the sequence of for and for each blocks, and the optional filter expression corresponds to the final if clause, if present.
The Mozilla Parser API does not specify a type
property for GeneratorExpression, so one has been added here.
interface GeneratorExpression <: Expression { type: "GeneratorExpression"; body: Expression; blocks: [ ComprehensionBlock ]; filter: Expression | null; } generatorExpression(body, blocks, filter[, loc]) body: Expression blocks: [ ComprehensionBlock ] filter: Expression | null loc: SourceLocation
A let expression.
interface LetExpression <: Expression { type: "LetExpression"; head: [ { id: Pattern, init: Expression | null } ]; body: Expression; } letExpression(head, body[, loc]) head: [ Declarator ] body: Expression loc: SourceLocation
Patterns
interface Pattern <: Node { }
An object-destructuring pattern.
A literal property in an object pattern can have either a string or number as its value.
interface ObjectPattern <: Pattern { type: "ObjectPattern"; properties: [ PropertyPattern ]; } objectPattern(props[, loc]) props: [ PropertyPattern ] loc: SourceLocation
An object property pattern.
The Mozilla Parser API does not specify a type
property for PropertyPattern, so one has been added here.
interface PropertyPattern <: Node { type: "PropertyPattern"; key: Literal | Identifier; value: Pattern; } propertyPattern(key, patt[, loc]) key: Literal | Identifier patt: Pattern loc: SourceLocation
An array-destructuring pattern.
interface ArrayPattern <: Pattern { type: "ArrayPattern"; elements: [ Pattern | null ]; } arrayPattern(elts[, loc]) elts: [ Pattern | null ] loc: SourceLocation
Clauses
A case (if test is an Expression) or default (if test === null) clause in the body of a switch statement.
interface SwitchCase <: Node { type: "SwitchCase"; test: Expression | null; consequent: [ Statement ]; } switchCase(test, cons[, loc]) test: Expression | null cons: [ Statement ] loc: SourceLocation
A catch clause following a try block.
The optional guard property corresponds to the optional expression guard on the bound variable.
interface CatchClause <: Node { type: "CatchClause"; param: Pattern; guard: Expression | null; body: BlockStatement; } catchClause(arg, guard, body[, loc]) arg: Pattern guard: Expression body: Statement loc: SourceLocation
A for or for each block in an array comprehension or generator expression.
The Mozilla Parser API does not specify a type
property for ComprehensionBlock, so one has been added here.
interface ComprehensionBlock <: Node { type: "ComprehensionBlock"; left: Pattern; right: Expression; each: boolean; } comprehensionBlock(left, right, isForEach[, loc]) left: Pattern right: Expression isForEach: boolean loc: SourceLocation
Miscellaneous
An identifier.
Note that an identifier may be an expression or a destructuring pattern.
interface Identifier <: Node, Expression, Pattern { type: "Identifier"; name: string; } identifier(name[, loc]) name: string loc: SourceLocation
A literal token.
Note that a literal can be an expression.
interface Literal <: Node, Expression { type: "Literal"; value: string | boolean | null | number | RegExp; } literal(val[, loc]) val: string | boolean | null | number | RegExp loc: SourceLocation
An object property initializer.
The order of the arguments in the builder intentionally differs from that specified by the Mozilla Parser API: the kind argument comes third, rather than first.
interface Property < Node { type: "Property"; key: Literal | Identifier; value: Expression; kind: "init" | "get" | "set"; } property(key, val, kind[, loc]) key: Literal | Identifier val: Expression kind: "init" | "get" | "set" loc: SourceLocation
A unary operator token.
enum UnaryOperator { "-" | "+" | "!" | "~" | "typeof" | "void" | "delete" }
A binary operator token.
enum BinaryOperator { "==" | "!=" | "===" | "!==" | "<" | "<=" | ">" | ">=" | "<<" | ">>" | ">>>" | "+" | "-" | "*" | "/" | "%" | "&" | "|" | "^" | "in" | "instanceof" | ".." }
A logical operator token.
enum LogicalOperator { "||" | "&&" }
An assignment operator token.
enum AssignmentOperator { "=" | "+=" | "-=" | "*=" | "/=" | "%=" | "<<=" | ">>=" | ">>>=" | "|=" | "^=" | "&=" }
An update (increment or decrement) operator token.
enum UpdateOperator { "++" | "--" }