请发表您的观点:2024 年 Clojure 调查问卷!https://www.surveymonkey.com/r/clojure2024

欢迎!请查看“关于”页面,获取有关如何使用本页面的更多信息。

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}} 的映射中。但是...在 {{cljs.analyzer/warning}} 中,我们正在处理 {{\*cljs-warning-handlers\*}} 的绑定,而不是编译器选项关键字。我假设从真正处理 {{\*cljs-warning-handlers\*}} 的 {{cljs.analyzer/warning}} 的错误中引用 {{:warning-handlers}} 是可接受的。

h4. 观察
符号{{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报告)
欢迎来到Clojure问答社区,在这里您可以向Clojure社区成员提问并获取答案。
...