请在 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

费了些时间才找到它,但不要先请求包名,然后获取符号,而是这样做

(定义了包
  [^Class kls]
  (让 [kls (.getName kls)
    idx (clojure.string/last-index-of kls \.)]
    (当 (pos? idx)
      (subs kls 0 idx))))


0

评论者:alexmiller

补丁已撤销

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