Add typed Kotlin JSON array readers

ober

20d981990dd725913b9d38e5d66e0ad861d61d2e

diff --git a/lib/jerboa/typed/checker.ss b/lib/jerboa/typed/checker.ss
index 6f6dfa5..7ee33d4 100644
--- a/lib/jerboa/typed/checker.ss
+++ b/lib/jerboa/typed/checker.ss
@@ -500,6 +500,12 @@
       (cons 'json-array-get-json-object
             (make-typed-call-sig (list 'JSONArray 'Int32) 'JSONObject '()
               'jvm-json-array-get-json-object '()))
+      (cons 'json-array-opt-json-object
+            (make-typed-call-sig (list 'JSONArray 'Int32) (list 'Nullable 'JSONObject) '()
+              'jvm-json-array-opt-json-object '()))
+      (cons 'json-array-opt-string
+            (make-typed-call-sig (list 'JSONArray 'Int32) 'String '()
+              'jvm-json-array-opt-string '()))
       (cons 'json-array-length
             (make-typed-call-sig (list 'JSONArray) 'Int32 '()
               'jvm-json-array-length '()))
diff --git a/lib/jerboa/typed/core.ss b/lib/jerboa/typed/core.ss
index 7587fa4..0dcd27b 100644
--- a/lib/jerboa/typed/core.ss
+++ b/lib/jerboa/typed/core.ss
@@ -145,6 +145,8 @@
       jvm-json-array-put-string
       jvm-json-array-put-json-object
       jvm-json-array-get-json-object
+      jvm-json-array-opt-json-object
+      jvm-json-array-opt-string
       jvm-json-array-length
       jvm-json-array-opt-float32
       jvm-json-object-empty
diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index 6401fa1..0fb1e93 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -406,6 +406,10 @@
            (make-kt-lit 'Unit '()))]
         [(jvm-json-array-get-json-object)
          (make-kt-member-call (car args) 'getJSONObject (cdr args))]
+        [(jvm-json-array-opt-json-object)
+         (make-kt-member-call (car args) 'optJSONObject (cdr args))]
+        [(jvm-json-array-opt-string)
+         (make-kt-member-call (car args) 'optString (cdr args))]
         [(jvm-json-array-length)
          (make-kt-member-call (car args) 'length '())]
         [(jvm-json-array-opt-float32)
diff --git a/tests/test-typed-checker.ss b/tests/test-typed-checker.ss
index b12def2..91e0b96 100644
--- a/tests/test-typed-checker.ss
+++ b/tests/test-typed-checker.ss
@@ -1009,6 +1009,19 @@
            (json-object-opt-json-array json "items")))))
   '())
 
+(test "json-array optional readers accept JSON arrays"
+  (error-kinds
+    '(typed-library (body json-array-optional-readers)
+       (export read-values)
+       (type JSONObject)
+       (type JSONArray)
+       (type Int32)
+       (def (read-values (items : JSONArray) (index : Int32)) : (Pair String (Nullable JSONObject))
+         (pair
+           (json-array-opt-string items index)
+           (json-array-opt-json-object items index)))))
+  '())
+
 (test "json-object accepts nested object puts"
   (error-kinds
     '(typed-library (body json-object-nested)
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index 1bb42bc..c30e1ba 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -700,6 +700,25 @@
        (def (getObject (items : JSONArray) (index : Int32)) : JSONObject
          (json-array-get-json-object items index))))
   "items.getJSONObject(index)")
+(test-contains "JSONArray opt JSONObject lowers to nullable optJSONObject"
+  (typed-library-form->kotlin-string
+    '(typed-library (sample typed json-array-opt-object)
+       (export optObject)
+       (type JSONArray)
+       (type JSONObject)
+       (type Int32)
+       (def (optObject (items : JSONArray) (index : Int32)) : (Nullable JSONObject)
+         (json-array-opt-json-object items index))))
+  "items.optJSONObject(index)")
+(test-contains "JSONArray opt String lowers to optString"
+  (typed-library-form->kotlin-string
+    '(typed-library (sample typed json-array-opt-string)
+       (export optName)
+       (type JSONArray)
+       (type Int32)
+       (def (optName (items : JSONArray) (index : Int32)) : String
+         (json-array-opt-string items index))))
+  "items.optString(index)")
 (test-contains "JSONArray length lowers to method call"
   json-array-kotlin
   "items.length()")