分享您的想法,参与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 : var #'user/f is deprecated

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

;; 已弃用人名空间的使用(在加载时)
(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_

* 在core.clj的第一个更改中的{{if}}应该改为{{when}}。
* 命名空间弃用警告是否可以包含更多关于它发生位置的详细信息?
* 我在手动测试中难以重现弃用ns警告(见下文)。绑定的+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

评论者:cezarykosko

上传了一个新的差异,解决了评论并增加了对宏展开的警告。

至于命名空间弃用的警告,尽管代码只是打印当前命名空间,但不知道是否有一种 decent 的方式来获取文件/行组合。

0

评论者:alexmiller

再进行一次(希望是最后一次)审核后,我认为我们就可以通过了

  • 现在我们已经将范围扩展到包括命名空间,因此应该更新 warn-on-deprecated 的文档字符串。
  • 在弃用命名空间警告消息中,我们能否改为:"弃用警告:从命名空间 bar 加载弃用命名空间 foo
  • 在宏和变量警告中,我们能否将 "is tagged as deprecated" 改为 "is deprecated"?
  • 清理 test/clojure/test_clojure/compilation/deprecated.clj 中的悬挂括号。

感谢您对这个工作的贡献!!

0

评论者:alexmiller

标记为已预审,供Rich审阅。

0

评论者:simongray

这个特性怎么了?它还来吗?

0
0

非常希望能在clojure的下一个版本中看到这个功能。

by
你好,Eugen,我们现在有像clj-kondo这样的工具,它会警告我们已弃用函数/变量的使用。


在本地/开发时间内,您可以使用clojure-lsp(它使用clj-kondo)在IDE级别上警告您。

在持续集成(CI)中,您可以使用clojure-lsp命令行API,或者将kondo用作代码检查器。


我觉得没有必要将其添加到编译器中。

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