2024年Clojure状态调查! 中分享您的想法。

欢迎!有关如何使用此功能的更多信息,请参阅关于页面。

0
ClojureScript
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 特定的操作

3 个答案

0
by

评论由:ambrosebs 发布

在我提出的此问题的正文中,我提出了一系列潜在补丁,以便每个补丁都易于筛选。

对于这些步骤,能给我一些反馈吗?是否应该合并或拆分一些步骤?

0
by

评论由:benedek.fazekas 发布

在查看https://github.com/clojure-emacs/refactor-nrepl/issues/195 时记录我的发现,以防有人发现它有用。

根据上述问题,我认为 CLJS-2051 与此票据有关。我还发现,

  • :raw-forms 包含宏展开的阶段,包括原始形式,不是 CLJS ASTs 的一部分
  • CLJS ASTs 中的 :op = :binding 节点似乎缺少 :children 条目,因此使用 :children 引用遍历 AST 在 :binding 节点处中断
0
参考:https://clojure.atlassian.net/browse/CLJS-1461(由ambrosebs报告)
...