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
#** 将 :children 移动到 tools.analyzer :children 格式
#*** :children 是关键字键的向量
#*** 确保所有序列子项都是向量
#** 将 :children 调用替换为从 AST -> children 的兼容函数
# 补丁 6: CLJS-2801
#* :quote
#** 添加 :quote 操作符
#*** 注意:这也将大量逻辑移至处理 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
* 在 :deftype/:defrecord 中将 :t 重命名为 :name
* 使用命名空间限定语气 CLJS 特定的操作