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

欢迎!请参阅 关于 页面以了解更多该是如何工作的。

0
ClojureScript
`:warning-handlers` 目前接受函数对象,而这些对象无法通过调用 cljs.main 时发送。

为了协助构建工具,增强这些选项以支持在 1.10 中通过 `requiring-resolve` 接收符号。这样,构建工具就可以引用类路径上的函数。

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` 的地图中包含相关的编译器选项关键字。但是在 {{cljs.analyzer/warning}} 中,我们操作的是绑定 {{\* cljs-warning-handlers\*}} 而不是编译器选项关键字。我假设在从处理 {{\* cljs-warning-handlers\*}} 的 {{cljs.analyzer/warning}} 中产生错误时引用 {{:warning-handlers}} 是可接受的。

h4. 观察
在使用 # {{sym->var}} 及其用法时,存在一些奇特之处,它们在 sym ns 未找到时会抛出异常,在 sym 未经全限定时会抛出异常,但对于 sym 未解析的错误却安静地忽略了。这对我来说似乎有点对用户不友好。针对这个变更,我引入并使用 {{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 (x) 中失败的记录

特别是


在 (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
0

评论者:lread

哦哦!感谢 Mike,我会尽快修复。

0
by

评论者:lread

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

0
by

评论者:mfikes

CLJS-3074-2.patch 已添加到 Patch Tender (i)

0
by

评论者:mfikes

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

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