KT-11410: Class hierarchy for parts/facade of multi-file class.
Preserve static initialization semantics for parts by introducing a special "clinit trigger" class.
Insert "static initialization trigger" call to every method of a part class, remove this call on inline.
Always mangle names for private functions in multifile class parts to avoid resolution clashes on inheritance.
NB in codegen tests initializers for all non-const vals are wrapped in 'run { ... }',
so that the initializer is not a constant expression, and some static initialization code should be generated.
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = (::ok)()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
fun ok() = "OK"
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = okInline()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
internal val ok = run { "OK" }
|
||||
|
||||
internal inline fun okInline() =
|
||||
::ok.get()
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = OK.okRef.get()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private val ok = run { "OK" }
|
||||
|
||||
object OK {
|
||||
val okRef = ::ok
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = ::OK.get()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val OK = run { "OK" }
|
||||
@@ -0,0 +1,29 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: Baz.java
|
||||
|
||||
public class Baz {
|
||||
public static String baz() {
|
||||
return Util.foo() + Util.bar();
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: bar.kt
|
||||
|
||||
@file:JvmName("Util")
|
||||
@file:JvmMultifileClass
|
||||
public fun bar(): String = barx()
|
||||
|
||||
public fun foox(): String = "O"
|
||||
|
||||
// FILE: foo.kt
|
||||
|
||||
@file:JvmName("Util")
|
||||
@file:JvmMultifileClass
|
||||
public fun foo(): String = foox()
|
||||
|
||||
public fun barx(): String = "K"
|
||||
|
||||
// FILE: test.kt
|
||||
|
||||
fun box(): String = Baz.baz()
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = OK
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val O = run { "O" }
|
||||
|
||||
// FILE: part2.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
const val K = "K"
|
||||
|
||||
// FILE: part3.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val OK: String = run { O + K }
|
||||
|
||||
// FILE: irrelevantPart.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val X1: Nothing =
|
||||
throw AssertionError("X1 should not be initialized")
|
||||
|
||||
// FILE: reallyIrrelevantPart.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val X2: Nothing =
|
||||
throw AssertionError("X2 should not be initialized")
|
||||
@@ -0,0 +1,13 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = OK
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val OK: String by lazy { "OK" }
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = ok()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private val OK = run { "OK" }
|
||||
|
||||
fun ok() = OK
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = OK
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
public val OK = run { "OK" }
|
||||
@@ -0,0 +1,27 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = ok()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private fun overlapping() = "oops #1"
|
||||
|
||||
// FILE: part2.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
fun overlapping() = "OK"
|
||||
|
||||
fun ok() = overlapping()
|
||||
|
||||
// FILE: part3.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private fun overlapping() = "oops #2"
|
||||
@@ -0,0 +1,25 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = overlapping
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private val overlapping = run { "oops #1" }
|
||||
|
||||
// FILE: part2.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val overlapping = run { "OK" }
|
||||
|
||||
// FILE: part3.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private val overlapping = run { "oops #2" }
|
||||
Vendored
+27
@@ -0,0 +1,27 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = J.ok()
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MC") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val O = run { "O" }
|
||||
const val K = "K"
|
||||
|
||||
inline fun ok(): String {
|
||||
return O + K
|
||||
}
|
||||
|
||||
// FILE: J.java
|
||||
import a.MC;
|
||||
|
||||
public class J {
|
||||
public static String ok() {
|
||||
return MC.ok();
|
||||
}
|
||||
}
|
||||
Vendored
+19
@@ -0,0 +1,19 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = ok {}
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
val O = run { "O" }
|
||||
const val K = "K"
|
||||
|
||||
inline fun ok(block: () -> Unit): String {
|
||||
block()
|
||||
return O + K
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
// WITH_RUNTIME
|
||||
// KOTLIN_CONFIGURATION_FLAGS: +JVM.INHERIT_MULTIFILE_PARTS
|
||||
// FILE: box.kt
|
||||
|
||||
import a.*
|
||||
|
||||
fun box(): String = OK().ok
|
||||
|
||||
// FILE: part1.kt
|
||||
@file:[JvmName("MultifileClass") JvmMultifileClass]
|
||||
package a
|
||||
|
||||
private val reallyOk = run { "OK" }
|
||||
|
||||
class OK() {
|
||||
val ok = reallyOk
|
||||
}
|
||||
Reference in New Issue
Block a user