`: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}} 开始?