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}} 设置为参数。
在 {{cljs.analyzer/warning}} 中使用 {{sym->var}} 解析每个警告处理器。

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

h4. 实施说明
# 未考虑 ClojureScript 的自我托管
# {{sym->var}} 会抛出 {{:compilation}} 阶段的异常,我认为对于警告处理器来说这种选择是合适的: https://clojure.org/reference/repl_and_main#_error_printing
# {{sym->var}} 包括编译器选项关键字在内的关联映射在 {{ex-info}}'s map 中。但是在 {{cljs.analyzer/warning}} 中,我们处理的是 {{\*cljs-warning-handlers\*}} 而不是编译器选项关键字。我假设从 {{:warning-handlers}} 在 {{cljs.analyzer/warning}} 发生的错误引用是可接受的,但实际上它是处理 {{\*cljs-warning-handlers\*}}。

h4. 观察
符号{{sym->var}}及其使用方式有些奇怪,因为它在找不到sym ns时抛出异常,当sym没有完全限定时也抛出异常,但对于未解析的sym错误却悄悄忽略。对我来说这似乎对用户有点太苛刻了。为了这个变更,我引入并使用了{{sym->var-checked}},当sym未解析时抛出异常。可能还需要单独的工单来考虑在现有对{{sym->var}}的调用中使用{{sym->var-checked}}
因为警告处理器只会在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\"\n\"H2 :fn-arity\"\n)95 实际::(不是(= \"H1 :fn-arity\"\n\"H2 :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添加到补丁Tender(i)

0

评论由:mfikes 提出

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

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