Add typed Kotlin string parse helpers

ober

fac60b82834ffe3bf0fb259968bf96ef0e173acc

diff --git a/lib/jerboa/typed/checker.ss b/lib/jerboa/typed/checker.ss
index 207a7e8..8e12162 100644
--- a/lib/jerboa/typed/checker.ss
+++ b/lib/jerboa/typed/checker.ss
@@ -448,6 +448,12 @@
       (cons 'string-trim
             (make-typed-call-sig (list 'String) 'String '()
               'jvm-string-trim '()))
+      (cons 'string-remove-prefix
+            (make-typed-call-sig (list 'String 'String) 'String '()
+              'jvm-string-remove-prefix '()))
+      (cons 'string->int32-or-null
+            (make-typed-call-sig (list 'String) (list 'Nullable 'Int32) '()
+              'jvm-string-to-int32-or-null '()))
       (cons 'string-replace-regex
             (make-typed-call-sig (list 'String 'String 'String) 'String '()
               'jvm-string-replace-regex '()))
diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index 9ffc578..5113836 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -258,6 +258,10 @@
          (make-kt-member-call (car args) 'uppercase '())]
         [(jvm-string-trim)
          (make-kt-member-call (car args) 'trim '())]
+        [(jvm-string-remove-prefix)
+         (make-kt-member-call (car args) 'removePrefix (cdr args))]
+        [(jvm-string-to-int32-or-null)
+         (make-kt-member-call (car args) 'toIntOrNull '())]
         [(jvm-string-replace-regex)
          (make-kt-member-call
            (car args)
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index 3a6bea3..e8ba46b 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -628,6 +628,7 @@
 (define ocr-string-form
   '(typed-library (sample typed ocrstrings)
      (export normalizeOcr compact shouldReplaceOcrLabel)
+     (type Int32)
      (def (normalizeOcr (value : String)) : String
        (string-replace-regex
          (string-trim
@@ -641,6 +642,8 @@
        (string-filter-letter-or-digit (string-lowercase value)))
      (def (encoded (value : String)) : String
        (url-encode-utf8 value))
+     (def (idNumber (value : String)) : (Nullable Int32)
+       (string->int32-or-null (string-remove-prefix value "c")))
      (def (shouldReplaceOcrLabel (label : String) (status : String) (notes : String)) : Bool
        (let ((text (string-trim label)))
          (if (string-blank? text)
@@ -662,6 +665,10 @@
   ".trim()")
 (test-contains "String filter letter-or-digit lowers to Kotlin filter lambda" ocr-string-kotlin
   "value.lowercase().filter({ ch -> ch.isLetterOrDigit() })")
+(test-contains "String removePrefix lowers to Kotlin removePrefix" ocr-string-kotlin
+  "value.removePrefix(\"c\")")
+(test-contains "String toIntOrNull lowers to Kotlin nullable Int" ocr-string-kotlin
+  ".toIntOrNull()")
 (test-contains "URL encode UTF-8 lowers to Java URLEncoder" ocr-string-kotlin
   "java.net.URLEncoder.encode(value, \"UTF-8\")")
 (test-contains "String endsWith lowers to Kotlin endsWith" ocr-string-kotlin