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

欢迎!请参阅关于页面了解更多关于此平台的信息。

0
ClojureScript
tools.analyzer有一个方便的基于映射的分析结果AST格式。我们应该在ClojureScript分析器中使用此格式,以便已接受该格式的工具能够无缝地与ClojureScript一起工作。

工作进行中: https://github.com/frenchy64/clojurescript/pull/7



工作顺序
# 补丁 1:CLJS-2260
  #* :const
    #** 重命名:constant op到:const
    #** 添加:val条目
# 补丁 2:CLJS-2788
  #* :the-var
    #** 重命名:var-special op到:the-var
  #* :deftype
    #** 重命名:deftype* op到:deftype
  #* :defrecord
    #** 重命名:defrecord* op到:defrecord
  #* :with-meta
    #** 重命名:meta op到: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 op到:fn-method
    #** 重命名:expr条目到:body
    #** 重命名:max-fixed-arity到:fixed-arity
    #** 重命名:variadic到:variadic?
  #* :host-field/:host-call
    #** 将:dot op拆分为:host-field/:host-call
  #* :js-object/:js-array
    #** 将:js-value op拆分为:js-object/:js-array
  #* :case
    #** 重命名:case* op到:case
    #** 重命名:v到:test
    #** 添加:case-node op以便分组:case-test和:case-then op
# 补丁 5:CLJS-2800
  #* :new
    #** 重命名:ctor到:class
  #* :children
    #** 移动到tools.analyzer:children格式
       #*** :children是键值关键字的向量
       #*** 确保所有序列子代都是向量
    #** 使用从AST到children的兼容函数替换:children调用
# 补丁 6:CLJS-2801
  #* :quote
    #** 添加:quote op
      #*** 备注:将很多逻辑移动到处理 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
* 将 :t 在 :deftype/:defrecord 中重命名为 :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 的一部分
  • :op = :binding 树上节点在 CLJS AST 中似乎缺少 :children 条目,因此使用 :children 引用遍历 AST 在 :binding 节点上会缩短
0
by
参考:https://clojure.atlassian.net/browse/CLJS-1461(由 ambrosebs 报告)
...