Skip to content

Commit 68e3c67

Browse files
committed
Enhanced to support generic types in method signatures
1 parent 6a6d12a commit 68e3c67

File tree

2 files changed

+41
-16
lines changed

2 files changed

+41
-16
lines changed

src/clojure/java/doc/impl.clj

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,27 @@
7474
(.getName ^Class class-sym)
7575
(throw (ex-info (str "Cannot resolve class: " class-part) {:class-name class-part}))))
7676

77+
(defn- strip-generics
78+
"Strip generic type parameters: Map<K,V> -> Map"
79+
[type-str]
80+
(loop [result type-str]
81+
(let [next (str/replace result #"<[^<>]*>" "")]
82+
(if (= result next)
83+
result
84+
(recur next)))))
85+
7786
(defn- extract-params
7887
"extract parameter types from a method signature: valueOf(char[] data) -> [char[]]"
7988
[signature]
8089
(let [params-str (->> signature
8190
(drop-while #(not= % \())
82-
rest
83-
(take-while #(not= % \)))
84-
(apply str))]
85-
(when-not (str/blank? params-str)
91+
rest
92+
(take-while #(not= % \)))
93+
(apply str))
94+
params-no-generics (strip-generics params-str)]
95+
(when-not (str/blank? params-no-generics)
8696
(mapv #(first (str/split (str/trim %) #"\s+"))
87-
(str/split params-str #",")))))
97+
(str/split params-no-generics #",")))))
8898

8999
(defn- get-method-detail [^org.jsoup.nodes.Document doc method]
90100
(let [method-signature (:signature method)
@@ -123,7 +133,8 @@
123133
(and (= (count expanded-sig-types) (count expanded-param-strs))
124134
(every? (fn [[sig-type param-str]]
125135
(or (= param-str "_")
126-
(= sig-type param-str)))
136+
(= sig-type param-str)
137+
(= (strip-generics sig-type) (strip-generics param-str))))
127138
(map vector expanded-sig-types expanded-param-strs))))))
128139

129140
(defn- method-matches? [signature method-name param-tags]
@@ -137,14 +148,15 @@
137148
(defn- compress-array-syntax
138149
"java to clojure param-tag syntax: String[][] -> String/2"
139150
[java-type]
140-
(cond
141-
;; arrays: String[][] -> String/2
142-
(str/includes? java-type "[]") (let [base-type (str/replace java-type #"\[\]" "")
143-
dims (count (re-seq #"\[" java-type))]
144-
(str base-type "/" dims))
145-
;; varargs: Object... -> Object/1
146-
(str/ends-with? java-type "...") (str/replace java-type #"[.]{3}$" "/1")
147-
:else java-type))
151+
(let [raw-type (strip-generics java-type)]
152+
(cond
153+
;; arrays: String[][] -> String/2
154+
(str/includes? raw-type "[]") (let [base-type (str/replace raw-type #"\[\]" "")
155+
dims (count (re-seq #"\[" raw-type))]
156+
(str base-type "/" dims))
157+
;; varargs: Object... -> Object/1
158+
(str/ends-with? raw-type "...") (str/replace raw-type #"[.]{3}$" "/1")
159+
:else raw-type)))
148160

149161
(defn- clojure-call-syntax
150162
"javadoc signature to clojure param-tag syntax: valueOf(char[] data) -> ^[char/1] String/valueOf"

test/clojure/java/doc/impl_test.clj

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,21 @@
9090
(testing "no parameters"
9191
(is (nil? (#'sut/extract-params "length()"))))
9292

93-
(testing "type with generics"
94-
(is (= ["List<String>"] (#'sut/extract-params "addAll(List<String> items)"))))
93+
(testing "type with generics stripped"
94+
(is (= ["List"] (#'sut/extract-params "addAll(List<String> items)"))))
95+
96+
(testing "generics with multiple type parameters"
97+
(is (= ["java.util.Map"] (#'sut/extract-params "run(java.util.Map<java.lang.String, ? extends OnnxTensorLike> inputs)"))))
98+
99+
(testing "multiple params with generics"
100+
(is (= ["String" "Map" "int"] (#'sut/extract-params "process(String name, Map<K,V> data, int count)"))))
101+
102+
(testing "nested generics"
103+
(is (= ["Map"] (#'sut/extract-params "transform(Map<String,List<Integer>> data)"))))
104+
105+
(testing "multiple params with nested generics"
106+
(is (= ["java.util.Map" "java.util.Map"]
107+
(#'sut/extract-params "run(java.util.Map<java.lang.String, ? extends OnnxTensorLike> inputs, java.util.Map<java.lang.String, ? extends OnnxValue> pinnedOutputs)"))))
95108

96109
(testing "array types"
97110
(is (= ["int[]"] (#'sut/extract-params "sort(int[] array)"))))

0 commit comments

Comments
 (0)