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. 实施说明
# 不考虑 Self-hosting ClojureScript
# {{sym->var}} 抛出 {{:compilation}} 阶段异常,我认为这对于 warning-handlers 选项来说是合适的,考虑到选择: https://clojure.org/reference/repl_and_main#_error_printing
# {{sym->var}} 在 {{ex-info}} 的 map 中包含相关的编译器选项关键词。但... 在 {{cljs.analyzer/warning}} 中,我们正在处理 {{\*cljs-warning-handlers\*}} 的绑定而不是编译器选项关键词。我假设在从 {{cljs.analyzer/warning}}(实际上处理 {{\*cljs-warning-handlers\*}})的错误中引用 {{:warning-handlers}} 是可以接受的。

h4. 观察
符号变量 {{sym->var}} 及其用法有些奇怪,因为当找不到 sym 环境时,它们会抛出异常;而当 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) 中失败
期望值: (= "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]}"))))
实际值:(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 报告)
...