(;module: [lux #- char] (lux (data [text] text/format (coll [list "list/" Functor]))) ["$" //]) ## Types (do-template [ ] [(def: #export $;Type (#$;Primitive ))] [boolean #$;Boolean] [byte #$;Byte] [short #$;Short] [int #$;Int] [long #$;Long] [float #$;Float] [double #$;Double] [char #$;Char] ) (def: #export (class name params) (-> Text (List $;Generic) $;Type) (#$;Generic (#$;Class name params))) (def: #export (var name) (-> Text $;Type) (#$;Generic (#$;Var name))) (def: #export (wildcard bound) (-> (Maybe [$;Bound $;Generic]) $;Type) (#$;Generic (#$;Wildcard bound))) (def: #export (array depth elemT) (-> Nat $;Type $;Type) (case depth +0 elemT _ (#$;Array (array (n.dec depth) elemT)))) (def: #export (binary-name class) (-> Text Text) (text;replace-all "." "/" class)) (def: #export (descriptor type) (-> $;Type Text) (case type (#$;Primitive prim) (case prim #$;Boolean "Z" #$;Byte "B" #$;Short "S" #$;Int "I" #$;Long "J" #$;Float "F" #$;Double "D" #$;Char "C") (#$;Array sub) (format "[" (descriptor sub)) (#$;Generic generic) (case generic (#$;Class class params) (format "L" (binary-name class) ";") (^or (#$;Var name) (#$;Wildcard ?bound)) (descriptor (#$;Generic (#$;Class "java.lang.Object" (list))))) )) (def: #export (signature type) (-> $;Type Text) (case type (#$;Primitive prim) (case prim #$;Boolean "Z" #$;Byte "B" #$;Short "S" #$;Int "I" #$;Long "J" #$;Float "F" #$;Double "D" #$;Char "C") (#$;Array sub) (format "[" (signature sub)) (#$;Generic generic) (case generic (#$;Class class params) (let [=params (if (list;empty? params) "" (format "<" (|> params (list/map (|>. #$;Generic signature)) (text;join-with "")) ">"))] (format "L" (binary-name class) =params ";")) (#$;Var name) (format "T" name ";") (#$;Wildcard #;None) "*" (^template [ ] (#$;Wildcard (#;Some [ bound])) (format (signature (#$;Generic bound)))) ([#$;Upper "+"] [#$;Lower "-"])) )) ## Methods (def: #export (method args return exceptions) (-> (List $;Type) (Maybe $;Type) (List $;Generic) $;Method) {#$;args args #$;return return #$;exceptions exceptions}) (def: #export (method-descriptor method) (-> $;Method Text) (format "(" (text;join-with "" (list/map descriptor (get@ #$;args method))) ")" (case (get@ #$;return method) #;None "V" (#;Some return) (descriptor return)))) (def: #export (method-signature method) (-> $;Method Text) (format "(" (|> (get@ #$;args method) (list/map signature) (text;join-with "")) ")" (case (get@ #$;return method) #;None "V" (#;Some return) (signature return)) (|> (get@ #$;exceptions method) (list/map (|>. #$;Generic signature (format "^"))) (text;join-with ""))))