Support emitted Kotlin names for typed defs
ober
dc45028545d8c7ec19f2a0a3356dc947c3c7da9b
--- 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) --- 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)))))) --- 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")