Lower typed JVM array setters to Kotlin
ober
31acfe4e8ba4bef80851d73d7ba62ff1b8282a47
--- a/lib/jerboa/typed/checker.ss +++ b/lib/jerboa/typed/checker.ss @@ -397,18 +397,27 @@ (cons 'float-array-ref (make-typed-call-sig (list 'FloatArray 'Int32) 'Float32 '() 'jvm-float-array-ref '())) + (cons 'float-array-set! + (make-typed-call-sig (list 'FloatArray 'Int32 'Float32) 'Unit '() + 'jvm-float-array-set '())) (cons 'float-array-length (make-typed-call-sig (list 'FloatArray) 'Int32 '() 'jvm-float-array-length '())) (cons 'int-array-ref (make-typed-call-sig (list 'IntArray 'Int32) 'Int32 '() 'jvm-int-array-ref '())) + (cons 'int-array-set! + (make-typed-call-sig (list 'IntArray 'Int32 'Int32) 'Unit '() + 'jvm-int-array-set '())) (cons 'int-array-length (make-typed-call-sig (list 'IntArray) 'Int32 '() 'jvm-int-array-length '())) (cons 'boolean-array-ref (make-typed-call-sig (list 'BooleanArray 'Int32) 'Bool '() 'jvm-boolean-array-ref '())) + (cons 'boolean-array-set! + (make-typed-call-sig (list 'BooleanArray 'Int32 'Bool) 'Unit '() + 'jvm-boolean-array-set '())) (cons 'boolean-array-length (make-typed-call-sig (list 'BooleanArray) 'Int32 '() 'jvm-boolean-array-length '())) --- a/lib/jerboa/typed/kotlin/lower.ss +++ b/lib/jerboa/typed/kotlin/lower.ss @@ -288,10 +288,20 @@ (make-kt-call (kt-name1 'floatArrayOf) args)] [(jvm-float-array-ref) (make-kt-index-get (car args) (cadr args))] + [(jvm-float-array-set) + (make-kt-block + (list (make-kt-assign (make-kt-index-get (car args) (cadr args)) + (caddr args))) + (make-kt-lit 'Unit '()))] [(jvm-float-array-length) (make-kt-member-get (car args) 'size)] [(jvm-int-array-ref) (make-kt-index-get (car args) (cadr args))] + [(jvm-int-array-set) + (make-kt-block + (list (make-kt-assign (make-kt-index-get (car args) (cadr args)) + (caddr args))) + (make-kt-lit 'Unit '()))] [(jvm-int-array-length) (make-kt-member-get (car args) 'size)] [(jvm-int-array-build) @@ -308,6 +318,11 @@ (make-kt-index-get (car args) (cadr args))] [(jvm-boolean-array-ref) (make-kt-index-get (car args) (cadr args))] + [(jvm-boolean-array-set) + (make-kt-block + (list (make-kt-assign (make-kt-index-get (car args) (cadr args)) + (caddr args))) + (make-kt-lit 'Unit '()))] [(jvm-boolean-array-length) (make-kt-member-get (car args) 'size)] [(bytevector-length) --- a/tests/test-typed-kotlin.ss +++ b/tests/test-typed-kotlin.ss @@ -457,6 +457,34 @@ (test-contains "IntArray length lowers to Kotlin size" array-kotlin "return items.size") +(define array-set-form + '(typed-library (sample typed arrayset) + (export setGray setEdge setWeight) + (type Int32) + (type IntArray) + (type BooleanArray) + (type Float32) + (type FloatArray) + (def (setGray (items : IntArray) (index : Int32) (value : Int32)) : Unit + (int-array-set! items index value)) + (def (setEdge (items : BooleanArray) (index : Int32) (value : Bool)) : Unit + (boolean-array-set! items index value)) + (def (setWeight (items : FloatArray) (index : Int32) (value : Float32)) : Unit + (float-array-set! items index value)))) + +(define array-set-kotlin + (typed-library-form->kotlin-string array-set-form)) + +(test-contains "IntArray set lowers to Kotlin indexed assignment" + array-set-kotlin + "items[index] = value") +(test-contains "BooleanArray set lowers to Kotlin indexed assignment" + array-set-kotlin + "fun setEdge(items: BooleanArray, index: Int, value: Boolean)") +(test-contains "FloatArray set lowers to Kotlin indexed assignment" + array-set-kotlin + "fun setWeight(items: FloatArray, index: Int, value: Float)") + (define int-array-build-form '(typed-library (sample typed intarraybuild) (export copyPlusOne)