diff options
-rw-r--r-- | documentation/research/text_editor & ide.md | 6 | ||||
-rw-r--r-- | new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux | 225 | ||||
-rw-r--r-- | stdlib/source/lux/control/concurrency/atom.lux | 1 | ||||
-rw-r--r-- | stdlib/source/lux/host.jvm.lux | 214 | ||||
-rw-r--r-- | stdlib/source/lux/math.lux | 4 | ||||
-rw-r--r-- | stdlib/source/lux/target/jvm/type.lux | 55 | ||||
-rw-r--r-- | stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux | 138 |
7 files changed, 354 insertions, 289 deletions
diff --git a/documentation/research/text_editor & ide.md b/documentation/research/text_editor & ide.md index 15d2e6ae9..3f486b53c 100644 --- a/documentation/research/text_editor & ide.md +++ b/documentation/research/text_editor & ide.md @@ -113,6 +113,11 @@ 1. https://github.com/Pext/Pext +# Collaborative editing + +1. https://hackernoon.com/building-conclave-a-decentralized-real-time-collaborative-text-editor-a6ab438fe79f +1. https://github.com/xi-editor/xi-editor/issues/1187 + # Exemplar ## General @@ -156,7 +161,6 @@ 1. http://www.graspjs.com/ 1. http://kakoune.org/ 1. https://github.com/argimenes/standoff-properties-editor -1. https://hackernoon.com/building-conclave-a-decentralized-real-time-collaborative-text-editor-a6ab438fe79f 1. https://www.conyedit.com/ 1. https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand 1. [YOW! Lambda Jam 2018 - Colin Fleming - Developing an IDE for Clojure code](https://www.youtube.com/watch?v=2sPYiGxU4kA) diff --git a/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux b/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux index 8b8ba87ee..55798c806 100644 --- a/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux +++ b/new-luxc/source/luxc/lang/translation/jvm/procedure/host.lux @@ -20,8 +20,8 @@ ["." dictionary (#+ Dictionary)] ["." set]]] [target - [jvm - ["_t" type (#+ Primitive Bound Generic Class Type Method Var Typed Argument Return)]]] + ["." jvm #_ + ["#" type (#+ Primitive Bound Generic Class Type Method Var Typed Argument Return)]]] [tool [compiler [analysis (#+ Environment)] @@ -69,30 +69,30 @@ (|>> inputI <conversion>)))] - [conversion::double-to-float #_t.Double _.D2F #_t.Float] - [conversion::double-to-int #_t.Double _.D2I #_t.Int] - [conversion::double-to-long #_t.Double _.D2L #_t.Long] - [conversion::float-to-double #_t.Float _.F2D #_t.Double] - [conversion::float-to-int #_t.Float _.F2I #_t.Int] - [conversion::float-to-long #_t.Float _.F2L #_t.Long] - [conversion::int-to-byte #_t.Int _.I2B #_t.Byte] - [conversion::int-to-char #_t.Int _.I2C #_t.Char] - [conversion::int-to-double #_t.Int _.I2D #_t.Double] - [conversion::int-to-float #_t.Int _.I2F #_t.Float] - [conversion::int-to-long #_t.Int _.I2L #_t.Long] - [conversion::int-to-short #_t.Int _.I2S #_t.Short] - [conversion::long-to-double #_t.Long _.L2D #_t.Double] - [conversion::long-to-float #_t.Long _.L2F #_t.Float] - [conversion::long-to-int #_t.Long _.L2I #_t.Int] - [conversion::long-to-short #_t.Long L2S #_t.Short] - [conversion::long-to-byte #_t.Long L2B #_t.Byte] - [conversion::long-to-char #_t.Long L2C #_t.Char] - [conversion::char-to-byte #_t.Char _.I2B #_t.Byte] - [conversion::char-to-short #_t.Char _.I2S #_t.Short] - [conversion::char-to-int #_t.Char _.NOP #_t.Int] - [conversion::char-to-long #_t.Char _.I2L #_t.Long] - [conversion::byte-to-long #_t.Byte _.I2L #_t.Long] - [conversion::short-to-long #_t.Short _.I2L #_t.Long] + [conversion::double-to-float #jvm.Double _.D2F #jvm.Float] + [conversion::double-to-int #jvm.Double _.D2I #jvm.Int] + [conversion::double-to-long #jvm.Double _.D2L #jvm.Long] + [conversion::float-to-double #jvm.Float _.F2D #jvm.Double] + [conversion::float-to-int #jvm.Float _.F2I #jvm.Int] + [conversion::float-to-long #jvm.Float _.F2L #jvm.Long] + [conversion::int-to-byte #jvm.Int _.I2B #jvm.Byte] + [conversion::int-to-char #jvm.Int _.I2C #jvm.Char] + [conversion::int-to-double #jvm.Int _.I2D #jvm.Double] + [conversion::int-to-float #jvm.Int _.I2F #jvm.Float] + [conversion::int-to-long #jvm.Int _.I2L #jvm.Long] + [conversion::int-to-short #jvm.Int _.I2S #jvm.Short] + [conversion::long-to-double #jvm.Long _.L2D #jvm.Double] + [conversion::long-to-float #jvm.Long _.L2F #jvm.Float] + [conversion::long-to-int #jvm.Long _.L2I #jvm.Int] + [conversion::long-to-short #jvm.Long L2S #jvm.Short] + [conversion::long-to-byte #jvm.Long L2B #jvm.Byte] + [conversion::long-to-char #jvm.Long L2C #jvm.Char] + [conversion::char-to-byte #jvm.Char _.I2B #jvm.Byte] + [conversion::char-to-short #jvm.Char _.I2S #jvm.Short] + [conversion::char-to-int #jvm.Char _.NOP #jvm.Int] + [conversion::char-to-long #jvm.Char _.I2L #jvm.Long] + [conversion::byte-to-long #jvm.Byte _.I2L #jvm.Long] + [conversion::short-to-long #jvm.Short _.I2L #jvm.Long] ) (def: conversion @@ -169,7 +169,7 @@ [double::% _.DREM] ) -(def: boolean-class (_t.class "java.lang.Boolean" (list))) +(def: boolean-class (jvm.class "java.lang.Boolean" (list))) (def: falseI (_.GETSTATIC "java.lang.Boolean" "FALSE" boolean-class)) (def: trueI (_.GETSTATIC "java.lang.Boolean" "TRUE" boolean-class)) @@ -294,17 +294,17 @@ (def: (array-java-type nesting elem-class) (-> Nat Text Type) - (_t.array nesting - (case elem-class - "boolean" _t.boolean - "byte" _t.byte - "short" _t.short - "int" _t.int - "long" _t.long - "float" _t.float - "double" _t.double - "char" _t.char - _ (_t.class elem-class (list))))) + (jvm.array nesting + (case elem-class + "boolean" jvm.boolean + "byte" jvm.byte + "short" jvm.short + "int" jvm.int + "long" jvm.long + "float" jvm.float + "double" jvm.double + "char" jvm.char + _ (jvm.class elem-class (list))))) (def: (array::length extension-name generate inputs) Handler @@ -315,7 +315,7 @@ (do phase.monad [arrayI (generate arrayS)] (wrap (|>> arrayI - (_.CHECKCAST (_t.descriptor (array-java-type (.nat nesting) elem-class))) + (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class))) _.ARRAYLENGTH))) _ @@ -329,7 +329,7 @@ (do phase.monad [lengthI (generate lengthS)] (wrap (|>> lengthI - (_.array (_t.array 1 jvm-primitive))))) + (_.array (jvm.array 1 jvm-primitive))))) _ (phase.throw extension.invalid-syntax [extension-name %synthesis inputs])))) @@ -357,7 +357,7 @@ [arrayI (generate arrayS) idxI (generate idxS)] (wrap (|>> arrayI - (_.CHECKCAST (_t.descriptor (_t.array 1 jvm-primitive))) + (_.CHECKCAST (jvm.descriptor (jvm.array 1 jvm-primitive))) idxI loadI))) @@ -375,7 +375,7 @@ [arrayI (generate arrayS) idxI (generate idxS)] (wrap (|>> arrayI - (_.CHECKCAST (_t.descriptor (array-java-type (.nat nesting) elem-class))) + (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class))) idxI _.AALOAD))) @@ -392,7 +392,7 @@ idxI (generate idxS) valueI (generate valueS)] (wrap (|>> arrayI - (_.CHECKCAST (_t.descriptor (_t.array 1 jvm-primitive))) + (_.CHECKCAST (jvm.descriptor (jvm.array 1 jvm-primitive))) _.DUP idxI valueI @@ -414,7 +414,7 @@ idxI (generate idxS) valueI (generate valueS)] (wrap (|>> arrayI - (_.CHECKCAST (_t.descriptor (array-java-type (.nat nesting) elem-class))) + (_.CHECKCAST (jvm.descriptor (array-java-type (.nat nesting) elem-class))) _.DUP idxI valueI @@ -430,36 +430,36 @@ (bundle.install "length" array::length) (dictionary.merge (<| (bundle.prefix "new") (|> bundle.empty - (bundle.install "boolean" (new-primitive-array-handler _t.boolean)) - (bundle.install "byte" (new-primitive-array-handler _t.byte)) - (bundle.install "short" (new-primitive-array-handler _t.short)) - (bundle.install "int" (new-primitive-array-handler _t.int)) - (bundle.install "long" (new-primitive-array-handler _t.long)) - (bundle.install "float" (new-primitive-array-handler _t.float)) - (bundle.install "double" (new-primitive-array-handler _t.double)) - (bundle.install "char" (new-primitive-array-handler _t.char)) + (bundle.install "boolean" (new-primitive-array-handler jvm.boolean)) + (bundle.install "byte" (new-primitive-array-handler jvm.byte)) + (bundle.install "short" (new-primitive-array-handler jvm.short)) + (bundle.install "int" (new-primitive-array-handler jvm.int)) + (bundle.install "long" (new-primitive-array-handler jvm.long)) + (bundle.install "float" (new-primitive-array-handler jvm.float)) + (bundle.install "double" (new-primitive-array-handler jvm.double)) + (bundle.install "char" (new-primitive-array-handler jvm.char)) (bundle.install "object" array::new::object)))) (dictionary.merge (<| (bundle.prefix "read") (|> bundle.empty - (bundle.install "boolean" (read-primitive-array-handler _t.boolean _.BALOAD)) - (bundle.install "byte" (read-primitive-array-handler _t.byte _.BALOAD)) - (bundle.install "short" (read-primitive-array-handler _t.short _.SALOAD)) - (bundle.install "int" (read-primitive-array-handler _t.int _.IALOAD)) - (bundle.install "long" (read-primitive-array-handler _t.long _.LALOAD)) - (bundle.install "float" (read-primitive-array-handler _t.float _.FALOAD)) - (bundle.install "double" (read-primitive-array-handler _t.double _.DALOAD)) - (bundle.install "char" (read-primitive-array-handler _t.char _.CALOAD)) + (bundle.install "boolean" (read-primitive-array-handler jvm.boolean _.BALOAD)) + (bundle.install "byte" (read-primitive-array-handler jvm.byte _.BALOAD)) + (bundle.install "short" (read-primitive-array-handler jvm.short _.SALOAD)) + (bundle.install "int" (read-primitive-array-handler jvm.int _.IALOAD)) + (bundle.install "long" (read-primitive-array-handler jvm.long _.LALOAD)) + (bundle.install "float" (read-primitive-array-handler jvm.float _.FALOAD)) + (bundle.install "double" (read-primitive-array-handler jvm.double _.DALOAD)) + (bundle.install "char" (read-primitive-array-handler jvm.char _.CALOAD)) (bundle.install "object" array::read::object)))) (dictionary.merge (<| (bundle.prefix "write") (|> bundle.empty - (bundle.install "boolean" (write-primitive-array-handler _t.boolean _.BASTORE)) - (bundle.install "byte" (write-primitive-array-handler _t.byte _.BASTORE)) - (bundle.install "short" (write-primitive-array-handler _t.short _.SASTORE)) - (bundle.install "int" (write-primitive-array-handler _t.int _.IASTORE)) - (bundle.install "long" (write-primitive-array-handler _t.long _.LASTORE)) - (bundle.install "float" (write-primitive-array-handler _t.float _.FASTORE)) - (bundle.install "double" (write-primitive-array-handler _t.double _.DASTORE)) - (bundle.install "char" (write-primitive-array-handler _t.char _.CASTORE)) + (bundle.install "boolean" (write-primitive-array-handler jvm.boolean _.BASTORE)) + (bundle.install "byte" (write-primitive-array-handler jvm.byte _.BASTORE)) + (bundle.install "short" (write-primitive-array-handler jvm.short _.SASTORE)) + (bundle.install "int" (write-primitive-array-handler jvm.int _.IASTORE)) + (bundle.install "long" (write-primitive-array-handler jvm.long _.LASTORE)) + (bundle.install "float" (write-primitive-array-handler jvm.float _.FASTORE)) + (bundle.install "double" (write-primitive-array-handler jvm.double _.DASTORE)) + (bundle.install "char" (write-primitive-array-handler jvm.char _.CASTORE)) (bundle.install "object" array::write::object)))) ))) @@ -501,9 +501,9 @@ [] (wrap (|>> (_.string class) (_.INVOKESTATIC "java.lang.Class" "forName" - (_t.method (list (_t.class "java.lang.String" (list))) - (#.Some (_t.class "java.lang.Class" (list))) - (list)) + (jvm.method (list (jvm.class "java.lang.String" (list))) + (#.Some (jvm.class "java.lang.Class" (list))) + (list)) false)))) _ @@ -517,7 +517,7 @@ [objectI (generate objectS)] (wrap (|>> objectI (_.INSTANCEOF class) - (_.wrap #_t.Boolean)))) + (_.wrap #jvm.Boolean)))) _ (phase.throw extension.invalid-syntax [extension-name %synthesis inputs]))) @@ -536,14 +536,14 @@ [<object> <primitive>] (wrap (|>> valueI (_.unwrap <type>)))) - (["boolean" "java.lang.Boolean" #_t.Boolean] - ["byte" "java.lang.Byte" #_t.Byte] - ["short" "java.lang.Short" #_t.Short] - ["int" "java.lang.Integer" #_t.Int] - ["long" "java.lang.Long" #_t.Long] - ["float" "java.lang.Float" #_t.Float] - ["double" "java.lang.Double" #_t.Double] - ["char" "java.lang.Character" #_t.Char]) + (["boolean" "java.lang.Boolean" #jvm.Boolean] + ["byte" "java.lang.Byte" #jvm.Byte] + ["short" "java.lang.Short" #jvm.Short] + ["int" "java.lang.Integer" #jvm.Int] + ["long" "java.lang.Long" #jvm.Long] + ["float" "java.lang.Float" #jvm.Float] + ["double" "java.lang.Double" #jvm.Double] + ["char" "java.lang.Character" #jvm.Char]) _ (wrap valueI))) @@ -566,14 +566,14 @@ (def: primitives (Dictionary Text Primitive) - (|> (list ["boolean" #_t.Boolean] - ["byte" #_t.Byte] - ["short" #_t.Short] - ["int" #_t.Int] - ["long" #_t.Long] - ["float" #_t.Float] - ["double" #_t.Double] - ["char" #_t.Char]) + (|> (list ["boolean" #jvm.Boolean] + ["byte" #jvm.Byte] + ["short" #jvm.Short] + ["int" #jvm.Int] + ["long" #jvm.Long] + ["float" #jvm.Float] + ["double" #jvm.Double] + ["char" #jvm.Char]) (dictionary.from-list text.hash))) (def: (static::get extension-name generate inputs) @@ -586,10 +586,10 @@ [] (case (dictionary.get unboxed primitives) (#.Some primitive) - (wrap (_.GETSTATIC class field (#_t.Primitive primitive))) + (wrap (_.GETSTATIC class field (#jvm.Primitive primitive))) #.None - (wrap (_.GETSTATIC class field (_t.class unboxed (list)))))) + (wrap (_.GETSTATIC class field (jvm.class unboxed (list)))))) _ (phase.throw extension.invalid-syntax [extension-name %synthesis inputs]))) @@ -606,13 +606,13 @@ (case (dictionary.get unboxed primitives) (#.Some primitive) (wrap (|>> valueI - (_.PUTSTATIC class field (#_t.Primitive primitive)) + (_.PUTSTATIC class field (#jvm.Primitive primitive)) (_.string synthesis.unit))) #.None (wrap (|>> valueI (_.CHECKCAST class) - (_.PUTSTATIC class field (_t.class class (list))) + (_.PUTSTATIC class field (jvm.class class (list))) (_.string synthesis.unit))))) _ @@ -631,12 +631,12 @@ (#.Some primitive) (wrap (|>> objectI (_.CHECKCAST class) - (_.GETFIELD class field (#_t.Primitive primitive)))) + (_.GETFIELD class field (#jvm.Primitive primitive)))) #.None (wrap (|>> objectI (_.CHECKCAST class) - (_.GETFIELD class field (_t.class unboxed (list))))))) + (_.GETFIELD class field (jvm.class unboxed (list))))))) _ (phase.throw extension.invalid-syntax [extension-name %synthesis inputs]))) @@ -658,7 +658,7 @@ (_.CHECKCAST class) _.DUP valueI - (_.PUTFIELD class field (#_t.Primitive primitive)))) + (_.PUTFIELD class field (#jvm.Primitive primitive)))) #.None (wrap (|>> objectI @@ -666,7 +666,7 @@ _.DUP valueI (_.CHECKCAST unboxed) - (_.PUTFIELD class field (_t.class unboxed (list))))))) + (_.PUTFIELD class field (jvm.class unboxed (list))))))) _ (phase.throw extension.invalid-syntax [extension-name %synthesis inputs]))) @@ -674,16 +674,16 @@ (def: base-type (<t>.Parser Type) ($_ <>.either - (<>.after (<t>.this "boolean") (<>@wrap _t.boolean)) - (<>.after (<t>.this "byte") (<>@wrap _t.byte)) - (<>.after (<t>.this "short") (<>@wrap _t.short)) - (<>.after (<t>.this "int") (<>@wrap _t.int)) - (<>.after (<t>.this "long") (<>@wrap _t.long)) - (<>.after (<t>.this "float") (<>@wrap _t.float)) - (<>.after (<t>.this "double") (<>@wrap _t.double)) - (<>.after (<t>.this "char") (<>@wrap _t.char)) + (<>.after (<t>.this "boolean") (<>@wrap jvm.boolean)) + (<>.after (<t>.this "byte") (<>@wrap jvm.byte)) + (<>.after (<t>.this "short") (<>@wrap jvm.short)) + (<>.after (<t>.this "int") (<>@wrap jvm.int)) + (<>.after (<t>.this "long") (<>@wrap jvm.long)) + (<>.after (<t>.this "float") (<>@wrap jvm.float)) + (<>.after (<t>.this "double") (<>@wrap jvm.double)) + (<>.after (<t>.this "char") (<>@wrap jvm.char)) (<>@map (function (_ name) - (_t.class name (list))) + (jvm.class name (list))) (<t>.many (<t>.none-of "["))) )) @@ -692,7 +692,7 @@ (do <>.monad [raw base-type nesting (<>.some (<t>.this "[]"))] - (wrap (_t.array (list.size nesting) raw)))) + (wrap (jvm.array (list.size nesting) raw)))) (def: (generate-type argD) (-> Text (Operation Type)) @@ -709,7 +709,10 @@ (case argS (^ (synthesis.tuple (list (synthesis.text argD) argS))) (do phase.monad - [argT (generate-type argD) + [argD (phase.lift (:: error.monad map + jvm.reflection-class + (jvm.parse-signature argD))) + argT (generate-type argD) argI (generate argS)] (wrap [argT argI])) @@ -727,7 +730,7 @@ (def: (prepare-argI [type argI]) (-> [Type Inst] Inst) - (case (_t.class-name type) + (case (jvm.class-name type) (#.Some class-name) (|>> argI (_.CHECKCAST class-name)) @@ -747,7 +750,7 @@ returnT (method-return-type unboxed)] (wrap (|>> (_.fuse (list@map ..prepare-argI argsTI)) (_.INVOKESTATIC class method - (_t.method (list@map product.left argsTI) returnT (list)) + (jvm.method (list@map product.left argsTI) returnT (list)) false)))) _ @@ -770,7 +773,7 @@ (_.CHECKCAST class) (_.fuse (list@map ..prepare-argI argsTI)) (<invoke> class method - (_t.method (list@map product.left argsTI) returnT (list)) + (jvm.method (list@map product.left argsTI) returnT (list)) <interface?>)))) _ @@ -791,7 +794,7 @@ _.DUP (_.fuse (list@map ..prepare-argI argsTI)) (_.INVOKESPECIAL class "<init>" - (_t.method (list@map product.left argsTI) #.None (list)) + (jvm.method (list@map product.left argsTI) #.None (list)) false)))) _ diff --git a/stdlib/source/lux/control/concurrency/atom.lux b/stdlib/source/lux/control/concurrency/atom.lux index 599545498..d3fc1eca6 100644 --- a/stdlib/source/lux/control/concurrency/atom.lux +++ b/stdlib/source/lux/control/concurrency/atom.lux @@ -57,7 +57,6 @@ (~~ (static @.jvm)) (|> (:representation atom) (java/util/concurrent/atomic/AtomicReference::compareAndSet current new) - "jvm object cast" (: (primitive "java.lang.Boolean")) (:coerce Bit))}))) )) diff --git a/stdlib/source/lux/host.jvm.lux b/stdlib/source/lux/host.jvm.lux index cb08e1cce..d93edbfe4 100644 --- a/stdlib/source/lux/host.jvm.lux +++ b/stdlib/source/lux/host.jvm.lux @@ -42,14 +42,14 @@ [Character "java.lang.Character"] ## Primitives - [boolean "boolean"] - [byte "byte"] - [short "short"] - [int "int"] - [long "long"] - [float "float"] - [double "double"] - [char "char"] + [boolean jvm.boolean-reflection] + [byte jvm.byte-reflection] + [short jvm.short-reflection] + [int jvm.int-reflection] + [long jvm.long-reflection] + [float jvm.float-reflection] + [double jvm.double-reflection] + [char jvm.char-reflection] ) (def: (get-static-field class field) @@ -67,29 +67,40 @@ (def: boxes (Dictionary Text Text) - (|> (list ["boolean" "java.lang.Boolean"] - ["byte" "java.lang.Byte"] - ["short" "java.lang.Short"] - ["int" "java.lang.Integer"] - ["long" "java.lang.Long"] - ["float" "java.lang.Float"] - ["double" "java.lang.Double"] - ["char" "java.lang.Character"]) + (|> (list [jvm.boolean-descriptor "java.lang.Boolean"] + [jvm.byte-descriptor "java.lang.Byte"] + [jvm.short-descriptor "java.lang.Short"] + [jvm.int-descriptor "java.lang.Integer"] + [jvm.long-descriptor "java.lang.Long"] + [jvm.float-descriptor "java.lang.Float"] + [jvm.double-descriptor "java.lang.Double"] + [jvm.char-descriptor "java.lang.Character"]) (dictionary.from-list text.hash))) -(def: (unbox unboxed boxed raw) - (-> Text Text Code Code) - (` (|> (~ raw) - (: (primitive (~ (code.text boxed)))) - "jvm object cast" - (: (primitive (~ (code.text unboxed))))))) +(def: reflections + (Dictionary Text Text) + (|> (list [jvm.boolean-descriptor jvm.boolean-reflection] + [jvm.byte-descriptor jvm.byte-reflection] + [jvm.short-descriptor jvm.short-reflection] + [jvm.int-descriptor jvm.int-reflection] + [jvm.long-descriptor jvm.long-reflection] + [jvm.float-descriptor jvm.float-reflection] + [jvm.double-descriptor jvm.double-reflection] + [jvm.char-descriptor jvm.char-reflection]) + (dictionary.from-list text.hash))) -(def: (box unboxed boxed raw) - (-> Text Text Code Code) - (` (|> (~ raw) - (: (primitive (~ (code.text unboxed)))) - "jvm object cast" - (: (primitive (~ (code.text boxed))))))) +(template [<name> <pre> <post>] + [(def: (<name> unboxed boxed raw) + (-> Text Text Code Code) + (let [unboxed (|> reflections (dictionary.get unboxed) (maybe.default unboxed))] + (` (|> (~ raw) + (: (primitive (~ (code.text <pre>)))) + "jvm object cast" + (: (primitive (~ (code.text <post>))))))))] + + [unbox boxed unboxed] + [box unboxed boxed] + ) (template [<name> <op> <from> <to>] [(template: #export (<name> value) @@ -460,44 +471,13 @@ (-> [Text Code] Code) (` [(~ (code.text class)) (~ value)])) -(def: (simple-class type) - (-> Type Text) - (case type - (#jvm.Primitive prim) - (case prim - #jvm.Boolean "boolean" - #jvm.Byte "byte" - #jvm.Short "short" - #jvm.Int "int" - #jvm.Long "long" - #jvm.Float "float" - #jvm.Double "double" - #jvm.Char "char") - - (#jvm.Array sub) - (sanitize (jvm.descriptor type)) - - (#jvm.Generic generic) - (case generic - (#jvm.Class class params) - (sanitize class) - - (^or (#jvm.Var name) - (#jvm.Wildcard #.None) - (#jvm.Wildcard (#.Some [#jvm.Lower bound]))) - "java.lang.Object" - - (#jvm.Wildcard (#.Some [#jvm.Upper bound])) - (simple-class (#jvm.Generic bound))) - )) - (def: (make-constructor-parser class-name arguments) (-> Text (List Argument) (Parser Code)) (do p.monad [args (: (Parser (List Code)) (s.form (p.after (s.this! (' ::new!)) (s.tuple (p.exactly (list.size arguments) s.any))))) - #let [arguments' (list@map (|>> product.right ..simple-class) arguments)]] + #let [arguments' (list@map (|>> product.right jvm.signature) arguments)]] (wrap (` ("jvm member invoke constructor" (~ (code.text class-name)) (~+ (|> args (list.zip2 arguments') @@ -510,7 +490,7 @@ args (: (Parser (List Code)) (s.form (p.after (s.this! (code.identifier ["" dotted-name])) (s.tuple (p.exactly (list.size arguments) s.any))))) - #let [arguments' (list@map (|>> product.right ..simple-class) arguments)]] + #let [arguments' (list@map (|>> product.right jvm.signature) arguments)]] (wrap (` ("jvm member invoke static" (~ (code.text class-name)) (~ (code.text method-name)) (~+ (|> args (list.zip2 arguments') @@ -524,7 +504,7 @@ args (: (Parser (List Code)) (s.form (p.after (s.this! (code.identifier ["" dotted-name])) (s.tuple (p.exactly (list.size arguments) s.any))))) - #let [arguments' (list@map (|>> product.right ..simple-class) arguments)]] + #let [arguments' (list@map (|>> product.right jvm.signature) arguments)]] (wrap (` (<jvm-op> (~ (code.text class-name)) (~ (code.text method-name)) (~' _jvm_this) (~+ (|> args @@ -627,14 +607,14 @@ (def: primitive^ (Parser Primitive) ($_ p.or - (s.identifier! ["" "boolean"]) - (s.identifier! ["" "byte"]) - (s.identifier! ["" "short"]) - (s.identifier! ["" "int"]) - (s.identifier! ["" "long"]) - (s.identifier! ["" "float"]) - (s.identifier! ["" "double"]) - (s.identifier! ["" "char"]) + (s.identifier! ["" jvm.boolean-reflection]) + (s.identifier! ["" jvm.byte-reflection]) + (s.identifier! ["" jvm.short-reflection]) + (s.identifier! ["" jvm.int-reflection]) + (s.identifier! ["" jvm.long-reflection]) + (s.identifier! ["" jvm.float-reflection]) + (s.identifier! ["" jvm.double-reflection]) + (s.identifier! ["" jvm.char-reflection]) )) (def: (type^ imports type-vars) @@ -1031,14 +1011,14 @@ (case type (#jvm.Primitive primitive) (case primitive - #jvm.Boolean (code.local-identifier "boolean") - #jvm.Byte (code.local-identifier "byte") - #jvm.Short (code.local-identifier "short") - #jvm.Int (code.local-identifier "int") - #jvm.Long (code.local-identifier "long") - #jvm.Float (code.local-identifier "float") - #jvm.Double (code.local-identifier "double") - #jvm.Char (code.local-identifier "char")) + #jvm.Boolean (code.local-identifier jvm.boolean-reflection) + #jvm.Byte (code.local-identifier jvm.byte-reflection) + #jvm.Short (code.local-identifier jvm.short-reflection) + #jvm.Int (code.local-identifier jvm.int-reflection) + #jvm.Long (code.local-identifier jvm.long-reflection) + #jvm.Float (code.local-identifier jvm.float-reflection) + #jvm.Double (code.local-identifier jvm.double-reflection) + #jvm.Char (code.local-identifier jvm.char-reflection)) (#jvm.Generic generic) (generic$ generic) @@ -1142,7 +1122,7 @@ (let [super-replacer (parser->replacer (s.form (do p.monad [_ (s.this! (' ::super!)) args (s.tuple (p.exactly (list.size arguments) s.any)) - #let [arguments' (list@map (|>> product.right ..simple-class) arguments)]] + #let [arguments' (list@map (|>> product.right jvm.signature) arguments)]] (wrap (` ("jvm member invoke special" (~ (code.text (product.left super-class))) (~ (code.text name)) @@ -1375,7 +1355,7 @@ (#.Some value-as-string) #.None))} (with-gensyms [g!_ g!unchecked] - (let [class-name (..simple-class class) + (let [class-name (jvm.signature class) class-type (` (.primitive (~ (code.text class-name)))) check-type (` (.Maybe (~ class-type))) check-code (` (if ((~ (code.text (format "jvm instanceof" ":" class-name))) (~ g!unchecked)) @@ -1455,7 +1435,7 @@ (with-gensyms [arg-name] (wrap [maybe? arg-name])))) import-member-args) - #let [arg-classes (list@map (|>> product.right ..simple-class) import-member-args) + #let [arg-classes (list@map (|>> product.right jvm.signature) import-member-args) arg-types (list@map (: (-> [Bit Type] Code) (function (_ [maybe? arg]) (let [arg-type (jvm-type (get@ #import-member-mode commons) arg)] @@ -1523,11 +1503,20 @@ #AutoPrM (case unboxed - "byte" [<byte> (` (<for-byte> (~ raw)))] - "short" [<short> (` (<for-short> (~ raw)))] - "int" [<int> (` (<for-int> (~ raw)))] - "float" [<float> (` (<for-float> (~ raw)))] - _ [unboxed raw]))] + (^ (static jvm.byte-descriptor)) + [<byte> (` (<for-byte> (~ raw)))] + + (^ (static jvm.short-descriptor)) + [<short> (` (<for-short> (~ raw)))] + + (^ (static jvm.int-descriptor)) + [<int> (` (<for-int> (~ raw)))] + + (^ (static jvm.float-descriptor)) + [<float> (` (<for-float> (~ raw)))] + + _ + [unboxed raw]))] (case (dictionary.get unboxed boxes) (#.Some boxed) (<unbox/box> unboxed boxed refined) @@ -1536,15 +1525,15 @@ refined)))] [auto-convert-input ..unbox - "byte" ..long-to-byte - "short" ..long-to-short - "int" ..long-to-int - "float" ..double-to-float] + jvm.byte-descriptor ..long-to-byte + jvm.short-descriptor ..long-to-short + jvm.int-descriptor ..long-to-int + jvm.float-descriptor ..double-to-float] [auto-convert-output ..box - "long" "jvm conversion byte-to-long" - "long" "jvm conversion short-to-long" - "long" "jvm conversion int-to-long" - "double" "jvm conversion float-to-double"] + jvm.long-descriptor "jvm conversion byte-to-long" + jvm.long-descriptor "jvm conversion short-to-long" + jvm.long-descriptor "jvm conversion int-to-long" + jvm.double-descriptor "jvm conversion float-to-double"] ) (def: (un-quote quoted) @@ -1554,13 +1543,26 @@ (def: (jvm-input [unboxed raw]) (-> [Text Code] [Text Code]) [unboxed (case unboxed - "byte" (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) - "short" (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) - "int" (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) - "long" (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) - "float" (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw)))) - "double" (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw)))) - _ (` ("jvm object cast" (~ raw))))]) + (^ (static jvm.byte-descriptor)) + (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) + + (^ (static jvm.short-descriptor)) + (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) + + (^ (static jvm.int-descriptor)) + (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) + + (^ (static jvm.long-descriptor)) + (` (.:coerce (.primitive "java.lang.Long") (.: .Int (~ raw)))) + + (^ (static jvm.float-descriptor)) + (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw)))) + + (^ (static jvm.double-descriptor)) + (` (.:coerce (.primitive "java.lang.Double") (.: .Frac (~ raw)))) + + _ + (` ("jvm object cast" (~ raw))))]) (def: (jvm-invoke-inputs mode classes inputs) (-> Primitive-Mode (List Text) (List [Bit Code]) (List Code)) @@ -1641,7 +1643,7 @@ jvm.void-descriptor (#.Some return) - (..simple-class return)) + (jvm.signature return)) jvm-interop (|> [method-return-class (` ((~ (code.text jvm-op)) (~ (code.text full-name)) @@ -1674,7 +1676,7 @@ (` ((~ getter-name))) (` ((~ getter-name) (~ g!obj)))) getter-body (<| (auto-convert-output import-field-mode) - [(..simple-class import-field-type) + [(jvm.signature import-field-type) (if import-field-static? (get-static-field full-name import-field-name) (get-virtual-field full-name import-field-name (un-quote g!obj)))]) @@ -1692,7 +1694,7 @@ (let [setter-call (if import-field-static? (` ((~ setter-name) (~ g!value))) (` ((~ setter-name) (~ g!value) (~ g!obj)))) - setter-value (|> [(..simple-class import-field-type) (un-quote g!value)] + setter-value (|> [(jvm.signature import-field-type) (un-quote g!value)] ..jvm-input (auto-convert-input import-field-mode)) setter-value (if import-field-maybe? @@ -1730,7 +1732,7 @@ (def: load-class (-> Text (Error (primitive "java.lang.Class" [Any]))) (|>> (:coerce (primitive "java.lang.String")) - ["java.lang.String"] + ["Ljava/lang/String;"] ("jvm member invoke static" "java.lang.Class" "forName") try)) @@ -1915,7 +1917,7 @@ {type (..type^ imports (list))}) {#.doc (doc "Loads the class as a java.lang.Class object." (class-for java/lang/String))} - (wrap (list (` ("jvm object class" (~ (code.text (..simple-class type)))))))) + (wrap (list (` ("jvm object class" (~ (code.text (jvm.signature type)))))))) (def: get-compiler (Meta Lux) diff --git a/stdlib/source/lux/math.lux b/stdlib/source/lux/math.lux index 712e2bf70..1340f31d0 100644 --- a/stdlib/source/lux/math.lux +++ b/stdlib/source/lux/math.lux @@ -44,7 +44,7 @@ [(def: #export <name> (-> Frac Frac) (|>> !double - ["double"] + ["D"] ("jvm member invoke static" "java.lang.Math" <method>) !frac))] @@ -65,7 +65,7 @@ (def: #export (pow param subject) (-> Frac Frac Frac) (|> ("jvm member invoke static" "java.lang.Math" "pow" - ["double" (!double subject)] ["double" (!double param)]) + ["D" (!double subject)] ["D" (!double param)]) !frac)))})) (def: #export (round input) diff --git a/stdlib/source/lux/target/jvm/type.lux b/stdlib/source/lux/target/jvm/type.lux index ff30cf782..98880e5a8 100644 --- a/stdlib/source/lux/target/jvm/type.lux +++ b/stdlib/source/lux/target/jvm/type.lux @@ -25,6 +25,19 @@ ["C" char-descriptor] ) +(template [<name> <reflection>] + [(def: #export <name> <reflection>)] + + [boolean-reflection "boolean"] + [byte-reflection "byte"] + [short-reflection "short"] + [int-reflection "int"] + [long-reflection "long"] + [float-reflection "float"] + [double-reflection "double"] + [char-reflection "char"] + ) + (def: array-prefix "[") (def: object-prefix "L") (def: var-prefix "T") @@ -128,9 +141,14 @@ 0 elemT _ (#Array (array (dec depth) elemT)))) -(def: #export binary-name - (-> Text Text) - (text.replace-all ..syntax-package-separator ..binary-package-separator)) +(template [<name> <from> <to>] + [(def: #export <name> + (-> Text Text) + (text.replace-all <from> <to>))] + + [binary-name ..syntax-package-separator ..binary-package-separator] + [syntax-name ..binary-package-separator ..syntax-package-separator] + ) (def: #export (descriptor type) (-> Type Text) @@ -308,3 +326,34 @@ (|> (get@ #exceptions method) (list@map (|>> #Generic signature (format "^"))) (text.join-with "")))) + +(def: #export (reflection-class type) + (-> Type Text) + (case type + (#Primitive prim) + (case prim + #Boolean ..boolean-reflection + #Byte ..byte-reflection + #Short ..short-reflection + #Int ..int-reflection + #Long ..long-reflection + #Float ..float-reflection + #Double ..double-reflection + #Char ..char-reflection) + + (#Array sub) + (syntax-name (descriptor type)) + + (#Generic generic) + (case generic + (#Class class params) + (syntax-name class) + + (^or (#Var name) + (#Wildcard #.None) + (#Wildcard (#.Some [#Lower bound]))) + ..object-class + + (#Wildcard (#.Some [#Upper bound])) + (reflection-class (#Generic bound))) + )) diff --git a/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux b/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux index 91581c37b..61d65e67f 100644 --- a/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux +++ b/stdlib/source/lux/tool/compiler/phase/extension/analysis/jvm.lux @@ -22,8 +22,8 @@ ["." type ["." check (#+ Check) ("#@." monad)]] [target - [jvm - ["_." type (#+ Var Bound Primitive Generic Class Type Argument Return Typed)]]]] + ["." jvm #_ + ["#" type (#+ Var Bound Primitive Generic Class Type Argument Return Typed)]]]] ["." // #_ ["#." common] ["/#" // @@ -336,7 +336,7 @@ (do ////.monad [lengthA (typeA.with-type ..int (analyse lengthC)) - _ (typeA.infer (#.Primitive (_type.descriptor (_type.array 1 primitive-type)) (list)))] + _ (typeA.infer (#.Primitive (jvm.descriptor (jvm.array 1 primitive-type)) (list)))] (wrap (#/////analysis.Extension extension-name (list lengthA)))) _ @@ -414,7 +414,7 @@ [_ (typeA.infer lux-type) idxA (typeA.with-type ..int (analyse idxC)) - arrayA (typeA.with-type (#.Primitive (_type.descriptor (_type.array 1 jvm-type)) (list)) + arrayA (typeA.with-type (#.Primitive (jvm.descriptor (jvm.array 1 jvm-type)) (list)) (analyse arrayC))] (wrap (#/////analysis.Extension extension-name (list idxA arrayA)))) @@ -446,7 +446,7 @@ (def: (write-primitive-array-handler lux-type jvm-type) (-> .Type Type Handler) - (let [array-type (#.Primitive (_type.descriptor (_type.array 1 jvm-type)) (list))] + (let [array-type (#.Primitive (jvm.descriptor (jvm.array 1 jvm-type)) (list))] (function (_ extension-name analyse args) (case args (^ (list idxC valueC arrayC)) @@ -498,36 +498,36 @@ (///bundle.install "length" array::length) (dictionary.merge (<| (///bundle.prefix "new") (|> ///bundle.empty - (///bundle.install "boolean" (new-primitive-array-handler _type.boolean)) - (///bundle.install "byte" (new-primitive-array-handler _type.byte)) - (///bundle.install "short" (new-primitive-array-handler _type.short)) - (///bundle.install "int" (new-primitive-array-handler _type.int)) - (///bundle.install "long" (new-primitive-array-handler _type.long)) - (///bundle.install "float" (new-primitive-array-handler _type.float)) - (///bundle.install "double" (new-primitive-array-handler _type.double)) - (///bundle.install "char" (new-primitive-array-handler _type.char)) + (///bundle.install "boolean" (new-primitive-array-handler jvm.boolean)) + (///bundle.install "byte" (new-primitive-array-handler jvm.byte)) + (///bundle.install "short" (new-primitive-array-handler jvm.short)) + (///bundle.install "int" (new-primitive-array-handler jvm.int)) + (///bundle.install "long" (new-primitive-array-handler jvm.long)) + (///bundle.install "float" (new-primitive-array-handler jvm.float)) + (///bundle.install "double" (new-primitive-array-handler jvm.double)) + (///bundle.install "char" (new-primitive-array-handler jvm.char)) (///bundle.install "object" array::new::object)))) (dictionary.merge (<| (///bundle.prefix "read") (|> ///bundle.empty - (///bundle.install "boolean" (read-primitive-array-handler ..boolean _type.boolean)) - (///bundle.install "byte" (read-primitive-array-handler ..byte _type.byte)) - (///bundle.install "short" (read-primitive-array-handler ..short _type.short)) - (///bundle.install "int" (read-primitive-array-handler ..int _type.int)) - (///bundle.install "long" (read-primitive-array-handler ..long _type.long)) - (///bundle.install "float" (read-primitive-array-handler ..float _type.float)) - (///bundle.install "double" (read-primitive-array-handler ..double _type.double)) - (///bundle.install "char" (read-primitive-array-handler ..char _type.char)) + (///bundle.install "boolean" (read-primitive-array-handler ..boolean jvm.boolean)) + (///bundle.install "byte" (read-primitive-array-handler ..byte jvm.byte)) + (///bundle.install "short" (read-primitive-array-handler ..short jvm.short)) + (///bundle.install "int" (read-primitive-array-handler ..int jvm.int)) + (///bundle.install "long" (read-primitive-array-handler ..long jvm.long)) + (///bundle.install "float" (read-primitive-array-handler ..float jvm.float)) + (///bundle.install "double" (read-primitive-array-handler ..double jvm.double)) + (///bundle.install "char" (read-primitive-array-handler ..char jvm.char)) (///bundle.install "object" array::read::object)))) (dictionary.merge (<| (///bundle.prefix "write") (|> ///bundle.empty - (///bundle.install "boolean" (write-primitive-array-handler ..boolean _type.boolean)) - (///bundle.install "byte" (write-primitive-array-handler ..byte _type.byte)) - (///bundle.install "short" (write-primitive-array-handler ..short _type.short)) - (///bundle.install "int" (write-primitive-array-handler ..int _type.int)) - (///bundle.install "long" (write-primitive-array-handler ..long _type.long)) - (///bundle.install "float" (write-primitive-array-handler ..float _type.float)) - (///bundle.install "double" (write-primitive-array-handler ..double _type.double)) - (///bundle.install "char" (write-primitive-array-handler ..char _type.char)) + (///bundle.install "boolean" (write-primitive-array-handler ..boolean jvm.boolean)) + (///bundle.install "byte" (write-primitive-array-handler ..byte jvm.byte)) + (///bundle.install "short" (write-primitive-array-handler ..short jvm.short)) + (///bundle.install "int" (write-primitive-array-handler ..int jvm.int)) + (///bundle.install "long" (write-primitive-array-handler ..long jvm.long)) + (///bundle.install "float" (write-primitive-array-handler ..float jvm.float)) + (///bundle.install "double" (write-primitive-array-handler ..double jvm.double)) + (///bundle.install "char" (write-primitive-array-handler ..char jvm.char)) (///bundle.install "object" array::write::object)))) ))) @@ -1129,10 +1129,17 @@ #Special #Interface) +(def: reflection-arguments + (-> (List Text) (Operation (List Text))) + (|>> (monad.map error.monad jvm.parse-signature) + (:: error.monad map (list@map jvm.reflection-class)) + ////.lift)) + (def: (check-method class method-name method-style arg-classes method) (-> (java/lang/Class java/lang/Object) Text Method-Style (List Text) Method (Operation Bit)) (do ////.monad - [parameters (|> (Method::getGenericParameterTypes method) + [arg-classes (reflection-arguments arg-classes) + parameters (|> (Method::getGenericParameterTypes method) array.to-list (monad.map @ java-type-to-parameter)) #let [modifiers (Method::getModifiers method)] @@ -1167,7 +1174,8 @@ (def: (check-constructor class arg-classes constructor) (-> (java/lang/Class java/lang/Object) (List Text) (Constructor java/lang/Object) (Operation Bit)) (do ////.monad - [parameters (|> (Constructor::getGenericParameterTypes constructor) + [arg-classes (reflection-arguments arg-classes) + parameters (|> (Constructor::getGenericParameterTypes constructor) array.to-list (monad.map @ java-type-to-parameter))] (wrap (and (java/lang/Object::equals class (Constructor::getDeclaringClass constructor)) @@ -1469,7 +1477,7 @@ (def: (generic-type mapping generic) (-> Mapping Generic (Check .Type)) (case generic - (#_type.Var var) + (#jvm.Var var) (case (dictionary.get var mapping) #.None (check.throw unknown-jvm-type-var var) @@ -1477,7 +1485,7 @@ (#.Some type) (check@wrap type)) - (#_type.Wildcard wildcard) + (#jvm.Wildcard wildcard) (case wildcard #.None (do check.monad @@ -1488,13 +1496,13 @@ (do check.monad [limitT (generic-type mapping limit)] (case bound - #_type.Lower + #jvm.Lower (wrap (lower-relationship-type limitT)) - #_type.Upper + #jvm.Upper (wrap (upper-relationship-type limitT))))) - (#_type.Class name parameters) + (#jvm.Class name parameters) (do check.monad [parametersT+ (monad.map @ (generic-type mapping) parameters)] (wrap (#.Primitive name parametersT+))))) @@ -1508,24 +1516,24 @@ (def: (jvm-type mapping type) (-> Mapping Type (Check .Type)) (case type - (#_type.Primitive primitive) + (#jvm.Primitive primitive) (check@wrap (case primitive - #_type.Boolean ..boolean - #_type.Byte ..byte - #_type.Short ..short - #_type.Int ..int - #_type.Long ..long - #_type.Float ..float - #_type.Double ..double - #_type.Char ..char)) + #jvm.Boolean ..boolean + #jvm.Byte ..byte + #jvm.Short ..short + #jvm.Int ..int + #jvm.Long ..long + #jvm.Float ..float + #jvm.Double ..double + #jvm.Char ..char)) - (#_type.Generic generic) + (#jvm.Generic generic) (generic-type mapping generic) - (#_type.Array type) + (#jvm.Array type) (case type - (#_type.Primitive primitive) - (check@wrap (#.Primitive (_type.descriptor (_type.array 1 type)) (list))) + (#jvm.Primitive primitive) + (check@wrap (#.Primitive (jvm.descriptor (jvm.array 1 type)) (list))) _ (do check.monad @@ -1625,24 +1633,24 @@ (def: (generic-analysis generic) (-> Generic Analysis) (case generic - (#_type.Var var) + (#jvm.Var var) (/////analysis.text var) - (#_type.Wildcard wildcard) + (#jvm.Wildcard wildcard) (case wildcard #.None (/////analysis.constant ["" "?"]) (#.Some [bound limit]) (/////analysis.tuple (list (case bound - #_type.Lower + #jvm.Lower (/////analysis.constant ["" ">"]) - #_type.Upper + #jvm.Upper (/////analysis.constant ["" "<"])) (generic-analysis limit)))) - (#_type.Class name parameters) + (#jvm.Class name parameters) (/////analysis.tuple (list& (/////analysis.text name) (list@map generic-analysis parameters))))) @@ -1667,21 +1675,21 @@ (def: (type-analysis type) (-> Type Analysis) (case type - (#_type.Primitive primitive) + (#jvm.Primitive primitive) (case primitive - #_type.Boolean (/////analysis.constant ["" "boolean"]) - #_type.Byte (/////analysis.constant ["" "byte"]) - #_type.Short (/////analysis.constant ["" "short"]) - #_type.Int (/////analysis.constant ["" "int"]) - #_type.Long (/////analysis.constant ["" "long"]) - #_type.Float (/////analysis.constant ["" "float"]) - #_type.Double (/////analysis.constant ["" "double"]) - #_type.Char (/////analysis.constant ["" "char"])) + #jvm.Boolean (/////analysis.constant ["" "boolean"]) + #jvm.Byte (/////analysis.constant ["" "byte"]) + #jvm.Short (/////analysis.constant ["" "short"]) + #jvm.Int (/////analysis.constant ["" "int"]) + #jvm.Long (/////analysis.constant ["" "long"]) + #jvm.Float (/////analysis.constant ["" "float"]) + #jvm.Double (/////analysis.constant ["" "double"]) + #jvm.Char (/////analysis.constant ["" "char"])) - (#_type.Generic generic) + (#jvm.Generic generic) (generic-analysis generic) - (#_type.Array type) + (#jvm.Array type) (/////analysis.tuple (list (type-analysis type))))) (def: (return-analysis return) |