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

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

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

将找到并解析警告处理函数{{warning-handler1}}和{{warning-handler2}},前提是它们存在并且位于类路径上。

4. 分析
* 如上所述,我们已对编译器选项做过的工作:{{:watch-fn}},{{:watch-error-fn}}以及{{:preprocess}}。
* {{:warning-handlers}}绑定到{{\*cljs-warning-handlers\*}}在多个地方,但只有从一个函数: {{cljs.analyzer/warning}}中使用了它。
* 先前的工作利用了私有函数{{cljs.closure/sym->var}}来解析。

4. 方法
将{{sym->var}}函数从{{cljs.closure}}移动到{{cljs.util}},将其公开,并将{{load-mutex}}作为一个参数。
利用{{sym->var}}从{{cljs.analyzer/warning}}中解析每个警告处理程序。

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

4. 实施说明
# 未考虑自托管的ClojureScript
# {{sym->var}}抛出{{:compilation}}阶段异常,我认为这对于warning-handlers是适当的,考虑到选择的选项:https://clojure.org/reference/repl_and_main#_error_printing
# {{sym->var}}在{{ex-info}}'s地图中包括关联的编译器选项关键字。但是…在{{cljs.analyzer/warning}}中,我们正在处理绑定{{\*cljs-warning-handlers\*}}而不是编译器选项关键字。我假设从实际处理{{\*cljs-warning-handlers\*}}的{{cljs.analyzer/warning}}中的错误引用{{:warning-handlers}}是可以接受的。

4. 观察
由于 {{sym->var}} 和其使用方式有些古怪,当 sym 命名空间未找到时抛出异常,而当 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

评论由:lread

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

0

评论由:mfikes

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

0

评论由:mfikes

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

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