Literal 字面量
没有 UndefinedLiteral
Identifier 标识符
变量名、属性名、参数名。
Statement 语句
statement 是语句,它是可以独立执行的单位,比如:
- break
- continue
- debugger
- return
- if 语句
- while 语句
- for 语句
- 声明语句
- 表达式语句
- …
我们写的每一条可以独立执行的代码都是语句。
Declaration 声明语句
声明语句是一种特殊的语句,它执行的逻辑是在作用域内声明一个变量、函数、class、import、export 等。
Expression 表达式
expression 是表达式,特点是执行完以后有返回值,这是和语句 (statement) 的区别。
节点类型
Class
整个 class 的内容是 ClassBody,属性是 ClassProperty,方法是ClassMethod(通过 kind 属性来区分是 constructor 还是 method)。
Modules
import
// import 有 3 种语法:
// 1. named import:
import {c, d} from 'c';
// 2. default import:
import a from 'a';
// 3. namespaced import:
import * as b from 'b';
这 3 种语法都对应 ImportDeclaration 节点,但是 specifiers 属性不同,分别对应 ImportSpicifier、ImportDefaultSpecifier、ImportNamespaceSpcifier。
export
// export 也有3种语法:
// 1. named export:
export { b, d};
// 2. default export:
export default a;
// 3. all export:
export * from 'c';
Program & Directive
program 是代表整个程序的节点,它有 body 属性代表程序体,存放 statement 数组,就是具体执行的语句的集合。还有 directives 属性,存放Directive 节点,比如”use strict” 这种指令会使用 Directive 节点表示。
File & Comment
babel 的 AST 最外层节点是 File,它有 program、comments、tokens 等属性,分别存放 Program 程序体、注释、token 等,是最外层节点。
AST 的公共属性
- type: AST 节点的类型
- start、end、loc:start 和 end 代表该节点对应的源码字符串的开始和结束下标,不区分行列。而 loc 属性是一个对象,有 line 和 column 属性分别记录开始和结束行列号。
- leadingComments、innerComments、trailingComments: 表示开始的注释、中间的注释、结尾的注释,因为每个 AST 节点中都可能存在注释,而且可能在开始、中间、结束这三种位置,通过这三个属性来记录和 Comment 的关联。
- extra:记录一些额外的信息,用于处理一些特殊情况。比如 StringLiteral 修改 value 只是值的修改,而修改 extra.raw 则可以连同单双引号一起修改。