aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/lux/target/jvm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--stdlib/source/lux/target/jvm/reflection.lux22
-rw-r--r--stdlib/source/lux/target/jvm/type.lux84
-rw-r--r--stdlib/source/lux/target/jvm/type/lux.lux4
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)