Skip to content

Commit 596544e

Browse files
committed
feat: resolve-hinted-method
1 parent cfb1f54 commit 596544e

1 file changed

Lines changed: 26 additions & 0 deletions

File tree

  • src/main/clojure/clojure/tools/analyzer/jvm

src/main/clojure/clojure/tools/analyzer/jvm/utils.clj

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,32 @@
393393
(defn param-tags-of [sym]
394394
(-> sym meta :param-tags))
395395

396+
(defn- tags-to-maybe-classes
397+
[tags]
398+
(mapv (fn [tag]
399+
(when-not (= '_ tag)
400+
(maybe-class tag)))
401+
tags))
402+
403+
(defn- signature-matches?
404+
[param-classes method]
405+
(let [method-params (:parameter-types method)]
406+
(and (= (count param-classes) (count method-params))
407+
(every? (fn [[pc mp]]
408+
(or (nil? pc) ;; nil is a wildcard
409+
(= pc (maybe-class mp))))
410+
(map vector param-classes method-params)))))
411+
412+
(defn resolve-hinted-method
413+
"Given a class, method name and param-tags, resolves to the unique matching method.
414+
Returns nil if no match or if ambiguous."
415+
[class method-name param-tags]
416+
(let [param-classes (tags-to-maybe-classes param-tags)
417+
methods (members class method-name)
418+
matching (filter #(signature-matches? param-classes %) methods)]
419+
(when (= 1 (count matching))
420+
(first matching))))
421+
396422
(defn ns->relpath [s]
397423
(-> s str (s/replace \. \/) (s/replace \- \_) (str ".clj")))
398424

0 commit comments

Comments
 (0)