Support emitted Kotlin names for typed defs

ober

dc45028545d8c7ec19f2a0a3356dc947c3c7da9b

diff --git a/lib/jerboa/typed/kotlin/lower.ss b/lib/jerboa/typed/kotlin/lower.ss
index dbb4c80..47a1c01 100644
--- a/lib/jerboa/typed/kotlin/lower.ss
+++ b/lib/jerboa/typed/kotlin/lower.ss
@@ -1008,7 +1008,8 @@
       (make-kt-function
         #f
         (typed-def-modifiers def)
-        (typed-def-name def)
+        (or (typed-def-kotlin-name def)
+            (typed-def-name def))
         (map lower-param (typed-def-params def))
         (typed-type->kotlin-type (typed-def-return-type def))
         (if (eq? (typed-def-return-type def) 'Unit)
diff --git a/lib/jerboa/typed/parser.ss b/lib/jerboa/typed/parser.ss
index 85aff48..d2b4e56 100644
--- a/lib/jerboa/typed/parser.ss
+++ b/lib/jerboa/typed/parser.ss
@@ -73,7 +73,7 @@
 
     typed-def? make-typed-def
     typed-def-name typed-def-params typed-def-return-type
-    typed-def-effects typed-def-modifiers
+    typed-def-effects typed-def-modifiers typed-def-kotlin-name
     typed-def-body typed-def-source)
 
   (import (chezscheme) ; jerboa-security: suppress direct-chezscheme-import-user-code -- trusted typed compiler front-end module
@@ -94,7 +94,7 @@
   (defstruct typed-variant (name cases source))
   (defstruct typed-variant-case (name fields source))
   (defstruct typed-param (name type source))
-  (defstruct typed-def (name params return-type effects modifiers body source))
+  (defstruct typed-def (name params return-type effects modifiers kotlin-name body source))
 
   (def (strip-source-annotations datum)
     (cond
@@ -413,6 +413,11 @@
       (and (pair? form)
            (eq? (car form) 'modifiers))))
 
+  (def (kotlin-name-form? form)
+    (let ([form (strip-source-annotations form)])
+      (and (pair? form)
+           (eq? (car form) 'kotlin-name))))
+
   (def (parse-modifiers-form form)
     (expect-proper-list 'parse-typed-def form)
     (unless (symbol-list? form)
@@ -421,8 +426,18 @@
         form))
     (cdr form))
 
+  (def (parse-kotlin-name-form form)
+    (expect-length 'parse-typed-def form 2)
+    (expect-symbol 'parse-typed-def (cadr form) form))
+
   (def (parse-def-options-and-body body)
-    (let loop ([rest body] [effects '()] [modifiers '()] [seen-effects? #f] [seen-modifiers? #f])
+    (let loop ([rest body]
+               [effects '()]
+               [modifiers '()]
+               [kotlin-name #f]
+               [seen-effects? #f]
+               [seen-modifiers? #f]
+               [seen-kotlin-name? #f])
       (cond
         [(and (pair? rest) (effects-marker? (datum-value (car rest))))
          (when seen-effects?
@@ -435,8 +450,10 @@
                (parse-effects-form
                  (strip-source-annotations (cadr rest)))
                modifiers
+               kotlin-name
                #t
-               seen-modifiers?)]
+               seen-modifiers?
+               seen-kotlin-name?)]
         [(and (pair? rest) (modifiers-form? (car rest)))
          (when seen-modifiers?
            (error 'parse-typed-def "duplicate modifiers option" body))
@@ -444,14 +461,27 @@
                effects
                (parse-modifiers-form
                  (strip-source-annotations (car rest)))
+               kotlin-name
+               seen-effects?
+               #t
+               seen-kotlin-name?)]
+        [(and (pair? rest) (kotlin-name-form? (car rest)))
+         (when seen-kotlin-name?
+           (error 'parse-typed-def "duplicate kotlin-name option" body))
+         (loop (cdr rest)
+               effects
+               modifiers
+               (parse-kotlin-name-form
+                 (strip-source-annotations (car rest)))
                seen-effects?
+               seen-modifiers?
                #t)]
         [else
          (when (null? rest)
            (error 'parse-typed-def
              "def with options still needs a body"
              body))
-         (values effects modifiers rest)])))
+         (values effects modifiers kotlin-name rest)])))
 
   (def (parse-def form)
     (let* ([source (datum-source form)]
@@ -471,7 +501,7 @@
             "expected : or -> before return type"
             form))
         (let-values ([(name params) (parse-def-head head)])
-          (let-values ([(effects modifiers parsed-body)
+          (let-values ([(effects modifiers kotlin-name parsed-body)
                         (parse-def-options-and-body raw-body)])
             (make-typed-def
               name
@@ -479,6 +509,7 @@
               (parse-typed-type return-type)
               effects
               modifiers
+              kotlin-name
               parsed-body
               source))))))
 
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index b265105..4b8b488 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -1532,6 +1532,23 @@
        (def (ready) : Bool
          (densityReady density)))))
 
+(define kotlin-name-form
+  '(typed-library (sample typed kotlinname)
+     (export Reader)
+     (type Int32)
+     (type Bytes)
+     (type ReaderBase)
+     (class Reader ()
+       (extends ReaderBase)
+       (def (read-one) : Int32
+         (modifiers override)
+         (kotlin-name read)
+         (int32 1))
+       (def (read-buffer (buffer : Bytes) (offset : Int32) (length : Int32)) : Int32
+         (modifiers override)
+         (kotlin-name read)
+         length))))
+
 (define return-form
   '(typed-library (sample typed returns)
      (export guarded)
@@ -1559,6 +1576,9 @@
 (define class-declaration-kotlin
   (typed-library-form->kotlin-string class-declaration-form))
 
+(define kotlin-name-kotlin
+  (typed-library-form->kotlin-string kotlin-name-form))
+
 (test-contains "typed class declaration lowers constructor and superclass"
   class-declaration-kotlin
   "class ReviewView(context: Context) : View(context) {")
@@ -1583,6 +1603,12 @@
 (test-contains "typed class declaration lowers method modifiers"
   class-declaration-kotlin
   "override fun performClick(): Boolean {\n        return run {\n    bindSelf(this)\n    super.performClick()\n    true\n}")
+(test-contains "typed def kotlin-name lowers emitted method name"
+  kotlin-name-kotlin
+  "override fun read(): Int")
+(test-contains "typed def kotlin-name permits overloaded emitted method name"
+  kotlin-name-kotlin
+  "override fun read(buffer: ByteArray, offset: Int, length: Int): Int")
 (test-contains "typed return lowers to Kotlin return statement"
   return-kotlin
   "return true")