Skip to content

Commit 548ce69

Browse files
committed
feat: validate method values
1 parent 45d77e3 commit 548ce69

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,9 +412,8 @@
412412
(defn resolve-hinted-method
413413
"Given a class, method name and param-tags, resolves to the unique matching method.
414414
Returns nil if no match or if ambiguous."
415-
[class method-name param-tags]
415+
[methods param-tags]
416416
(let [param-classes (tags-to-maybe-classes param-tags)
417-
methods (members class method-name)
418417
matching (filter #(signature-matches? param-classes %) methods)]
419418
(when (= 1 (count matching))
420419
(first matching))))

src/main/clojure/clojure/tools/analyzer/passes/jvm/validate.clj

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,25 @@
5353
:form form}
5454
(source-info env))))))))
5555

56+
(defmethod -validate :method-value
57+
[{:keys [class method kind param-tags methods env] :as ast}]
58+
(let [class (u/maybe-class class)]
59+
(if param-tags
60+
(if-let [m (resolve-hinted-method methods param-tags)]
61+
(assoc ast
62+
:class class
63+
:methods [m]
64+
:validated? true)
65+
(throw (ex-info (str "param-tags " (pr-str param-tags)
66+
" insufficient to resolve " (name kind) " method "
67+
method " in class " (.getName ^Class class))
68+
(merge {:class class
69+
:method method
70+
:param-tags param-tags}
71+
(source-info env)))))
72+
(assoc ast
73+
:class class
74+
:validated? true))))
5675

5776
(defmethod -validate :set!
5877
[{:keys [target form env] :as ast}]

0 commit comments

Comments
 (0)