直接评估 JavaScript AST

dav*_*ers 5 javascript evaluation abstract-syntax-tree node.js

我维护doctest。该库使用 ECMAScript 解析器 (Esprima) 从 JavaScript 源文件中提取注释,然后在这些注释中识别 \xe2\x80\x9cdoctests\xe2\x80\x9d。例如:

\n
\'use strict\';\n\n//  identity :: a -> a\n//\n//  > identity (42)\n//  42\nconst identity = x => x;\n
Run Code Online (Sandbox Code Playgroud)\n

然后 AST 被丢弃,JavaScript 代码被拼接到原始源文本中代替文档测试。想象一下类似下面的事情:

\n
\'use strict\';\n\n//  identity :: a -> a\n//\n__doctest.enqueue (() => {\n  assert.strictEqual (identity (42), 42);\n});\nconst identity = x => x;\n
Run Code Online (Sandbox Code Playgroud)\n

然后,修改后的源文本将保存到文件系统中。最后,新创建的文件通过 导入require

\n

这种方法有效,但比较迂回:

\n
SourceFile -> SourceText -> AST -> SourceText -> SourceFile -> SourceText -> AST -> Result\n=(foo.js)=    (original) --------> (modified)    =(tmp.js)=    ====(require)====\n
Run Code Online (Sandbox Code Playgroud)\n

相反,我想这样做:

\n
SourceFile -> SourceText -> AST -> AST -> Result\n
Run Code Online (Sandbox Code Playgroud)\n

我知道如何进行AST -> AST转变。我不知道如何评估修改后的 AST。当然,没有必要将 AST 转换为 JavaScript 源文本,只是让 Node.js 读取源文本并重新创建 AST!

\n