使用 babel 实现一个自创的 js 语法
用 babel 实现用 @!
标记一个函数时,将为函数自动加上调用日志打印的功能
1 | // 如 |
根据文档可知要在 packages/babel-parser
里找逻辑
注意,请先 fork babel 源码
1 | # 在 babel 源码目录里执行 |
test-parser.js 内容:
1 | // test-parser.js |
可通过下面的命令执行 jest:
1 | # 通过下面的命令执行 jest |
执行结果报错信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
测试自定义语法 @@ parse -> ast
✕ should parse
测试自定义语法 @@ parse -> ast > should parse
SyntaxError: Unexpected token (1:9)
at instantiate (/babel-lib/packages/babel-parser/lib/parse-error/credentials.js:27:32)
at constructor (/babel-lib/packages/babel-parser/lib/parse-error.js:41:41)
at Parser.raise (/babel-lib/packages/babel-parser/lib/tokenizer/index.js:1062:19)
at Parser.unexpected (/babel-lib/packages/babel-parser/lib/tokenizer/index.js:1095:16)
at Parser.parseIdentifierName (/babel-lib/packages/babel-parser/lib/parser/expression.js:1641:18)
at Parser.parseIdentifier (/babel-lib/packages/babel-parser/lib/parser/expression.js:1624:23)
at Parser.parseFunctionId (/babel-lib/packages/babel-parser/lib/parser/statement.js:991:79)
at Parser.parseFunction (/babel-lib/packages/babel-parser/lib/parser/statement.js:961:22)
at Parser.parseFunctionStatement (/babel-lib/packages/babel-parser/lib/parser/statement.js:603:17)
at Parser.parseStatementContent (/babel-lib/packages/babel-parser/lib/parser/statement.js:272:21) {
code: 'BABEL_PARSER_SYNTAX_ERROR',
reasonCode: 'UnexpectedToken',
loc: Position { line: 1, column: 9, index: 9 },
pos: [Getter/Setter]
}
观察错误信息,发现关键错误点在 parseIdentifierName
里报 unexpected
错误,下面调试下逻辑。
1 | // packages/babel-parser/src/parser/expression.ts |
所以问题是 babel 不认识 @! 标识符,那么处理一下:
1 | // packages/babel-parser/src/tokenizer/types.js |
1 | // packages/babel-parser/src/parser/statement.ts |
再次执行 jest 成功:
查看 ast 结果,logThisFunc 已标记:
// TODO 编写插件,实现转换逻辑