JVM IR: generate kotlin.Metadata.packageName value for JvmPackageName files

Support this for single file facades as well as for multi-file classes,
similar to code in
MultifileClassCodegen.writeKotlinMultifileFacadeAnnotationIfNeeded.
Extend the test on this attribute to also cover multi-file classes.
This commit is contained in:
Alexander Udalov
2019-11-08 20:30:33 +01:00
parent 808000e458
commit 9772de0088
4 changed files with 49 additions and 8 deletions
@@ -1,8 +1,7 @@
// IGNORE_BACKEND: JVM_IR
// TARGET_BACKEND: JVM
// WITH_RUNTIME
// FILE: foo.kt
// FILE: singleFileFacade.kt
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@file:JvmPackageName("baz.foo.quux.bar")
@@ -10,17 +9,35 @@ package foo.bar
fun f() {}
// FILE: multiFile.kt
@file:Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER")
@file:JvmPackageName("bar.baz.quux.foo")
@file:JvmMultifileClass
@file:JvmName("Facade")
package foo.bar
fun g() {}
// FILE: bar.kt
package test
fun getPackageName(classFqName: String): String =
Class.forName(classFqName).getAnnotation(Metadata::class.java).packageName
fun box(): String {
val bar = getPackageName("BarKt")
val bar = getPackageName("test.BarKt")
if (bar != "") return "Fail 1: $bar"
val foo = getPackageName("baz.foo.quux.bar.FooKt")
if (foo != "foo.bar") return "Fail 2: $foo"
val singleFileFacade = getPackageName("baz.foo.quux.bar.SingleFileFacadeKt")
if (singleFileFacade != "foo.bar") return "Fail 2: $singleFileFacade"
val multiFileFacade = getPackageName("bar.baz.quux.foo.Facade")
if (multiFileFacade != "foo.bar") return "Fail 3: $multiFileFacade"
val multiFilePart = getPackageName("bar.baz.quux.foo.Facade__MultiFileKt")
if (multiFilePart != "foo.bar") return "Fail 4: $multiFilePart"
return "OK"
}