tools.analyzer 使用一个方便的基于 AST 的共同格式进行基于映射的分析结果。我们应该在 ClojureScript 分析器中使用此格式,这样接受此格式的工具就可以无缝地与 ClojureScript 一起工作。
工作进度中:
https://github.com/frenchy64/clojurescript/pull/7
工作顺序
# 补丁 1: CLJS-2260
#* :const
#** 将 :constant 操作重命名为 :const
#** 添加 :val 条目
# 补丁 2: CLJS-2788
#* :the-var
#** 将 :var-special 操作重命名为 :the-var
#* :deftype
#** 将 :deftype* 操作重命名为 :deftype
#* :defrecord
#** 将 :defrecord* 操作重命名为 :defrecord
#* :with-meta
#** 将 :meta 操作重命名为 :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 操作重命名为 :fn-method
#** 将 :expr 条目重命名为 :body
#** 将 :max-fixed-arity 重命名为 :fixed-arity
#** 将 :variadic 重命名为 :variadic?
#* :host-field/:host-call
#** 将 :dot 操作拆分为 :host-field/:host-call
#* :js-object/:js-array
#** 将 :js-value 操作拆分为 :js-object/:js-array
#* :case
#** 将 :case* 操作重命名为 :case
#** 将 :v 重命名为 :test
#** 添加 :case-node 操作以分组 :case-test 和 :case-then 操作
# 补丁 5: CLJS-2800
#* :new
#** 将 :ctor 重命名为 :class
#* :children
#** 移至 tools.analyzer :children 格式
#*** :children 是关键字键的向量
#*** 确保所有序列子节点都是向量
#** 用从 AST -> children 的兼容函数替换 :children 调用
# 补丁 6: CLJS-2801
#* :quote
#** 添加 :quote 操作
#*** 注意:这将在发射器中移动更多的逻辑处理 const。我们将 emit-constant 重命名为 emit-constant*,并将 emit-constant 修改为一个在将调用 emit-constant* 之前向每个表单发射元数据的函数。
#*** 注意:一些 emit* 的 defmethod 被提取到更高级别的函数辅助函数中(::{map,strtolist,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 parsing 中进行参数验证
#* 生成 `do` 块的合成 `:body?` 条目
#* 单元测试
#** 所有测试都放在最后
#* AST 格式文档
#** 从 tools.analyzer 修改
其他内容
* :const 操作中的 :type 字段
* :try/:catch
** 转换为 tools.analyzer.js 风格(:try 有 :catches,一个 :catch 节点的向量)
* :binding 的 :form 应为 :name
* 在 :deftype/:defrecord 中将 :t 重命名为 :name
* 命名空间限定 CLJS 特有操作