Details
-
Type:
Defect
-
Status:
Closed
-
Priority:
Minor
-
Resolution: Completed
-
Affects Version/s: Release 1.3
-
Fix Version/s: Release 1.4
-
Component/s: None
-
Labels:None
-
Patch:Code and Test
-
Approval:Ok
Description
If the keywords of a protocol's method map are namespaced, the map is accepted, but lookup fails since lookup uses non-namespaced keywords.
See TLOG-4 for an actual case of this being an issue.
Work-around for namespaced keywords with extend:
don't use namespaced keywords
Work-around for syntax-quoting with extend-type or extend-protocol:
use extend with non-namespaced keywords
Possible solutions:
- Inside extend, remove namespace of keywords
- or
- Inside extend, error on namespaced keywords.
- Inside emit-hinted-impl, only grab name portion of symbols before converting to keyword.
Simple test case to see the issue.
=> (defprotocol P (self [p])) P => (extend String P {::self identity}) nil => (self "foo") #<IllegalArgumentException java.lang.IllegalArgumentException: No implementation of method: :self of protocol: #'user/P found for class: java.lang.String> => (defmacro try-extend-type [c] `(extend-type String P (self [p#] p#))) #'user/try-extend-type => (try-extend-type String) nil => (self "foo") #<IllegalArgumentException java.lang.IllegalArgumentException: No implementation of method: :self of protocol: #'user/P found for class: java.lang.String> => (keys (get-in P [:impls String])) (:user/self)=> (defprotocol P (self [p])) P => (extend String P {::self identity}) nil => (self "foo") #<IllegalArgumentException java.lang.IllegalArgumentException: No implementation of method: :self of protocol: #'user/P found for class: java.lang.String> => (defmacro try-extend-type [c] `(extend-type String P (self [p#] p#))) #'user/try-extend-type => (try-extend-type String) nil => (self "foo") #<IllegalArgumentException java.lang.IllegalArgumentException: No implementation of method: :self of protocol: #'user/P found for class: java.lang.String> => (keys (get-in P [:impls String])) (:user/self)