Lower typed bytes builders to Kotlin
ober
03728c8908c6c189f94f514bb6f92ac14137b8e5
--- a/lib/jerboa/typed/kotlin/lower.ss +++ b/lib/jerboa/typed/kotlin/lower.ss @@ -137,6 +137,12 @@ [(eq? type 'Float32) (make-kt-lit 'Float32 value)] [else (error 'lower-lit "unsupported literal type" type value)])) + (def (lower-to-kotlin-int ir) + (let ([expr (lower-expr ir)]) + (if (eq? (typed-ir-node-type ir) 'Int32) + expr + (make-kt-member-call expr 'toInt '())))) + (def (chain-binary op args) (cond [(null? args) (error 'chain-binary "expected at least one arg" op)] @@ -419,6 +425,18 @@ (lower-expr (typed-ir-for-fold-body ir)))))) (kt-name1 acc-name)))) + (def (lower-bytes-build ir) + (make-kt-call + (kt-name1 'ByteArray) + (list + (lower-to-kotlin-int (typed-ir-bytes-build-size ir)) + (make-kt-lambda + (list (typed-ir-bytes-build-var-name ir)) + (make-kt-member-call + (lower-expr (typed-ir-bytes-build-body ir)) + 'toByte + '()))))) + (def (lower-expr ir) (cond [(typed-ir-lit? ir) @@ -436,6 +454,8 @@ (lower-expr (typed-ir-if-else ir)))] [(typed-ir-for-fold? ir) (lower-for-fold ir)] + [(typed-ir-bytes-build? ir) + (lower-bytes-build ir)] [(typed-ir-call? ir) (lower-call ir)] [else (error 'lower-expr "unsupported typed IR node for Kotlin" ir)])) --- a/tests/test-typed-kotlin.ss +++ b/tests/test-typed-kotlin.ss @@ -520,6 +520,31 @@ boolean-array-build-kotlin "BooleanArray(items.size, { index -> (items[index] >= threshold) })") +(define bytes-build-form + '(typed-library (sample typed bytesbuild) + (export lowBytes) + (type Int32) + (type IntArray) + (def (lowBytes (items : IntArray)) : Bytes + (bytes-build + (* (int-array-length items) (int32 4)) + (index + (bitwise-and + (bitwise-arithmetic-shift-right + (int-array-ref items (/ (int32 index) (int32 4))) + (* (mod (int32 index) (int32 4)) (int32 8))) + (int32 255))))))) + +(define bytes-build-kotlin + (typed-library-form->kotlin-string bytes-build-form)) + +(test-contains "Bytes build lowers to Kotlin ByteArray constructor" + bytes-build-kotlin + "ByteArray((items.size * 4), { index ->") +(test-contains "Bytes build lowers body to Byte" + bytes-build-kotlin + ".toByte()") + (define list-form '(typed-library (sample typed lists) (export make-Cell Cell? Cell-x listCount firstX secondName)