Lower UTF-8 conversions to Kotlin

ober

45689469df19c42f5f282439c3aa356ac96a5021

diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index 5f8e703..5f9105f 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -598,6 +598,16 @@
            (make-kt-member-get (car args) 'size)
            'toULong
            '())]
+        [(string->utf8)
+         (make-kt-member-call
+           (car args)
+           'toByteArray
+           (list (make-kt-member-get (kt-name1 'Charsets) 'UTF_8)))]
+        [(utf8->string)
+         (make-kt-member-call
+           (car args)
+           'decodeToString
+           '())]
         [(jvm-bytes-lower-hex)
          (make-kt-member-call
            (make-kt-member-call
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index 28f588e..fae3f02 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -645,6 +645,29 @@
   bytes-build-kotlin
   "java.math.BigInteger(1, items).toString(16).padStart((items.size * 2), '0')")
 
+(define utf8-form
+  '(typed-library (sample typed utf8)
+     (export encode decode encodedLength)
+     (def (encode (text : String)) : Bytes
+       (string->utf8 text))
+     (def (decode (data : Bytes)) : String
+       (utf8->string data))
+     (def (encodedLength (text : String)) : Nat
+       (bytevector-length (string->utf8 text)))))
+
+(define utf8-kotlin
+  (typed-library-form->kotlin-string utf8-form))
+
+(test-contains "string->utf8 lowers to Kotlin UTF-8 bytes"
+  utf8-kotlin
+  "text.toByteArray(Charsets.UTF_8)")
+(test-contains "utf8->string lowers to Kotlin decodeToString"
+  utf8-kotlin
+  "data.decodeToString()")
+(test-contains "bytevector-length of encoded text lowers through bytes size"
+  utf8-kotlin
+  "text.toByteArray(Charsets.UTF_8).size.toULong()")
+
 (define list-form
   '(typed-library (sample typed lists)
      (export make-Cell Cell? Cell-x listCount firstX secondName