diff options
Diffstat (limited to '')
-rw-r--r-- | stdlib/source/lux/target/jvm/reflection.lux | 22 | ||||
-rw-r--r-- | stdlib/source/lux/target/jvm/type.lux | 84 | ||||
-rw-r--r-- | stdlib/source/lux/target/jvm/type/lux.lux | 4 |
3 files changed, 101 insertions, 9 deletions
diff --git a/stdlib/source/lux/target/jvm/reflection.lux b/stdlib/source/lux/target/jvm/reflection.lux index e65b6061f..afea0b0c2 100644 --- a/stdlib/source/lux/target/jvm/reflection.lux +++ b/stdlib/source/lux/target/jvm/reflection.lux @@ -23,7 +23,8 @@ (import: #long java/lang/String) (import: #long java/lang/Object - (toString [] java/lang/String)) + (toString [] java/lang/String) + (getClass [] (java/lang/Class java/lang/Object))) (import: #long java/lang/reflect/Type (getTypeName [] java/lang/String)) @@ -89,10 +90,10 @@ (template [<name>] [(exception: #export (<name> {jvm-type java/lang/reflect/Type}) (exception.report - ["Type" (java/lang/reflect/Type::getTypeName jvm-type)]))] + ["Type" (java/lang/reflect/Type::getTypeName jvm-type)] + ["Class" (|> jvm-type java/lang/Object::getClass java/lang/Object::toString)]))] [not-a-class] - [cannot-convert-to-a-parameter] [cannot-convert-to-a-lux-type] ) @@ -120,13 +121,22 @@ _) (case (host.check java/lang/reflect/WildcardType reflection) (#.Some reflection) + ## TODO: Instead of having single lower/upper bounds, should + ## allow for multiple ones. (case [(array.read 0 (java/lang/reflect/WildcardType::getLowerBounds reflection)) (array.read 0 (java/lang/reflect/WildcardType::getUpperBounds reflection))] (^template [<pattern> <kind>] <pattern> - (do error.monad - [bound (generic bound)] - (wrap (#/.Wildcard (#.Some [<kind> bound]))))) + (case (host.check java/lang/reflect/GenericArrayType bound) + (#.Some _) + ## TODO: Array bounds should not be "erased" as they + ## are right now. + (#error.Success (#/.Wildcard #.None)) + + _ + (:: error.monad map + (|>> [<kind>] #.Some #/.Wildcard) + (generic bound)))) ([[_ (#.Some bound)] #/.Upper] [[(#.Some bound) _] #/.Lower]) diff --git a/stdlib/source/lux/target/jvm/type.lux b/stdlib/source/lux/target/jvm/type.lux index 4b62f33a7..2c3b2b1e2 100644 --- a/stdlib/source/lux/target/jvm/type.lux +++ b/stdlib/source/lux/target/jvm/type.lux @@ -1,12 +1,15 @@ (.module: [lux (#- Type int char) + [abstract + [equivalence (#+ Equivalence)]] [control ["<>" parser ["<t>" text (#+ Parser)]]] [data [error (#+ Error)] + ["." product] ["." maybe ("#@." functor)] - ["." text + ["." text ("#@." equivalence) format] [collection ["." list ("#@." functor)]]]]) @@ -56,6 +59,20 @@ #Lower #Upper) +## TODO: Replace with polytypism. +(structure: #export bound-equivalence + (Equivalence Bound) + (def: (= parameter subject) + (case [parameter subject] + (^template [<tag>] + [<tag> <tag>] + true) + ([#Lower] + [#Upper]) + + _ + false))) + (type: #export Primitive #Boolean #Byte @@ -66,6 +83,26 @@ #Double #Char) +## TODO: Replace with polytypism. +(structure: #export primitive-equivalence + (Equivalence Primitive) + (def: (= parameter subject) + (case [parameter subject] + (^template [<tag>] + [<tag> <tag>] + true) + ([#Boolean] + [#Byte] + [#Short] + [#Int] + [#Long] + [#Float] + [#Double] + [#Char]) + + _ + false))) + (type: #export Var Text) (with-expansions [<Class> (as-is [Text (List Generic)])] @@ -78,6 +115,24 @@ <Class>) ) +(structure: #export generic-equivalence + (Equivalence Generic) + (def: (= parameter subject) + (case [parameter subject] + [(#Var parameter) (#Var subject)] + (text@= parameter subject) + + [(#Wildcard parameter) (#Wildcard subject)] + (:: (maybe.equivalence (product.equivalence bound-equivalence =)) + = parameter subject) + + [(#Class [nameP paramsP]) (#Class [nameS paramsS])] + (and (text@= nameP nameS) + (:: (list.equivalence =) = paramsP paramsS)) + + _ + false))) + (type: #export Parameter [Text Class (List Class)]) @@ -86,17 +141,44 @@ (#Generic Generic) (#Array Type)) +(structure: #export type-equivalence + (Equivalence Type) + (def: (= parameter subject) + (case [parameter subject] + [(#Primitive parameter) (#Primitive subject)] + (:: ..primitive-equivalence = parameter subject) + + [(#Generic parameter) (#Generic subject)] + (:: ..generic-equivalence = parameter subject) + + [(#Array parameter) (#Array subject)] + (= parameter subject) + + _ + false))) + (type: #export Argument [Text Type]) (type: #export Return (Maybe Type)) +(def: #export return-equivalence + (Equivalence Return) + (maybe.equivalence ..type-equivalence)) + (type: #export Method {#args (List Type) #return Return #exceptions (List Generic)}) +(structure: #export method-equivalence + (Equivalence Method) + (def: (= [argsP returnP exceptionsP] [argsS returnS exceptionsS]) + (and (:: (list.equivalence ..type-equivalence) = argsP argsS) + (:: ..return-equivalence = returnP returnS) + (:: (list.equivalence ..generic-equivalence) = exceptionsP exceptionsS)))) + (type: #export (Typed a) [Type a]) diff --git a/stdlib/source/lux/target/jvm/type/lux.lux b/stdlib/source/lux/target/jvm/type/lux.lux index 92bc05091..2e1529ba6 100644 --- a/stdlib/source/lux/target/jvm/type/lux.lux +++ b/stdlib/source/lux/target/jvm/type/lux.lux @@ -92,11 +92,11 @@ (#//.Array elementT) (case elementT (#//.Primitive primitive) - (check@wrap (#.Primitive (//.descriptor (//.array 1 input)) #.Nil)) + (check@wrap (#.Primitive (//.descriptor input) #.Nil)) _ (do check.monad - [elementT (type mapping input)] + [elementT (type mapping elementT)] (wrap (.type (Array elementT))))))) (def: #export (return mapping input) |