Skip to content

Commit ed440b0

Browse files
[src-files] Correctly resolve source files for non-base JDK classes
1 parent 70765d7 commit ed440b0

File tree

6 files changed

+23
-6
lines changed

6 files changed

+23
-6
lines changed

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ commands:
5454
files:
5555
description: Files to consider when creating the cache key
5656
type: string
57-
default: "deps.edn project.clj"
57+
default: "deps.edn project.clj download-jdk-sources.sh"
5858
cache_version:
5959
type: string
6060
description: "Key used to identify unique cache"

.circleci/download-jdk-sources.sh

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ wget "$URL" -O full-src.zip
99
unzip -q full-src.zip
1010
cp -r jdk*/src/java.base/share/classes java.base
1111
cp -r jdk*/src/java.desktop/share/classes java.desktop
12-
zip -qr $DEST java.base java.desktop
13-
rm -rf java.base java.desktop jdk* full-src.zip
12+
cp -r jdk*/src/java.sql/share/classes java.sql
13+
zip -qr $DEST java.base java.desktop java.sql
14+
rm -rf java.base java.desktop java.sql jdk* full-src.zip

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
## master (unreleased)
44

55
- [#353](https://github.com/clojure-emacs/orchard/pull/353): Stacktrace: flag Clojure functions as duplicate.
6+
- [#355](https://github.com/clojure-emacs/orchard/pull/355): Java: resolve source files for non-base JDK classes.
67

78
## 0.36.0 (2025-06-29)
89

src/orchard/java/compatibility.clj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,18 @@
1616
[class-or-sym]
1717
(module-name-macro class-or-sym))
1818

19+
(defmacro ^:private contains-in-boot-modules-macro [class]
20+
;; On JDK8, always return nil.
21+
(when (>= misc/java-api-version 11)
22+
`(let [^Class klass# ~class]
23+
(when-some [module# (some-> klass# .getModule)]
24+
(.contains (.modules (java.lang.ModuleLayer/boot)) module#)))))
25+
26+
(defn is-in-boot-module?
27+
"Return true if the class belongs to a module that is among boot modules."
28+
[class]
29+
(contains-in-boot-modules-macro class))
30+
1931
(defmacro get-field-value-macro [field obj]
2032
(if (>= misc/java-api-version 11)
2133
`(try (if (or (.canAccess ~field ~obj)

src/orchard/java/source_files.clj

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,13 +89,15 @@
8989
(defn- locate-source-url-in-jdk-sources
9090
"Try to find the source file for `klass` in sources included with JDK."
9191
^URL [^Class klass]
92-
;; Heuristic: JDK classes have `nil` classloader.
93-
(when (and @jdk-sources (nil? (.getClassLoader klass)))
92+
;; JDK classes belong to a boot module on JDK11+, and source parsing doesn't
93+
;; work for JDK8 anyway.
94+
(when (and @jdk-sources (compat/is-in-boot-module? klass))
9495
(let [source-file (class->sourcefile-path klass)]
9596
(-> (combine-archive-url @jdk-sources source-file)
9697
verify-url-readable))))
9798

9899
#_(locate-source-url-in-jdk-sources Thread)
100+
#_(locate-source-url-in-jdk-sources java.sql.Connection)
99101

100102
(defn- parse-jar-path-from-url [^URL url]
101103
(when-let [[_ path] (some->> url .getFile (re-matches #"file:(.+\.jar)!.*"))]

test/orchard/java/source_files_test.clj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
(when util/jdk-sources-present?
88
(deftest class->source-file-url-test
99
(is (src-files/class->source-file-url mx.cider.orchard.LruMap)) ;; classpath
10-
(is (src-files/class->source-file-url Thread)) ;; JDK
10+
(is (src-files/class->source-file-url Thread)) ;; JDK
11+
(is (src-files/class->source-file-url java.sql.Connection)) ;; JDK other module
1112
(is (src-files/class->source-file-url clojure.lang.PersistentVector)) ;; Clojure
1213
(is (nil? (src-files/class->source-file-url clojure.core.Eduction))))) ;; record
1314

0 commit comments

Comments
 (0)