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* 的 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 特有操作

3 答案

0
by

由:ambrosebs发表评论

在这个问题的主体中,我提出了一系列潜在的补丁,以便每个补丁都可以轻松筛选。

可以对这些步骤给出一些反馈吗?是否有步骤应该合并或拆分?

0
by

由:benedek.fazekas 发表评论

在查看 https://github.com/clojure-emacs/refactor-nrepl/issues/195 时记录我的发现,供他人参考。

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

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