Preserve Kotlin package segments in qualified names

ober

53564cde9654baa98badc585b75952956d2b88b7

diff --git a/lib/jerboa/typed/kotlin/print.ss b/lib/jerboa/typed/kotlin/print.ss
index 45342ae..72150c2 100644
--- a/lib/jerboa/typed/kotlin/print.ss
+++ b/lib/jerboa/typed/kotlin/print.ss
@@ -90,12 +90,27 @@
   (def (kotlin-symbol-name sym)
     (sanitize-kotlin-ident (part->string sym)))
 
+  (def (kotlin-qualified-part-name part)
+    (let ([text (part->string part)])
+      (let ([name
+             (let ([port (open-output-string)])
+               (let loop ([chars (string->list text)])
+                 (unless (null? chars)
+                   (write-kotlin-ident-char (car chars) port)
+                   (loop (cdr chars))))
+               (get-output-string port))])
+        (cond
+          [(string=? name "") "_"]
+          [(not (identifier-start? (string-ref name 0)))
+           (string-append "_" name)]
+          [else name]))))
+
   (def (name-parts->strings parts)
     (cond
       [(null? parts) '()]
       [(pair? parts)
-       (map kotlin-symbol-name parts)]
-      [else (list (kotlin-symbol-name parts))]))
+       (map kotlin-qualified-part-name parts)]
+      [else (list (kotlin-qualified-part-name parts))]))
 
   (def (kotlin-package-name parts)
     (join-strings (name-parts->strings parts) "."))
diff --git a/tests/test-typed-kotlin.ss b/tests/test-typed-kotlin.ss
index c6df4e0..0418de5 100644
--- a/tests/test-typed-kotlin.ss
+++ b/tests/test-typed-kotlin.ss
@@ -47,6 +47,9 @@
 (test "identifier predicate" (kotlin-symbol-name 'focused?) "focused_p")
 (test "identifier keyword escape" (kotlin-symbol-name 'class) "_class")
 (test "package" (kotlin-package-name '(sample typed calc)) "sample.typed.calc")
+(test "qualified package segment keyword"
+      (kotlin-package-name '(java nio file Files))
+      "java.nio.file.Files")
 (test "string literal escapes"
   (kotlin-string-literal "a\n\"b\"\\c")
   "\"a\\n\\\"b\\\"\\\\c\"")