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

欢迎!请参阅关于页面以了解更多此网站的信息。

-1
记录和类型

由 DynamicClassLoader 加载的类返回 .getPackage 为 nil。CIDER 和 vim-fireplace 等工具依赖此信息来实现如完成提示等功能。

(.getPackage String) ;; => #<Package package java.lang, Java 平台 API 规范,版本 1.7> (deftype T []) (.getPackage T) ;; => nil

建议:在 DynamicClassLoader.defineClass() 中,对正在定义的类调用 definePackage()(类似于 URLClassLoader 所做的)。

补丁:clj-1550-v4.patch

审查:Alex Miller

19 答案

0

评论由:bozhidar 参与

原始代码可以像 JVM 一样从二进制名称中推导出包名(取最后一个点之前的前缀)。

我对您提出的解决方案并不完全理解。能否详细阐述一下?

我认为应该撤销这个解决方案,并由用户空间根据二进制名称计算包。

如果在新 JDK 中使用且无需在用户空间和 Clojure 中进行更改,那对我来说没关系。到现在为止,我已经失去了 Clojure 将会修复该问题的信心。:-)

0
_评论由:gshayban 参与

https://github.com/clojure-emacs/orchard/blob/db6d8a7be853b52c9986c5af8d009639644bb390/src/orchard/java.clj#L157-L159

花了很长时间跟踪下来,但是不是先请求包名然后获取符号,而是这样做:

(defn package
  [^Class kls]
  (let [kls (.getName kls)
    idx (clojure.string/last-index-of kls \.)]
    (when (pos? idx)
      (subs kls 0 idx))))


0

评论人:alexmiller

补丁已撤销

0
参考: https://clojure.atlassian.net/browse/CLJ-1550 (由 bozhidar 提出)
...