Lower typed bytes builders to Kotlin

ober

03728c8908c6c189f94f514bb6f92ac14137b8e5

diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index c4a7545..289f82b 100644
--- 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)]))
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index a5ce68e..27d8126 100644
--- 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)