1421 lines
29 KiB
Markdown
1421 lines
29 KiB
Markdown
These are the core @babel/parser (babylon) AST node types.
|
|
|
|
- [Node objects](#node-objects)
|
|
- [Changes](#changes)
|
|
- [Identifier](#identifier)
|
|
- [PrivateName](#privatename)
|
|
- [Literals](#literals)
|
|
- [RegExpLiteral](#regexpliteral)
|
|
- [NullLiteral](#nullliteral)
|
|
- [StringLiteral](#stringliteral)
|
|
- [BooleanLiteral](#booleanliteral)
|
|
- [NumericLiteral](#numericliteral)
|
|
- [BigIntLiteral](#bigintliteral)
|
|
- [DecimalLiteral](#decimalliteral)
|
|
- [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)
|
|
- [ForOfStatement](#forofstatement)
|
|
- [Declarations](#declarations)
|
|
- [FunctionDeclaration](#functiondeclaration)
|
|
- [VariableDeclaration](#variabledeclaration)
|
|
- [VariableDeclarator](#variabledeclarator)
|
|
- [Misc](#misc)
|
|
- [Decorator](#decorator)
|
|
- [Directive](#directive)
|
|
- [DirectiveLiteral](#directiveliteral)
|
|
- [InterpreterDirective](#interpreterdirective)
|
|
- [Expressions](#expressions)
|
|
- [Super](#super)
|
|
- [Import](#import)
|
|
- [ThisExpression](#thisexpression)
|
|
- [ArrowFunctionExpression](#arrowfunctionexpression)
|
|
- [YieldExpression](#yieldexpression)
|
|
- [AwaitExpression](#awaitexpression)
|
|
- [ArrayExpression](#arrayexpression)
|
|
- [ObjectExpression](#objectexpression)
|
|
- [ObjectMember](#objectmember)
|
|
- [ObjectProperty](#objectproperty)
|
|
- [ObjectMethod](#objectmethod)
|
|
- [RecordExpression](#recordexpression)
|
|
- [TupleExpression](#tupleexpression)
|
|
- [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)
|
|
- [SpreadElement](#spreadelement)
|
|
- [ArgumentPlaceholder](#argumentplaceholder)
|
|
- [MemberExpression](#memberexpression)
|
|
- [OptionalMemberExpression](#optionalmemberexpression)
|
|
- [BindExpression](#bindexpression)
|
|
- [ConditionalExpression](#conditionalexpression)
|
|
- [CallExpression](#callexpression)
|
|
- [OptionalCallExpression](#optionalcallexpression)
|
|
- [NewExpression](#newexpression)
|
|
- [SequenceExpression](#sequenceexpression)
|
|
- [ParenthesizedExpression](#parenthesizedexpression)
|
|
- [DoExpression](#doexpression)
|
|
- [Template Literals](#template-literals)
|
|
- [TemplateLiteral](#templateliteral)
|
|
- [TaggedTemplateExpression](#taggedtemplateexpression)
|
|
- [TemplateElement](#templateelement)
|
|
- [Patterns](#patterns)
|
|
- [ObjectPattern](#objectpattern)
|
|
- [ArrayPattern](#arraypattern)
|
|
- [RestElement](#restelement)
|
|
- [AssignmentPattern](#assignmentpattern)
|
|
- [Classes](#classes)
|
|
- [ClassBody](#classbody)
|
|
- [ClassMethod](#classmethod)
|
|
- [ClassPrivateMethod](#classprivatemethod)
|
|
- [ClassProperty](#classproperty)
|
|
- [ClassPrivateProperty](#classprivateproperty)
|
|
- [StaticBlock](#staticblock)
|
|
- [ClassDeclaration](#classdeclaration)
|
|
- [ClassExpression](#classexpression)
|
|
- [MetaProperty](#metaproperty)
|
|
- [Modules](#modules)
|
|
- [ModuleDeclaration](#moduledeclaration)
|
|
- [ModuleSpecifier](#modulespecifier)
|
|
- [Imports](#imports)
|
|
- [ImportDeclaration](#importdeclaration)
|
|
- [ImportSpecifier](#importspecifier)
|
|
- [ImportDefaultSpecifier](#importdefaultspecifier)
|
|
- [ImportNamespaceSpecifier](#importnamespacespecifier)
|
|
- [ImportAttribute](#importattribute)
|
|
- [Exports](#exports)
|
|
- [ExportNamedDeclaration](#exportnameddeclaration)
|
|
- [ExportSpecifier](#exportspecifier)
|
|
- [ExportDefaultDeclaration](#exportdefaultdeclaration)
|
|
- [ExportAllDeclaration](#exportalldeclaration)
|
|
|
|
# Node objects
|
|
|
|
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
|
|
}
|
|
```
|
|
|
|
# Changes
|
|
|
|
### @babel/parser (Babylon) v7
|
|
|
|
Flow: Node renamed from `ExistentialTypeParam` to `ExistsTypeAnnotation` [#322](https://github.com/babel/babylon/pull/322)
|
|
|
|
Flow: Node renamed from `NumericLiteralTypeAnnotation` to `NumberLiteralTypeAnnotation` [babel/babylon#332](https://github.com/babel/babylon/pull/332)
|
|
|
|
Flow: Node `Variance` which replaces the string value of the `variance` field on several nodes [babel/babylon#333](https://github.com/babel/babylon/pull/333)
|
|
|
|
Flow: `ObjectTypeIndexer` location info matches Flow's better [babel/babylon#228](https://github.com/babel/babylon/pull/228)
|
|
|
|
Node `ForAwaitStatement` has been removed [#349](https://github.com/babel/babylon/pull/349) in favor of modifying `ForOfStatement`
|
|
|
|
`RestProperty` and `SpreadProperty` have been dropped in favor of `RestElement` and `SpreadElement`.
|
|
|
|
# Identifier
|
|
|
|
```js
|
|
interface Identifier <: Expression, Pattern {
|
|
type: "Identifier";
|
|
name: string;
|
|
}
|
|
```
|
|
|
|
An identifier. Note that an identifier may be an expression or a destructuring pattern.
|
|
|
|
# PrivateName
|
|
|
|
```js
|
|
interface PrivateName <: Node {
|
|
type: "PrivateName";
|
|
id: Identifier;
|
|
}
|
|
```
|
|
|
|
A Private Name Identifier.
|
|
|
|
# Literals
|
|
|
|
```js
|
|
interface Literal <: Expression { }
|
|
```
|
|
|
|
A literal token. May or may not represent an expression.
|
|
|
|
## RegExpLiteral
|
|
|
|
```js
|
|
interface RegExpLiteral <: Literal {
|
|
type: "RegExpLiteral";
|
|
pattern: string;
|
|
flags: string;
|
|
}
|
|
```
|
|
|
|
## NullLiteral
|
|
|
|
```js
|
|
interface NullLiteral <: Literal {
|
|
type: "NullLiteral";
|
|
}
|
|
```
|
|
|
|
## StringLiteral
|
|
|
|
```js
|
|
interface StringLiteral <: Literal {
|
|
type: "StringLiteral";
|
|
value: string;
|
|
}
|
|
```
|
|
|
|
## BooleanLiteral
|
|
|
|
```js
|
|
interface BooleanLiteral <: Literal {
|
|
type: "BooleanLiteral";
|
|
value: boolean;
|
|
}
|
|
```
|
|
|
|
## NumericLiteral
|
|
|
|
```js
|
|
interface NumericLiteral <: Literal {
|
|
type: "NumericLiteral";
|
|
value: number;
|
|
}
|
|
```
|
|
|
|
## BigIntLiteral
|
|
|
|
```js
|
|
interface BigIntLiteral <: Literal {
|
|
type: "BigIntLiteral";
|
|
value: string;
|
|
}
|
|
```
|
|
|
|
The `value` property is the string representation of the `BigInt` value. It doesn't include the suffix `n`.
|
|
|
|
## DecimalLiteral
|
|
|
|
```js
|
|
interface DecimalLiteral <: Literal {
|
|
type: "DecimalLiteral";
|
|
value: string;
|
|
}
|
|
```
|
|
|
|
The `value` property is the string representation of the `BigDecimal` value. It doesn't include the suffix `m`.
|
|
|
|
# Programs
|
|
|
|
```js
|
|
interface Program <: Node {
|
|
type: "Program";
|
|
interpreter: InterpreterDirective | null;
|
|
sourceType: "script" | "module";
|
|
body: [ Statement | ModuleDeclaration ];
|
|
directives: [ Directive ];
|
|
}
|
|
```
|
|
|
|
A complete program source tree.
|
|
|
|
Parsers must specify `sourceType` as `"module"` if the source has been parsed as an ES6 module. Otherwise, `sourceType` must be `"script"`.
|
|
|
|
# Functions
|
|
|
|
```js
|
|
interface Function <: Node {
|
|
id: Identifier | null;
|
|
params: [ Pattern ];
|
|
body: BlockStatement;
|
|
generator: boolean;
|
|
async: boolean;
|
|
}
|
|
```
|
|
|
|
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.
|
|
|
|
## BlockStatement
|
|
|
|
```js
|
|
interface BlockStatement <: Statement {
|
|
type: "BlockStatement";
|
|
body: [ Statement ];
|
|
directives: [ Directive ];
|
|
}
|
|
```
|
|
|
|
A block statement, i.e., a sequence of statements surrounded by braces.
|
|
|
|
## 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 | Expression;
|
|
right: Expression;
|
|
body: Statement;
|
|
}
|
|
```
|
|
|
|
A `for`/`in` statement.
|
|
|
|
## ForOfStatement
|
|
|
|
```js
|
|
interface ForOfStatement <: ForInStatement {
|
|
type: "ForOfStatement";
|
|
await: boolean;
|
|
}
|
|
```
|
|
|
|
# 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`, except when this is the child of an `ExportDefaultDeclaration`.
|
|
|
|
## VariableDeclaration
|
|
|
|
```js
|
|
interface VariableDeclaration <: Declaration {
|
|
type: "VariableDeclaration";
|
|
declarations: [ VariableDeclarator ];
|
|
kind: "var" | "let" | "const";
|
|
}
|
|
```
|
|
|
|
A variable declaration.
|
|
|
|
### VariableDeclarator
|
|
|
|
```js
|
|
interface VariableDeclarator <: Node {
|
|
type: "VariableDeclarator";
|
|
id: Pattern;
|
|
init: Expression | null;
|
|
}
|
|
```
|
|
|
|
A variable declarator.
|
|
|
|
# Misc
|
|
|
|
## Decorator
|
|
|
|
```js
|
|
interface Decorator <: Node {
|
|
type: "Decorator";
|
|
expression: Expression;
|
|
}
|
|
```
|
|
|
|
## Directive
|
|
|
|
```js
|
|
interface Directive <: Node {
|
|
type: "Directive";
|
|
value: DirectiveLiteral;
|
|
}
|
|
```
|
|
|
|
## DirectiveLiteral
|
|
|
|
```js
|
|
interface DirectiveLiteral <: StringLiteral {
|
|
type: "DirectiveLiteral";
|
|
}
|
|
```
|
|
|
|
## InterpreterDirective
|
|
|
|
```js
|
|
interface InterpreterDirective <: StringLiteral {
|
|
type: "InterpreterDirective";
|
|
}
|
|
```
|
|
|
|
# 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.
|
|
|
|
## Super
|
|
|
|
```js
|
|
interface Super <: Node {
|
|
type: "Super";
|
|
}
|
|
```
|
|
|
|
A `super` pseudo-expression.
|
|
|
|
## Import
|
|
|
|
```js
|
|
interface Import <: Node {
|
|
type: "Import";
|
|
}
|
|
```
|
|
|
|
A `import` pseudo-expression.
|
|
|
|
## ThisExpression
|
|
|
|
```js
|
|
interface ThisExpression <: Expression {
|
|
type: "ThisExpression";
|
|
}
|
|
```
|
|
|
|
A `this` expression.
|
|
|
|
## ArrowFunctionExpression
|
|
|
|
```js
|
|
interface ArrowFunctionExpression <: Function, Expression {
|
|
type: "ArrowFunctionExpression";
|
|
body: BlockStatement | Expression;
|
|
}
|
|
```
|
|
|
|
A fat arrow function expression, e.g., `let foo = (bar) => { /* body */ }`.
|
|
|
|
## YieldExpression
|
|
|
|
```js
|
|
interface YieldExpression <: Expression {
|
|
type: "YieldExpression";
|
|
argument: Expression | null;
|
|
delegate: boolean;
|
|
}
|
|
```
|
|
|
|
A `yield` expression.
|
|
|
|
## AwaitExpression
|
|
|
|
```js
|
|
interface AwaitExpression <: Expression {
|
|
type: "AwaitExpression";
|
|
argument: Expression | null;
|
|
}
|
|
```
|
|
|
|
A `await` expression.
|
|
|
|
## ArrayExpression
|
|
|
|
```js
|
|
interface ArrayExpression <: Expression {
|
|
type: "ArrayExpression";
|
|
elements: [ Expression | SpreadElement | null ];
|
|
}
|
|
```
|
|
|
|
An array expression.
|
|
|
|
## ObjectExpression
|
|
|
|
```js
|
|
interface ObjectExpression <: Expression {
|
|
type: "ObjectExpression";
|
|
properties: [ ObjectProperty | ObjectMethod | SpreadElement ];
|
|
}
|
|
```
|
|
|
|
An object expression.
|
|
|
|
### ObjectMember
|
|
|
|
```js
|
|
interface ObjectMember <: Node {
|
|
key: Expression;
|
|
computed: boolean;
|
|
decorators: [ Decorator ];
|
|
}
|
|
```
|
|
|
|
#### ObjectProperty
|
|
|
|
```js
|
|
interface ObjectProperty <: ObjectMember {
|
|
type: "ObjectProperty";
|
|
shorthand: boolean;
|
|
value: Expression;
|
|
}
|
|
```
|
|
|
|
#### ObjectMethod
|
|
|
|
```js
|
|
interface ObjectMethod <: ObjectMember, Function {
|
|
type: "ObjectMethod";
|
|
kind: "get" | "set" | "method";
|
|
}
|
|
```
|
|
|
|
## RecordExpression
|
|
|
|
```js
|
|
interface RecordExpression <: Expression {
|
|
type: "RecordExpression";
|
|
properties: [ ObjectProperty | ObjectMethod | SpreadElement ];
|
|
}
|
|
```
|
|
|
|
## TupleExpression
|
|
|
|
```js
|
|
interface TupleExpression <: Expression {
|
|
type: "TupleExpression";
|
|
elements: [ Expression | SpreadElement | null ];
|
|
}
|
|
```
|
|
|
|
## 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" | "throw"
|
|
}
|
|
```
|
|
|
|
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 | PrivateName;
|
|
right: Expression;
|
|
}
|
|
```
|
|
|
|
A binary operator expression. When `operator` is `in`, the `left` can be a `PrivateName`.
|
|
|
|
#### 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. It has short-circuiting behaviour if the `operator` is one of `"||="`, `"&&="`, and `"??="`.
|
|
|
|
#### 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.
|
|
|
|
### SpreadElement
|
|
|
|
```js
|
|
interface SpreadElement <: Node {
|
|
type: "SpreadElement";
|
|
argument: Expression;
|
|
}
|
|
```
|
|
|
|
### ArgumentPlaceholder
|
|
|
|
```js
|
|
interface ArgumentPlaceholder <: Node {
|
|
type: "ArgumentPlaceholder";
|
|
}
|
|
```
|
|
|
|
### MemberExpression
|
|
|
|
```js
|
|
interface MemberExpression <: Expression, Pattern {
|
|
type: "MemberExpression";
|
|
object: Expression | Super;
|
|
property: Expression | PrivateName;
|
|
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` or a `PrivateName`.
|
|
|
|
### OptionalMemberExpression
|
|
|
|
```js
|
|
interface OptionalMemberExpression <: Expression {
|
|
type: "OptionalMemberExpression";
|
|
object: Expression;
|
|
property: Expression | PrivateName;
|
|
computed: boolean;
|
|
optional: boolean;
|
|
}
|
|
```
|
|
|
|
An optional member expression is a part of the optional chain. When `optional` is `true`, it is the starting element of the optional chain. i.e. In `a?.b.c`, `?.b` is an optional member expression with `optional: true`, `.c` is an optional member expression. See this [gist](https://gist.github.com/JLHwung/567fb29fa2b82bbe164ad9067ff3290f) for more AST examples.
|
|
|
|
### BindExpression
|
|
|
|
```js
|
|
interface BindExpression <: Expression {
|
|
type: "BindExpression";
|
|
object: Expression | null;
|
|
callee: Expression;
|
|
}
|
|
```
|
|
|
|
If `object` is `null`, then `callee` should be a `MemberExpression`.
|
|
|
|
### Pipeline
|
|
|
|
These nodes are used by the Smart Pipeline to determine the type of the expression in a Pipeline Operator Expression. The F# Pipeline uses simple `BinaryExpression`s.
|
|
|
|
#### PipelineBody
|
|
|
|
```js
|
|
interface PipelineBody <: NodeBase {
|
|
type: "PipelineBody";
|
|
}
|
|
```
|
|
|
|
#### PipelineBareFunctionBody
|
|
|
|
```js
|
|
interface PipelineBody <: NodeBase {
|
|
type: "PipelineBareFunctionBody";
|
|
callee: Expression;
|
|
}
|
|
```
|
|
|
|
#### PipelineBareConstructorBody
|
|
|
|
```js
|
|
interface PipelineBareConstructorBody <: NodeBase {
|
|
type: "PipelineBareConstructorBody";
|
|
callee: Expression;
|
|
}
|
|
```
|
|
|
|
#### PipelineBareAwaitedFunctionBody
|
|
|
|
```js
|
|
interface PipelineBareConstructorBody <: NodeBase {
|
|
type: "PipelineTopicBody";
|
|
expression: Expression;
|
|
}
|
|
```
|
|
|
|
#### PipelineTopicBody
|
|
|
|
```js
|
|
interface PipelineBareConstructorBody <: NodeBase {
|
|
type: "PipelineBareAwaitedFunctionBody";
|
|
callee: Expression;
|
|
}
|
|
```
|
|
|
|
## 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 | Super | Import;
|
|
arguments: [ Expression | SpreadElement ];
|
|
}
|
|
```
|
|
|
|
A function or method call expression. When the `callee` is `Import`, the `arguments` must have only one `Expression` element.
|
|
|
|
## OptionalCallExpression
|
|
|
|
```js
|
|
interface OptionalCallExpression <: Expression {
|
|
type: "OptionalCallExpression";
|
|
callee: Expression;
|
|
arguments: [ Expression | SpreadElement ];
|
|
optional: boolean;
|
|
}
|
|
```
|
|
|
|
An optional call expression is a part of the optional chain. When `optional` is `true`, it is the starting element of the optional chain. i.e. In `f?.()()`, `?.()` is an optional call expression with `optional: true`, `()` is an optional call expression with `optional: false`. See this [gist](https://gist.github.com/JLHwung/567fb29fa2b82bbe164ad9067ff3290f) for more AST examples.
|
|
|
|
## NewExpression
|
|
|
|
```js
|
|
interface NewExpression <: CallExpression {
|
|
type: "NewExpression";
|
|
}
|
|
```
|
|
|
|
A `new` expression.
|
|
|
|
## SequenceExpression
|
|
|
|
```js
|
|
interface SequenceExpression <: Expression {
|
|
type: "SequenceExpression";
|
|
expressions: [ Expression ];
|
|
}
|
|
```
|
|
|
|
A sequence expression, i.e., a comma-separated sequence of expressions.
|
|
|
|
## ParenthesizedExpression
|
|
|
|
```js
|
|
interface ParenthesizedExpression <: Expression {
|
|
type "ParenthesizedExpression";
|
|
expression: Expression;
|
|
}
|
|
```
|
|
|
|
An expression wrapped by parentheses. By default `@babel/parser` does not create this node, unless the `createParenthesizedExpressions: true` option is passed.
|
|
|
|
## DoExpression
|
|
|
|
```js
|
|
interface DoExpression <: Expression {
|
|
type: "DoExpression";
|
|
body: BlockStatement;
|
|
}
|
|
```
|
|
|
|
# Template Literals
|
|
|
|
## TemplateLiteral
|
|
|
|
```js
|
|
interface TemplateLiteral <: Expression {
|
|
type: "TemplateLiteral";
|
|
quasis: [ TemplateElement ];
|
|
expressions: [ Expression ];
|
|
}
|
|
```
|
|
|
|
## TaggedTemplateExpression
|
|
|
|
```js
|
|
interface TaggedTemplateExpression <: Expression {
|
|
type: "TaggedTemplateExpression";
|
|
tag: Expression;
|
|
quasi: TemplateLiteral;
|
|
}
|
|
```
|
|
|
|
## TemplateElement
|
|
|
|
```js
|
|
interface TemplateElement <: Node {
|
|
type: "TemplateElement";
|
|
tail: boolean;
|
|
value: {
|
|
cooked: string | null;
|
|
raw: string;
|
|
};
|
|
}
|
|
```
|
|
|
|
# Patterns
|
|
|
|
```js
|
|
interface Pattern <: Node { }
|
|
```
|
|
|
|
## ObjectPattern
|
|
|
|
```js
|
|
interface AssignmentProperty <: ObjectProperty {
|
|
value: Pattern;
|
|
}
|
|
|
|
interface ObjectPattern <: Pattern {
|
|
type: "ObjectPattern";
|
|
properties: [ AssignmentProperty | RestElement ];
|
|
}
|
|
```
|
|
|
|
## ArrayPattern
|
|
|
|
```js
|
|
interface ArrayPattern <: Pattern {
|
|
type: "ArrayPattern";
|
|
elements: [ Pattern | null ];
|
|
}
|
|
```
|
|
|
|
## RestElement
|
|
|
|
```js
|
|
interface RestElement <: Pattern {
|
|
type: "RestElement";
|
|
argument: Pattern;
|
|
}
|
|
```
|
|
|
|
## AssignmentPattern
|
|
|
|
```js
|
|
interface AssignmentPattern <: Pattern {
|
|
type: "AssignmentPattern";
|
|
left: Pattern;
|
|
right: Expression;
|
|
}
|
|
```
|
|
|
|
# Classes
|
|
|
|
```js
|
|
interface Class <: Node {
|
|
id: Identifier | null;
|
|
superClass: Expression | null;
|
|
body: ClassBody;
|
|
decorators: [ Decorator ];
|
|
}
|
|
```
|
|
|
|
## ClassBody
|
|
|
|
```js
|
|
interface ClassBody <: Node {
|
|
type: "ClassBody";
|
|
body: [ ClassMethod | ClassPrivateMethod | ClassProperty | ClassPrivateProperty | StaticBlock ];
|
|
}
|
|
```
|
|
|
|
## ClassMethod
|
|
|
|
```js
|
|
interface ClassMethod <: Function {
|
|
type: "ClassMethod";
|
|
key: Expression;
|
|
kind: "constructor" | "method" | "get" | "set";
|
|
computed: boolean;
|
|
static: boolean;
|
|
decorators: [ Decorator ];
|
|
}
|
|
```
|
|
|
|
## ClassPrivateMethod
|
|
|
|
```js
|
|
interface ClassPrivateMethod <: Function {
|
|
type: "ClassPrivateMethod";
|
|
key: PrivateName;
|
|
kind: "method" | "get" | "set";
|
|
static: boolean;
|
|
decorators: [ Decorator ];
|
|
}
|
|
```
|
|
|
|
## ClassProperty
|
|
|
|
```js
|
|
interface ClassProperty <: Node {
|
|
type: "ClassProperty";
|
|
key: Expression;
|
|
value: Expression;
|
|
static: boolean;
|
|
computed: boolean;
|
|
}
|
|
```
|
|
|
|
## ClassPrivateProperty
|
|
|
|
```js
|
|
interface ClassPrivateProperty <: Node {
|
|
type: "ClassPrivateProperty";
|
|
key: PrivateName;
|
|
value: Expression;
|
|
static: boolean;
|
|
}
|
|
```
|
|
|
|
## StaticBlock
|
|
|
|
```js
|
|
interface StaticBlock <: Node {
|
|
type: "StaticBlock";
|
|
body: [ Statement ];
|
|
}
|
|
```
|
|
|
|
A static block proposed in https://github.com/tc39/proposal-class-static-block.
|
|
|
|
## ClassDeclaration
|
|
|
|
```js
|
|
interface ClassDeclaration <: Class, Declaration {
|
|
type: "ClassDeclaration";
|
|
id: Identifier;
|
|
}
|
|
```
|
|
|
|
## ClassExpression
|
|
|
|
```js
|
|
interface ClassExpression <: Class, Expression {
|
|
type: "ClassExpression";
|
|
}
|
|
```
|
|
|
|
## MetaProperty
|
|
|
|
```js
|
|
interface MetaProperty <: Expression {
|
|
type: "MetaProperty";
|
|
meta: Identifier;
|
|
property: Identifier;
|
|
}
|
|
```
|
|
|
|
# Modules
|
|
|
|
## ModuleDeclaration
|
|
|
|
```js
|
|
interface ModuleDeclaration <: Node { }
|
|
```
|
|
|
|
A module `import` or `export` declaration.
|
|
|
|
## ModuleSpecifier
|
|
|
|
```js
|
|
interface ModuleSpecifier <: Node {
|
|
local: Identifier;
|
|
}
|
|
```
|
|
|
|
A specifier in an import or export declaration.
|
|
|
|
## Imports
|
|
|
|
### ImportDeclaration
|
|
|
|
```js
|
|
interface ImportDeclaration <: ModuleDeclaration {
|
|
type: "ImportDeclaration";
|
|
importKind: null | "type" | "typeof" | "value";
|
|
specifiers: [ ImportSpecifier | ImportDefaultSpecifier | ImportNamespaceSpecifier ];
|
|
source: StringLiteral;
|
|
assertions?: [ ImportAttribute ];
|
|
}
|
|
```
|
|
|
|
An import declaration, e.g., `import foo from "mod";`.
|
|
|
|
> importKind is only set when `flow` plugin enabled in babel-parser
|
|
|
|
### ImportSpecifier
|
|
|
|
```js
|
|
interface ImportSpecifier <: ModuleSpecifier {
|
|
type: "ImportSpecifier";
|
|
imported: Identifier | StringLiteral;
|
|
}
|
|
```
|
|
|
|
An imported variable binding, e.g., `{foo}` in `import {foo} from "mod"` or `{foo as bar}` in `import {foo as bar} from "mod"`. The `imported` field refers to the name of the export imported from the module. The `local` field refers to the binding imported into the local module scope. If it is a basic named import, such as in `import {foo} from "mod"`, both `imported` and `local` are equivalent `Identifier` nodes; in this case an `Identifier` node representing `foo`. If it is an aliased import, such as in `import {foo as bar} from "mod"`, the `imported` field is an `Identifier` node representing `foo`, and the `local` field is an `Identifier` node representing `bar`.
|
|
|
|
### ImportDefaultSpecifier
|
|
|
|
```js
|
|
interface ImportDefaultSpecifier <: ModuleSpecifier {
|
|
type: "ImportDefaultSpecifier";
|
|
}
|
|
```
|
|
|
|
A default import specifier, e.g., `foo` in `import foo from "mod.js"`.
|
|
|
|
### ImportNamespaceSpecifier
|
|
|
|
```js
|
|
interface ImportNamespaceSpecifier <: ModuleSpecifier {
|
|
type: "ImportNamespaceSpecifier";
|
|
}
|
|
```
|
|
|
|
A namespace import specifier, e.g., `* as foo` in `import * as foo from "mod.js"`.
|
|
|
|
### ImportAttribute
|
|
|
|
```js
|
|
interface ImportAttribute <: Node {
|
|
type: "ImportAttribute";
|
|
key: Identifier;
|
|
value: StringLiteral;
|
|
}
|
|
```
|
|
|
|
An attribute specified on the ImportDeclaration.
|
|
|
|
## Exports
|
|
|
|
### ExportNamedDeclaration
|
|
|
|
```js
|
|
interface ExportNamedDeclaration <: ModuleDeclaration {
|
|
type: "ExportNamedDeclaration";
|
|
declaration: Declaration | null;
|
|
specifiers: [ ExportSpecifier ];
|
|
source: StringLiteral | null;
|
|
assertions?: [ ImportAttribute ];
|
|
}
|
|
```
|
|
|
|
An export named declaration, e.g., `export {foo, bar};`, `export {foo} from "mod";`, `export var foo = 1;` or `export * as foo from "bar";`.
|
|
|
|
Note:
|
|
|
|
- Having `declaration` populated with non-empty `specifiers` or non-null `source` results in an invalid state.
|
|
- If `source` is `null`, for each `specifier` of `specifiers`, `specifier.local` can not be a `StringLiteral`.
|
|
|
|
### ExportSpecifier
|
|
|
|
```js
|
|
interface ExportSpecifier <: ModuleSpecifier {
|
|
type: "ExportSpecifier";
|
|
exported: Identifier | StringLiteral;
|
|
local?: Identifier | StringLiteral;
|
|
}
|
|
```
|
|
|
|
An exported variable binding, e.g., `{foo}` in `export {foo}` or `{bar as foo}` in `export {bar as foo}`. The `exported` field refers to the name exported in the module. The `local` field refers to the binding into the local module scope. If it is a basic named export, such as in `export {foo}`, both `exported` and `local` are equivalent `Identifier` nodes; in this case an `Identifier` node representing `foo`. If it is an aliased export, such as in `export {bar as foo}`, the `exported` field is an `Identifier` node representing `foo`, and the `local` field is an `Identifier` node representing `bar`.
|
|
|
|
### ExportDefaultDeclaration
|
|
|
|
```js
|
|
interface OptFunctionDeclaration <: FunctionDeclaration {
|
|
id: Identifier | null;
|
|
}
|
|
|
|
interface OptClassDeclaration <: ClassDeclaration {
|
|
id: Identifier | null;
|
|
}
|
|
|
|
interface ExportDefaultDeclaration <: ModuleDeclaration {
|
|
type: "ExportDefaultDeclaration";
|
|
declaration: OptFunctionDeclaration | OptClassDeclaration | Expression;
|
|
}
|
|
```
|
|
|
|
An export default declaration, e.g., `export default function () {};` or `export default 1;`.
|
|
|
|
### ExportAllDeclaration
|
|
|
|
```js
|
|
interface ExportAllDeclaration <: ModuleDeclaration {
|
|
type: "ExportAllDeclaration";
|
|
source: StringLiteral;
|
|
assertions?: [ ImportAttribute ];
|
|
}
|
|
```
|
|
|
|
An export batch declaration, e.g., `export * from "mod";`.
|