* add missing ExportNamespaceSpecifier in spec.md * add constrain note in ExportNamedDeclaration Co-authored-by: 刘地军 <dijun.ldj@antgroup.com>
30 KiB
These are the core @babel/parser (babylon) AST node types.
- Node objects
- Changes
- Identifier
- PrivateName
- Literals
- Programs
- Functions
- Statements
- Declarations
- Misc
- Expressions
- Super
- Import
- ThisExpression
- ArrowFunctionExpression
- YieldExpression
- AwaitExpression
- ArrayExpression
- ObjectExpression
- RecordExpression
- TupleExpression
- FunctionExpression
- Unary operations
- Binary operations
- ConditionalExpression
- CallExpression
- OptionalCallExpression
- NewExpression
- SequenceExpression
- ParenthesizedExpression
- DoExpression
- ModuleExpression
- Template Literals
- Patterns
- Classes
- Modules
Node objects
AST nodes are represented as Node objects, which may have any prototype inheritance but which implement the following interface:
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):
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):
interface Position {
line: number; // >= 1
column: number; // >= 0
}
Changes
@babel/parser (Babylon) v7
Flow: Node renamed from ExistentialTypeParam to ExistsTypeAnnotation #322
Flow: Node renamed from NumericLiteralTypeAnnotation to NumberLiteralTypeAnnotation babel/babylon#332
Flow: Node Variance which replaces the string value of the variance field on several nodes babel/babylon#333
Flow: ObjectTypeIndexer location info matches Flow's better babel/babylon#228
Node ForAwaitStatement has been removed #349 in favor of modifying ForOfStatement
RestProperty and SpreadProperty have been dropped in favor of RestElement and SpreadElement.
Identifier
interface Identifier <: Expression, Pattern {
type: "Identifier";
name: string;
}
An identifier. Note that an identifier may be an expression or a destructuring pattern.
PrivateName
interface PrivateName <: Node {
type: "PrivateName";
id: Identifier;
}
A Private Name Identifier.
Literals
interface Literal <: Expression { }
A literal token. May or may not represent an expression.
RegExpLiteral
interface RegExpLiteral <: Literal {
type: "RegExpLiteral";
pattern: string;
flags: string;
}
NullLiteral
interface NullLiteral <: Literal {
type: "NullLiteral";
}
StringLiteral
interface StringLiteral <: Literal {
type: "StringLiteral";
value: string;
}
BooleanLiteral
interface BooleanLiteral <: Literal {
type: "BooleanLiteral";
value: boolean;
}
NumericLiteral
interface NumericLiteral <: Literal {
type: "NumericLiteral";
value: number;
}
BigIntLiteral
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
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
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
interface Function <: Node {
id: Identifier | null;
params: [ Pattern ];
body: BlockStatement;
generator: boolean;
async: boolean;
}
A function declaration or expression.
Statements
interface Statement <: Node { }
Any statement.
ExpressionStatement
interface ExpressionStatement <: Statement {
type: "ExpressionStatement";
expression: Expression;
}
An expression statement, i.e., a statement consisting of a single expression.
BlockStatement
interface BlockStatement <: Statement {
type: "BlockStatement";
body: [ Statement ];
directives: [ Directive ];
}
A block statement, i.e., a sequence of statements surrounded by braces.
EmptyStatement
interface EmptyStatement <: Statement {
type: "EmptyStatement";
}
An empty statement, i.e., a solitary semicolon.
DebuggerStatement
interface DebuggerStatement <: Statement {
type: "DebuggerStatement";
}
A debugger statement.
WithStatement
interface WithStatement <: Statement {
type: "WithStatement";
object: Expression;
body: Statement;
}
A with statement.
Control flow
ReturnStatement
interface ReturnStatement <: Statement {
type: "ReturnStatement";
argument: Expression | null;
}
A return statement.
LabeledStatement
interface LabeledStatement <: Statement {
type: "LabeledStatement";
label: Identifier;
body: Statement;
}
A labeled statement, i.e., a statement prefixed by a break/continue label.
BreakStatement
interface BreakStatement <: Statement {
type: "BreakStatement";
label: Identifier | null;
}
A break statement.
ContinueStatement
interface ContinueStatement <: Statement {
type: "ContinueStatement";
label: Identifier | null;
}
A continue statement.
Choice
IfStatement
interface IfStatement <: Statement {
type: "IfStatement";
test: Expression;
consequent: Statement;
alternate: Statement | null;
}
An if statement.
SwitchStatement
interface SwitchStatement <: Statement {
type: "SwitchStatement";
discriminant: Expression;
cases: [ SwitchCase ];
}
A switch statement.
SwitchCase
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
interface ThrowStatement <: Statement {
type: "ThrowStatement";
argument: Expression;
}
A throw statement.
TryStatement
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
interface CatchClause <: Node {
type: "CatchClause";
param?: Pattern;
body: BlockStatement;
}
A catch clause following a try block.
Loops
WhileStatement
interface WhileStatement <: Statement {
type: "WhileStatement";
test: Expression;
body: Statement;
}
A while statement.
DoWhileStatement
interface DoWhileStatement <: Statement {
type: "DoWhileStatement";
body: Statement;
test: Expression;
}
A do/while statement.
ForStatement
interface ForStatement <: Statement {
type: "ForStatement";
init: VariableDeclaration | Expression | null;
test: Expression | null;
update: Expression | null;
body: Statement;
}
A for statement.
ForInStatement
interface ForInStatement <: Statement {
type: "ForInStatement";
left: VariableDeclaration | Expression;
right: Expression;
body: Statement;
}
A for/in statement.
ForOfStatement
interface ForOfStatement <: ForInStatement {
type: "ForOfStatement";
await: boolean;
}
Declarations
interface Declaration <: Statement { }
Any declaration node. Note that declarations are considered statements; this is because declarations can appear in any statement context.
FunctionDeclaration
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
interface VariableDeclaration <: Declaration {
type: "VariableDeclaration";
declarations: [ VariableDeclarator ];
kind: "var" | "let" | "const";
}
A variable declaration.
VariableDeclarator
interface VariableDeclarator <: Node {
type: "VariableDeclarator";
id: Pattern;
init: Expression | null;
}
A variable declarator.
Misc
Decorator
interface Decorator <: Node {
type: "Decorator";
expression: Expression;
}
Directive
interface Directive <: Node {
type: "Directive";
value: DirectiveLiteral;
}
DirectiveLiteral
interface DirectiveLiteral <: StringLiteral {
type: "DirectiveLiteral";
}
InterpreterDirective
interface InterpreterDirective <: StringLiteral {
type: "InterpreterDirective";
}
Expressions
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
interface Super <: Node {
type: "Super";
}
A super pseudo-expression.
Import
interface Import <: Node {
type: "Import";
}
A import pseudo-expression.
ThisExpression
interface ThisExpression <: Expression {
type: "ThisExpression";
}
A this expression.
ArrowFunctionExpression
interface ArrowFunctionExpression <: Function, Expression {
type: "ArrowFunctionExpression";
body: BlockStatement | Expression;
}
A fat arrow function expression, e.g., let foo = (bar) => { /* body */ }.
YieldExpression
interface YieldExpression <: Expression {
type: "YieldExpression";
argument: Expression | null;
delegate: boolean;
}
A yield expression.
AwaitExpression
interface AwaitExpression <: Expression {
type: "AwaitExpression";
argument: Expression | null;
}
A await expression.
ArrayExpression
interface ArrayExpression <: Expression {
type: "ArrayExpression";
elements: [ Expression | SpreadElement | null ];
}
An array expression.
ObjectExpression
interface ObjectExpression <: Expression {
type: "ObjectExpression";
properties: [ ObjectProperty | ObjectMethod | SpreadElement ];
}
An object expression.
ObjectMember
interface ObjectMember <: Node {
key: Expression;
computed: boolean;
decorators: [ Decorator ];
}
ObjectProperty
interface ObjectProperty <: ObjectMember {
type: "ObjectProperty";
shorthand: boolean;
value: Expression;
}
ObjectMethod
interface ObjectMethod <: ObjectMember, Function {
type: "ObjectMethod";
kind: "get" | "set" | "method";
}
RecordExpression
interface RecordExpression <: Expression {
type: "RecordExpression";
properties: [ ObjectProperty | ObjectMethod | SpreadElement ];
}
TupleExpression
interface TupleExpression <: Expression {
type: "TupleExpression";
elements: [ Expression | SpreadElement | null ];
}
FunctionExpression
interface FunctionExpression <: Function, Expression {
type: "FunctionExpression";
}
A function expression.
Unary operations
UnaryExpression
interface UnaryExpression <: Expression {
type: "UnaryExpression";
operator: UnaryOperator;
prefix: boolean;
argument: Expression;
}
A unary operator expression.
UnaryOperator
enum UnaryOperator {
"-" | "+" | "!" | "~" | "typeof" | "void" | "delete" | "throw"
}
A unary operator token.
UpdateExpression
interface UpdateExpression <: Expression {
type: "UpdateExpression";
operator: UpdateOperator;
argument: Expression;
prefix: boolean;
}
An update (increment or decrement) operator expression.
UpdateOperator
enum UpdateOperator {
"++" | "--"
}
An update (increment or decrement) operator token.
Binary operations
BinaryExpression
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
enum BinaryOperator {
"==" | "!=" | "===" | "!=="
| "<" | "<=" | ">" | ">="
| "<<" | ">>" | ">>>"
| "+" | "-" | "*" | "/" | "%"
| "**" | "|" | "^" | "&" | "in"
| "instanceof"
| "|>"
}
A binary operator token.
AssignmentExpression
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
enum AssignmentOperator {
"=" | "+=" | "-=" | "*=" | "/=" | "%=" | "**="
| "<<=" | ">>=" | ">>>="
| "|=" | "^=" | "&="
| "||=" | "&&=" | "??="
}
An assignment operator token.
LogicalExpression
interface LogicalExpression <: Expression {
type: "LogicalExpression";
operator: LogicalOperator;
left: Expression;
right: Expression;
}
A logical operator expression.
LogicalOperator
enum LogicalOperator {
"||" | "&&" | "??"
}
A logical operator token.
SpreadElement
interface SpreadElement <: Node {
type: "SpreadElement";
argument: Expression;
}
ArgumentPlaceholder
interface ArgumentPlaceholder <: Node {
type: "ArgumentPlaceholder";
}
MemberExpression
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
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 for more AST examples.
BindExpression
interface BindExpression <: Expression {
type: "BindExpression";
object: Expression | null;
callee: Expression;
}
If object is null, then callee should be a MemberExpression.
ConditionalExpression
interface ConditionalExpression <: Expression {
type: "ConditionalExpression";
test: Expression;
alternate: Expression;
consequent: Expression;
}
A conditional expression, i.e., a ternary ?/: expression.
CallExpression
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
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 for more AST examples.
NewExpression
interface NewExpression <: CallExpression {
type: "NewExpression";
}
A new expression.
SequenceExpression
interface SequenceExpression <: Expression {
type: "SequenceExpression";
expressions: [ Expression ];
}
A sequence expression, i.e., a comma-separated sequence of expressions.
ParenthesizedExpression
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
interface DoExpression <: Expression {
type: "DoExpression";
body: BlockStatement;
async: boolean;
}
ModuleExpression
interface ModuleExpression <: Expression {
type: "ModuleExpression";
body: Program
}
A inline module expression proposed in https://github.com/tc39/proposal-js-module-blocks.
TopicReference
interface TopicReference <: Expression {
type: "TopicReference";
}
A topic reference to be used inside the body of a Hack-style pipe expression.
Template Literals
TemplateLiteral
interface TemplateLiteral <: Expression {
type: "TemplateLiteral";
quasis: [ TemplateElement ];
expressions: [ Expression ];
}
TaggedTemplateExpression
interface TaggedTemplateExpression <: Expression {
type: "TaggedTemplateExpression";
tag: Expression;
quasi: TemplateLiteral;
}
TemplateElement
interface TemplateElement <: Node {
type: "TemplateElement";
tail: boolean;
value: {
cooked: string | null;
raw: string;
};
}
Patterns
interface Pattern <: Node { }
ObjectPattern
interface AssignmentProperty <: ObjectProperty {
value: Pattern;
}
interface ObjectPattern <: Pattern {
type: "ObjectPattern";
properties: [ AssignmentProperty | RestElement ];
}
ArrayPattern
interface ArrayPattern <: Pattern {
type: "ArrayPattern";
elements: [ Pattern | null ];
}
RestElement
interface RestElement <: Pattern {
type: "RestElement";
argument: Pattern;
}
AssignmentPattern
interface AssignmentPattern <: Pattern {
type: "AssignmentPattern";
left: Pattern;
right: Expression;
}
Classes
interface Class <: Node {
id: Identifier | null;
superClass: Expression | null;
body: ClassBody;
decorators: [ Decorator ];
}
ClassBody
interface ClassBody <: Node {
type: "ClassBody";
body: [ ClassMethod | ClassPrivateMethod | ClassProperty | ClassPrivateProperty | StaticBlock ];
}
ClassMethod
interface ClassMethod <: Function {
type: "ClassMethod";
key: Expression;
kind: "constructor" | "method" | "get" | "set";
computed: boolean;
static: boolean;
decorators: [ Decorator ];
}
ClassPrivateMethod
interface ClassPrivateMethod <: Function {
type: "ClassPrivateMethod";
key: PrivateName;
kind: "method" | "get" | "set";
static: boolean;
decorators: [ Decorator ];
}
ClassProperty
interface ClassProperty <: Node {
type: "ClassProperty";
key: Expression;
value: Expression;
static: boolean;
computed: boolean;
}
ClassPrivateProperty
interface ClassPrivateProperty <: Node {
type: "ClassPrivateProperty";
key: PrivateName;
value: Expression;
static: boolean;
}
StaticBlock
interface StaticBlock <: Node {
type: "StaticBlock";
body: [ Statement ];
}
A static block proposed in https://github.com/tc39/proposal-class-static-block.
ClassDeclaration
interface ClassDeclaration <: Class, Declaration {
type: "ClassDeclaration";
id: Identifier;
}
ClassExpression
interface ClassExpression <: Class, Expression {
type: "ClassExpression";
}
MetaProperty
interface MetaProperty <: Expression {
type: "MetaProperty";
meta: Identifier;
property: Identifier;
}
Modules
ModuleDeclaration
interface ModuleDeclaration <: Node { }
A module import or export declaration.
ModuleSpecifier
interface ModuleSpecifier <: Node {
local: Identifier;
}
A specifier in an import or export declaration.
Imports
ImportDeclaration
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
flowplugin enabled in babel-parser
ImportSpecifier
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
interface ImportDefaultSpecifier <: ModuleSpecifier {
type: "ImportDefaultSpecifier";
}
A default import specifier, e.g., foo in import foo from "mod.js".
ImportNamespaceSpecifier
interface ImportNamespaceSpecifier <: ModuleSpecifier {
type: "ImportNamespaceSpecifier";
}
A namespace import specifier, e.g., * as foo in import * as foo from "mod.js".
ImportAttribute
interface ImportAttribute <: Node {
type: "ImportAttribute";
key: Identifier;
value: StringLiteral;
}
An attribute specified on the ImportDeclaration.
Exports
ExportNamedDeclaration
interface ExportNamedDeclaration <: ModuleDeclaration {
type: "ExportNamedDeclaration";
declaration: Declaration | null;
specifiers: [ ExportSpecifier | ExportNamespaceSpecifier ];
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
declarationpopulated with non-emptyspecifiersor non-nullsourceresults in an invalid state. - If
sourceisnull, for eachspecifierofspecifiers,specifier.localcan not be aStringLiteral. - If
specifierscontainsExportNamespaceSpecifier, it must have only oneExportNamespaceSpecifier.
ExportSpecifier
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.
ExportNamespaceSpecifier
interface ExportNamespaceSpecifier <: ModuleSpecifier {
type: "ExportNamespaceSpecifier";
exported: Identifier;
}
A namespace export specifier, e.g., * as foo in export * as foo from "mod.js".
ExportDefaultDeclaration
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
interface ExportAllDeclaration <: ModuleDeclaration {
type: "ExportAllDeclaration";
source: StringLiteral;
assertions?: [ ImportAttribute ];
}
An export batch declaration, e.g., export * from "mod";.
Smart-mix pipelines
These types are deprecated.
They are used by the deprecated smart-mix pipe operator to determine
the type of a pipe expression's the body expression.
The Hack and F# pipe operators use simple BinaryExpressions.
PipelineBody
interface PipelineBody <: NodeBase {
type: "PipelineBody";
}
PipelineBareFunctionBody
interface PipelineBody <: NodeBase {
type: "PipelineBareFunctionBody";
callee: Expression;
}
PipelineBareConstructorBody
interface PipelineBareConstructorBody <: NodeBase {
type: "PipelineBareConstructorBody";
callee: Expression;
}
PipelineBareAwaitedFunctionBody
interface PipelineBareConstructorBody <: NodeBase {
type: "PipelineTopicBody";
expression: Expression;
}
PipelineTopicBody
interface PipelineBareConstructorBody <: NodeBase {
type: "PipelineBareAwaitedFunctionBody";
callee: Expression;
}