File tree Expand file tree Collapse file tree
src/main/clojure/clojure/tools/analyzer/jvm Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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
You can’t perform that action at this time.
0 commit comments