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

欢迎!请参考关于页面以获取更多使用说明。

–1
记录和类型

通过DynamicClassLoader加载的类,.getPackage返回nil。像CIDER和vim-fireplace这样的工具依赖于这些信息来执行键入提示等功能。

(.getPackage String) ;; => #<Package package java.lang, Java Platform API Specification, version 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 所报告)
...