satisfies? recognizes reify, consistent with instance?

A reify's protocol methods are instance-local, so they aren't in the global type
registry that type-satisfies? consults — satisfies? returned false for a reify
even when it implemented the protocol. Check the protocols the reify records on
itself (the same :jolt/protocols list instance? uses), matching short names like
instance? does. Covers single- and multi-protocol reify.
This commit is contained in:
Yogthos 2026-06-14 23:00:48 -04:00
parent 5a1532167c
commit 236dca28d9
2 changed files with 19 additions and 5 deletions

View file

@ -42,6 +42,12 @@
"(do (defprotocol P (m [_])) (defrecord R [] P (m [_] 1)) (satisfies? P (->R)))"]
["satisfies? false" "false"
"(do (defprotocol P (m [_])) (defrecord R []) (satisfies? P (->R)))"]
["satisfies? reify" "true"
"(do (defprotocol P (m [_])) (satisfies? P (reify P (m [_] 1))))"]
["satisfies? reify multi-protocol" "[true true]"
"(do (defprotocol P (m [_])) (defprotocol Q (n [_])) (let [r (reify P (m [_] 1) Q (n [_] 2))] [(satisfies? P r) (satisfies? Q r)]))"]
["satisfies? reify other proto" "false"
"(do (defprotocol P (m [_])) (defprotocol Q (n [_])) (satisfies? Q (reify P (m [_] 1))))"]
["instance? record" "true"
"(do (defrecord R [a]) (instance? R (->R 1)))"]
["dot constructor" "5"