Add typed Kotlin JSON object reader

ober

451037e0ec6e13b31301b26b339e5a6b88693beb

diff --git a/lib/jerboa/typed/checker.ss b/lib/jerboa/typed/checker.ss
index 7ee33d4..0ac0758 100644
--- a/lib/jerboa/typed/checker.ss
+++ b/lib/jerboa/typed/checker.ss
@@ -545,6 +545,9 @@
       (cons 'json-object-opt-json-array
             (make-typed-call-sig (list 'JSONObject 'String) (list 'Nullable 'JSONArray) '()
               'jvm-json-object-opt-json-array '()))
+      (cons 'json-object-opt-json-object
+            (make-typed-call-sig (list 'JSONObject 'String) (list 'Nullable 'JSONObject) '()
+              'jvm-json-object-opt-json-object '()))
       (cons 'system-current-time-millis-string
             (make-typed-call-sig '() 'String '()
               'jvm-system-current-time-millis-string '()))
diff --git a/lib/jerboa/typed/core.ss b/lib/jerboa/typed/core.ss
index 0dcd27b..99e58e7 100644
--- a/lib/jerboa/typed/core.ss
+++ b/lib/jerboa/typed/core.ss
@@ -160,6 +160,7 @@
       jvm-json-object-opt-float32
       jvm-json-object-opt-int32-default
       jvm-json-object-opt-json-array
+      jvm-json-object-opt-json-object
       jvm-string-substring-before
       jvm-system-current-time-millis-string
       record-ctor
diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index 0fb1e93..f6155d9 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -484,6 +484,8 @@
          (make-kt-member-call (car args) 'optInt (cdr args))]
         [(jvm-json-object-opt-json-array)
          (make-kt-member-call (car args) 'optJSONArray (cdr args))]
+        [(jvm-json-object-opt-json-object)
+         (make-kt-member-call (car args) 'optJSONObject (cdr args))]
         [(jvm-boolean-array-ref)
          (make-kt-index-get (car args) (cadr args))]
         [(jvm-boolean-array-set)
diff --git a/tests/test-typed-checker.ss b/tests/test-typed-checker.ss
index 91e0b96..6d92bdb 100644
--- a/tests/test-typed-checker.ss
+++ b/tests/test-typed-checker.ss
@@ -1003,10 +1003,20 @@
        (type JSONObject)
        (type JSONArray)
        (type Int32)
-       (def (read-values (json : JSONObject) (items : JSONArray)) : (Pair JSONObject (Nullable JSONArray))
+       (def (read-values (json : JSONObject) (items : JSONArray)) : (Pair JSONObject (Nullable JSONObject))
          (pair
            (json-array-get-json-object items (json-object-opt-int32-default json "index" (int32 0)))
-           (json-object-opt-json-array json "items")))))
+           (json-object-opt-json-object json "meta")))))
+  '())
+
+(test "json-object optional array reader accepts JSON arrays"
+  (error-kinds
+    '(typed-library (body json-object-optional-array-reader)
+       (export read-items)
+       (type JSONObject)
+       (type JSONArray)
+       (def (read-items (json : JSONObject)) : (Nullable JSONArray)
+         (json-object-opt-json-array json "items"))))
   '())
 
 (test "json-array optional readers accept JSON arrays"
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index c30e1ba..ed8a92b 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -728,7 +728,7 @@
 
 (define json-object-form
   '(typed-library (sample typed json-object)
-     (export makeCell readX readCount readItems readName readNameDefault)
+     (export makeCell readX readCount readItems readMeta readName readNameDefault)
      (type JSONObject)
      (type JSONArray)
      (type Float32)
@@ -751,6 +751,8 @@
        (json-object-opt-int32-default json "count" (int32 1)))
      (def (readItems (json : JSONObject)) : (Nullable JSONArray)
        (json-object-opt-json-array json "items"))
+     (def (readMeta (json : JSONObject)) : (Nullable JSONObject)
+       (json-object-opt-json-object json "meta"))
      (def (readName (json : JSONObject)) : String
        (json-object-opt-string json "name"))
      (def (readNameDefault (json : JSONObject)) : String
@@ -785,6 +787,9 @@
 (test-contains "JSONObject opt JSONArray lowers to nullable optJSONArray"
   json-object-kotlin
   "json.optJSONArray(\"items\")")
+(test-contains "JSONObject opt JSONObject lowers to nullable optJSONObject"
+  json-object-kotlin
+  "json.optJSONObject(\"meta\")")
 (test-contains "JSONObject opt String lowers to optString"
   json-object-kotlin
   "json.optString(\"name\")")