tools.analyzer有一个方便的基于映射的分析结果AST格式。我们应该在ClojureScript分析器中使用此格式,以便已接受该格式的工具能够无缝地与ClojureScript一起工作。
工作进行中:
https://github.com/frenchy64/clojurescript/pull/7
工作顺序
# 补丁 1:CLJS-2260
#* :const
#** 重命名:constant op到:const
#** 添加:val条目
# 补丁 2:CLJS-2788
#* :the-var
#** 重命名:var-special op到:the-var
#* :deftype
#** 重命名:deftype* op到:deftype
#* :defrecord
#** 重命名:defrecord* op到:defrecord
#* :with-meta
#** 重命名:meta op到:with-meta
# 补丁 3:CLJS-2789
#* :def
#** 添加:ns条目
#* :throw
#** 重命名:throw条目到:exception
#* :try
#** 重命名:try条目到:body
#* :letfn
#** 重命名:expr条目到:body
#* :let/:loop
#** 重命名:expr条目到:body
#* :invoke
#** 重命名:f到:fn
# 补丁 4:CLJS-2797
#* :fn-method
#** 重命名:method op到:fn-method
#** 重命名:expr条目到:body
#** 重命名:max-fixed-arity到:fixed-arity
#** 重命名:variadic到:variadic?
#* :host-field/:host-call
#** 将:dot op拆分为:host-field/:host-call
#* :js-object/:js-array
#** 将:js-value op拆分为:js-object/:js-array
#* :case
#** 重命名:case* op到:case
#** 重命名:v到:test
#** 添加:case-node op以便分组:case-test和:case-then op
# 补丁 5:CLJS-2800
#* :new
#** 重命名:ctor到:class
#* :children
#** 移动到tools.analyzer:children格式
#*** :children是键值关键字的向量
#*** 确保所有序列子代都是向量
#** 使用从AST到children的兼容函数替换:children调用
# 补丁 6:CLJS-2801
#* :quote
#** 添加:quote op
#*** 备注:将很多逻辑移动到处理 emitter 中的 const。我们将 emit-constant 重命名为 emit-constant*,并将 emit-constant 转换为一个在将任务委托给 emit-constant* 之前向每个表单发射元数据的函数。
#*** 备注:某些 emit* defmethods 被提取为高阶函数助手(:map, list, vector, set -> emit-{map, list, vector, set})并且现在从 emit 和 emit-constant 中调用。
#*** 备注:analyze-const 现在注册常量,但丢弃了分析结果。
#* :list
#** 移除 :list 操作
#*** 备注:被 'quote'd :const 吞并。analyze-list 仍然用于注册常量。
#* 注意:CLJS-2807 具体修复了回归问题
补丁 7:CLJS-2803
#* :record-value
#** 移除 :record-value 操作,替换为 :const
#** 为记录字面量添加单元测试
# 补丁 8:CLJS-2257
#* :var/:binding/:local/:js-var
#** 解糖点符号
#** 将 :var 操作分解为 :var/:binding/:local/:js-var
#** 如果 :js-shadowed-by-local,则发射 :local 操作
#** 将 :local 改为 #{:fn :letfn :let :arg ...}
# 在 'var 解析中进行参数验证
# 为合成的 `do` 块添加 :body? 条目
# 单元测试
#** 将所有内容全部添加到末尾
# AST 格式文档
#** 从 tools.analyzer 的文档中进行修改
其他内容
* :const 操作中的 :type 字段
* :try/:catch
** 转换为 tools.analyzer.js 风格(:try 有 :catches,一个 :catch 节点的向量)
* :binding 的 :form 应为 :name
* 将 :t 在 :deftype/:defrecord 中重命名为 :name
* 命名空间限定 CLJS 特定操作