2024年Clojure状态调查!中分享您的想法。

欢迎!请参阅关于页面了解更多关于本站如何运作的信息。

+5
错误
来自邮件列表 http://groups.google.com/group/clojure/msg/c41d909bd58e4534。在不知情的情况下使用已弃用的命名空间或变量很容易。文档警告信息很小,没有编译器警告。

*建议:*

*新增{{\*warn-on-deprecated*}}动态变量,默认为false
*加载{{{{:deprecated true}}}}命名空间时警告至stderr。
*分析{{{{:deprecated true}}}}变量时警告至stderr。
*展开{{{{:deprecated true}}}}宏时警告至stderr。
*新增系统属性 clojure.compiler.warn-on-deprecated
*使用 clojure.compiler.warn-on-deprecated 编译Clojure本身
*修复Clojure中的弃用警告(replicate, clear-agent-errors)
*使用 :deprecation 标签标记 clojure.parallel 为弃用

示例


(set! *warn-on-deprecated* true)

;; 使用已弃用的变量(在编译时)
(defn ^:deprecated f [x] x)
(f 5)
;; => 弃用警告,NO_SOURCE_PATH:7:1 : 变量#'user/f 已弃用

;; 使用已弃用的宏(在宏展开时)
(defmacro ^:deprecated m [x] x)
(m 5)
;; => 弃用警告,NO_SOURCE_PATH:7:1 : 宏#'user/m 已弃用

;; 使用已弃用的命名空间(在加载时)
(ns foo {:deprecated "1.1"})
(ns bar (:require foo))
;; => 弃用警告:从命名空间`bar`加载已弃用的命名空间`foo`


*补丁:* 706-deprecated-ns-var-warnings-tested-3.diff

*问题:* 弃用警告的默认值应该是true吗?升级的人员可能会看到新警告,这可能会令人惊讶。

*默认应该告警还是不告警弃用的内容?

25 回答

0

评论者:alexmiller

在这里,我们可以采取一种折中的方法,在编译器中默认关闭它,但在工具(如lein)中默认打开它。但也有一定概率,无论我倾向于哪种方法,Rich的偏好可能会在我那里被推翻。 :)

我认为在命名空间前缀周围创建更多的复杂性不太可能有助于推动这个问题的解决。

0

评论者:cezarykosko

上传了一个补丁,它合并了Luke的var/ns相关的补丁,并添加了测试。
然而,该补丁并没有警告用户关于已弃用的宏,我假设我需要调整它,是吗?

此外,我无法调整描述,那么我该如何处理Alex列表中的第一条?

0

评论者:jafingerhut

Cezary,我已经提升了你在JIRA的权限,因此你现在应该能够编辑工单。请刷新页面并再次尝试。

0
评论者:alexmiller

* 核心中的第一个更改应该将 {{if}} 替换为 {{when}}。
* 命名空间弃用警告能否包含更多关于这个发生地点的信息?
* 我很难在手动测试中重现弃用命名空间警告(见下文)。有关 binding+printf 的条件似乎已经满足,所以这里似乎有什么奇怪之处。我认为这可能与 {{\*err*}} 刷新有关。似乎在 {{(println "Warning: loading deprecated ns" lib)}} 那里会更好。


(set! *warn-on-deprecated* true)
(ns foo {:deprecated true})
(ns bar (:require foo))


* src/jvm/clojure/lang/Compile.java 需要添加对 clojure.compile.warn-on-deprecated RT 标志的支持
* 我认为我们应该在Clojure构建本身中打开 warn-on-deprecated(在 build.xml 中)
* 如果你这样做,Clojure构建本身存在以下弃用警告,我们应该修复这些警告

     [java] 弃用警告,clojure/core_proxy.clj:112:75 : var #'clojure.core/replicate 已标记为弃用
     [java] 弃用警告,clojure/genclass.clj:149:41 : var #'clojure.core/replicate 已标记为弃用
     [java] 弃用警告,clojure/genclass.clj:235:65 : var #'clojure.core/replicate 已标记为弃用
     [java] 弃用警告,clojure/test/junit.clj:118:22 : var #'clojure.test/file-position 已标记为弃用

* 在 ns 元中标记 clojure.parallel 为弃用
0
by

评论者:cezarykosko

上传了一个新的diff文件,以解决评论并对宏展开添加了警告。

然而,就命名空间废弃警告而言,代码只打印了当前命名空间,不知道是否有合适的方法来获取文件/行组合。

0
by

评论者:alexmiller

再来一次(希望是最最后一次),然后我想我们就没问题了

  • 由于我们现在已经将范围扩展到包括ns,所以应该更新warn-on-deprecated的文档字符串。
  • 在废弃的ns警告消息中,我们能否将其改为:"废弃警告:从命名空间bar加载废弃的命名空间foo."
  • 在宏和变量警告中,我们能否将"被标记为废弃"改为只是"废弃"?
  • 清理test/clojure/test_clojure/compilation/deprecated.clj中的悬挂括号

感谢你在这一方面的贡献!!

0
by

评论者:alexmiller

标记为已预筛选,由Rich查看。

0
by

评论者:simongray

这个功能怎么了?它还在进行中吗?

0
by
参考:[https://clojure.atlassian.net/browse/CLJ-706](https://clojure.atlassian.net/browse/CLJ-706)(由stu报告)
0
by

希望在下一个Clojure版本中看到这个功能。

by
嗨,Eugen,我们现在有了clj-kondo这样的工具,它会提醒我们关于弃用函数/变量的使用。


在本地/开发环境中,您可以使用clojure-lsp(它使用clj-kondo)在IDE级别上获得警告

在CI中,您可以使用clojure-lsp命令行API,或者将kondo作为codelinter


我认为没有理由将此添加到编译器中。

https://github.com/clj-kondo/clj-kondo/blob/43f8c0613150e047c73a79ee8adb9f3cc46476de/analysis/README.md#data
...