Quote Kotlin keyword member names

ober

4128d613222aa16f9d2cb8b7c311c73fb4760ecf

diff --git a/lib/jerboa/typed/kotlin/print.ss b/lib/jerboa/typed/kotlin/print.ss
index 4bdf142..9947380 100644
--- a/lib/jerboa/typed/kotlin/print.ss
+++ b/lib/jerboa/typed/kotlin/print.ss
@@ -90,6 +90,24 @@
   (def (kotlin-symbol-name sym)
     (sanitize-kotlin-ident (part->string sym)))
 
+  (def (sanitize-kotlin-member-ident raw)
+    (let ([port (open-output-string)])
+      (let loop ([chars (string->list raw)])
+        (unless (null? chars)
+          (write-kotlin-ident-char (car chars) port)
+          (loop (cdr chars))))
+      (let ([name (get-output-string port)])
+        (cond
+          [(string=? name "") "_"]
+          [(not (identifier-start? (string-ref name 0)))
+           (string-append "_" name)]
+          [(kotlin-keyword? name)
+           (string-append "`" name "`")]
+          [else name]))))
+
+  (def (kotlin-member-name sym)
+    (sanitize-kotlin-member-ident (part->string sym)))
+
   (def (kotlin-qualified-part-name part)
     (let ([text (part->string part)])
       (let ([name
@@ -280,7 +298,7 @@
        (string-append
          (kotlin-member-target->string (kt-member-call-target expr))
          "."
-         (kotlin-symbol-name (kt-member-call-name expr))
+         (kotlin-member-name (kt-member-call-name expr))
          "("
          (join-strings (map kotlin-expr->string (kt-member-call-args expr)) ", ")
          ")")]
@@ -288,7 +306,7 @@
        (string-append
          (kotlin-member-target->string (kt-member-get-target expr))
          "."
-         (kotlin-symbol-name (kt-member-get-name expr)))]
+         (kotlin-member-name (kt-member-get-name expr)))]
       [(kt-index-get? expr)
        (string-append
          (kotlin-member-target->string (kt-index-get-target expr))
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index c733522..e511b14 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -53,6 +53,13 @@
 (test "expression keyword name escape"
       (kotlin-expr->string (make-kt-name '(out)))
       "_out")
+(test "member keyword name is backticked"
+      (kotlin-expr->string
+        (make-kt-member-call
+          (make-kt-name '(assets))
+          'open
+          (list (make-kt-lit 'String "box_types.csv"))))
+      "assets.`open`(\"box_types.csv\")")
 (test "string literal escapes"
   (kotlin-string-literal "a\n\"b\"\\c")
   "\"a\\n\\\"b\\\"\\\\c\"")