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

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

-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
...