从 dart2js 或 dart-analyzer 获取类型化语法树

Posted

技术标签:

【中文标题】从 dart2js 或 dart-analyzer 获取类型化语法树【英文标题】:Getting the typed syntax tree from dart2js or dart-analyzer 【发布时间】:2018-01-16 04:32:10 【问题描述】:

我想准确地导出 dart 编译器(dart2js 或 dartdevc 或其他)或 dart 分析器的源子集,它可以 1. 转换 dart 代码字符串(或者更好的是每个字符串表示的字符串列表一个编译单元)转换成一个类型化的语法树,2.被翻译成js,3.在浏览器中运行。一般来说,是否有一个标记的子集可以满足这些要求,就是它,我如何才能找到它。

【问题讨论】:

【参考方案1】:

使用package:analyzer 完成#1 相当简单,它与用于提供IDE 提示和自动完成等的静态分析器相同。Dart 团队目前正在努力将他们的编译器前端统一在主API 上,但目前, analyzer 绝对可以满足您的大部分需求。

以下是获取语法树并对其进行分析的示例:https://github.com/thosakwe/analyzer_examples/blob/master/analyze_a_file/analyze_a_file.dart

至于 #2,您可能需要分叉 dart-lang/sdk 存储库并对 dart2js 进行自己的调整。它没有作为独立包发布。否则,您可以编写自己的编译器,这可能不会很有趣。

    我想你必须弄清楚如何让 #2 启动并运行,但假设你可以编译 javascript 源代码,你可以在编译后 eval 它。

要回答您的最后一个问题,不,AFAIK,没有可用的 dart2js 子集可让您创建自己的 Dart-to-JavaScript 编译器。

【讨论】:

答案描述了如何获取 ast 并运行 typer,但没有描述第三步:如何获取类型化的语法树? 示例中函数返回的CompilationUnit就是你要查找的语法树。 如何运行该示例“analyze_a_file.dart”?如何使用 pub 运行它?不是包裹?! 你应该克隆 repo,然后你可以运行示例。

以上是关于从 dart2js 或 dart-analyzer 获取类型化语法树的主要内容,如果未能解决你的问题,请参考以下文章

执行 `dart2js` 时会生成哪些文件?为啥?

dart2js 代码如何比 javascript 更快?

dart2js 后异步函数中两个 keyCode 的比较不正确

如何从 Javascript 调用 Dart 函数?

ReferenceError:未定义 DartObject

生成的 JS 文件太大