请在 2024 Clojure 状态调查 中分享您的想法!

欢迎!请参阅关于页面,了解有关如何操作的更多详细信息。

0
ClojureScript
`:warning-handlers` 当前仅接受函数对象,而在通过 cljs.main 调用时不能发送。

为了协助构建工具,增强这些选项以支持使用 `requiring-resolve` 传递符号,从 1.10 版本开始。这样,构建工具就可以切换到类路径上的函数。

CLJS 可以用 https://github.com/clojure/clojure/blob/master/src/clj/clojure/core/server.clj#L263-L270 进行盗窃

我相信 :watch-fn 和 :watch-error-fn 已经通过 https://github.com/clojure/clojurescript/blob/47386d7c03e6fc36dc4f0145bd62377802ac1c02/src/main/clojure/cljs/closure.clj#L80-L109 做了正确的事情。

h4. 所需行为
现在,{{:warning-handlers}} 编译器选项能够通过它们的完全限定命名空间符号来指定函数。例如具有以下 {{cljs.edn}} 的 {{--compile-opts}}:

{:warning-handlers [some.namespace/warning-handler1
                    some.namespace/warning-handler2]}

如果存在并位于类路径上,则将找到和解析警告处理函数 {{warning-handler1}} 和 {{warning-handler2}}。

h4. 分析
* 正如上面所述,我们确实有一些先前的工作来解析编译器选项:{{:watch-fn}},{{:watch-error-fn}} 和 {{:preprocess}}。
* {{:warning-handlers}} 在几个地方绑定到 {{\*cljs-warning-handlers\*}},但只在一个函数中使用:{{cljs.analyzer/warning}}。
* 之前的工作使用了私人函数 {{cljs.closure/sym->var}} 进行解析。

h4. 方法
将 {{sym->var}} 函数从 {{cljs.closure}} 移动到 {{cljs.util}},使其成为公共的,并将 {{load-mutex}} 设置为参数。
利用 {{sym->var}} 从 {{cljs.analyzer/warning}} 解析每个警告处理程序。

h4. 测试
为 {{cljs.analyzer-api-tests}} 添加测试,以验证成功和符号配置错误路径。

h4. 实现说明
# 不考虑在 ClojureScript 中进行本地化
# {{sym->var}} 抛出 {{:compilation}} 阶段异常,我认为这对于警告处理程序来说是个不错的选择:[错误输出](https://clojure.org/reference/repl_and_main#_error_printing)
# {{sym->var}} 包含在 {{ex-info}} 的 map 中的相关编译器选项关键字。但是...在 {{cljs.analyzer/warning}} 中,我们实际上正在与 {{\*cljs-warning-handlers\*}} 的绑定一起工作,而不是编译器选项关键字。我假设引用 {{:warning-handlers}} 的错误来自 {{cljs.analyzer/warning}} 是可接受的,实际上它真正处理的是 {{\*cljs-warning-handlers\*}}。

h4. 观察
在 {{sym->var}} 和其使用方面有些奇怪,因为它在 sym 命名空间未找到时抛出异常,在 sym 未完全限定的情况下也会抛出异常,但对于未解析的 sym 错误则默默忽略。这对我来说 seemed a bit user cruel。对于这次更改,我引入了 {{sym->var-checked}} 并用它来抛出 sym 未解析时的异常。可能需要另立一个工单来考虑将 {{sym->var-checked}} 用于现有对 {{sym->var}} 的调用。
由于警告处理程序只有在 {{cljs.analyzer/warning}} 中才被解析,因此用户只能在出现警告时才了解到配置错误。这可能有优点也可能有缺点,具体取决于你的视角。或许在较早的时候从可能路径重复解析,只是为了更快地失败,这可能有所帮助。也许是从 {{cljs.cli/load-edn-opts}} 吧?

8 个答案

0

评论由:lread

这是我第一次尝试,请告诉我您的看法。

0

评论由:mfikes

CLJS-3074.patch 通过了 CI 和 CANARY (/)

0
_评论由:mfikes_

哎呀。我忘记 CLJS\-3074 在 Windows CI 中失败了(×)

特别是


在 (with-resolve-warning-handlers-test) (analyzer_api_tests.clj:52) 失败
94预期:(= "H1 :fn-arity\nH2 :fn-arity\n" (with-out-str (ana-api/analyze test-cenv test-env warning-form nil (clojure.edn/read-string "{:warning-handlers [cljs.analyzer-api-tests/resolve-handler1\n                                  cljs.analyzer-api-tests/resolve-handler2]}"))))
95实际上:(not (= "H1 :fn-arity\nH2 :fn-arity\n" "H1 :fn-arity\r\nH2 :fn-arity\r\n"))
96
97


失败的 CI 构建:[https://ci.appveyor.com/project/mfikes/clojurescript/builds/24361884](https://ci.appveyor.com/project/mfikes/clojurescript/builds/24361884)
0

评论由:lread

哦,对!谢谢 Mike,我马上修复。

0

评论由:lread

CLJS-3074-2.patch 替代 CLJS-3074.patch,并解决了 Windows CI 的失败问题。测试现在处理换行符差异。

0

评论由:mfikes

CLJS-3074-2.patch 已添加到补丁承运商(i)

0

评论由:mfikes

CLJS-3074-2.patch 通过 CI (/)

0
参考: https://clojure.atlassian.net/browse/CLJS-3074(由 gshayban 报告)
...