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* defmethods 被因式分解为高阶函数辅助函数(:{map,list,vector,set} -> emit\-{map,list,vector,set})并现在从 emit 和 emit-constant 调用。
#*** 注意:analyze-const 现在记录了常量,但丢弃了分析结果。
#* :list
#** 移除 :list 操作
#*** 注意:由引用的 :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 特定的操作