Initial internal member mangling
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
open class A {
|
||||
internal open val field = "AF"
|
||||
|
||||
internal open fun test(): String = "AM"
|
||||
}
|
||||
|
||||
fun invokeOnA(a: A) = a.test() + a.field
|
||||
|
||||
class Z : A() {
|
||||
override val field: String = "ZF"
|
||||
|
||||
override fun test(): String = "ZM"
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
var invokeOnA = invokeOnA(A())
|
||||
if (invokeOnA != "AMAF") return "fail 1: $invokeOnA"
|
||||
|
||||
invokeOnA = invokeOnA(Z())
|
||||
if (invokeOnA != "ZMZF") return "fail 2: $invokeOnA"
|
||||
|
||||
val z = Z().test()
|
||||
if (z != "ZM") return "fail 3: $z"
|
||||
|
||||
val f = Z().field
|
||||
if (f != "ZF") return "fail 4: $f"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
open class A {
|
||||
internal open val field = "F"
|
||||
|
||||
internal open fun test(): String = "A"
|
||||
}
|
||||
|
||||
class Z : A() {
|
||||
override fun test(): String = super.test()
|
||||
|
||||
override val field = super.field
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
val z = Z().test()
|
||||
if (z != "A") return "fail 1: $z"
|
||||
|
||||
val f = Z().field
|
||||
if (f != "F") return "fail 2: $f"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
open class A {
|
||||
internal open val field = "AF"
|
||||
|
||||
internal open fun test(): String = "AM"
|
||||
}
|
||||
|
||||
fun invokeOnA(a: A) = a.test() + a.field
|
||||
|
||||
class Z : A() {
|
||||
public override val field: String = "ZF"
|
||||
|
||||
public override fun test(): String = "ZM"
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
var invokeOnA = invokeOnA(A())
|
||||
if (invokeOnA != "AMAF") return "fail 1: $invokeOnA"
|
||||
|
||||
invokeOnA = invokeOnA(Z())
|
||||
if (invokeOnA != "ZMZF") return "fail 2: $invokeOnA"
|
||||
|
||||
val z = Z().test()
|
||||
if (z != "ZM") return "fail 3: $z"
|
||||
|
||||
val f = Z().field
|
||||
if (f != "ZF") return "fail 4: $f"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
open class A {
|
||||
internal open val field = "F"
|
||||
|
||||
internal open fun test(): String = "A"
|
||||
}
|
||||
|
||||
class Z : A() {
|
||||
public override fun test(): String = super.test()
|
||||
|
||||
public override val field = super.field
|
||||
}
|
||||
|
||||
fun box() : String {
|
||||
val z = Z().test()
|
||||
if (z != "A") return "fail 1: $z"
|
||||
|
||||
val f = Z().field
|
||||
if (f != "F") return "fail 2: $f"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
//NO_CHECK_LAMBDA_INLINING
|
||||
import test.*
|
||||
|
||||
internal fun box(): String {
|
||||
fun box(): String {
|
||||
return bar { "OK" }.run()
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
public class JavaClass extends A {
|
||||
public String test() {
|
||||
return "Java";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
open class A {
|
||||
internal open fun test(): String = "Kotlin"
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
if (A().test() != "Kotlin") return "fail 1: ${A().test()}"
|
||||
|
||||
if (JavaClass().test() != "Java") return "fail 2: ${JavaClass().test()}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package test
|
||||
|
||||
internal val noMangling = 1;
|
||||
|
||||
class Z {
|
||||
internal var noMangling = 1;
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val clazz = Z::class.java
|
||||
val classField = clazz.getDeclaredField("noMangling")
|
||||
if (classField == null) return "Class internal backing field should exist"
|
||||
if (!classField.isSynthetic) return "Class internal backing field should be synthetic"
|
||||
|
||||
val topLevel = Class.forName("test.FieldKt").getDeclaredField("noMangling")
|
||||
if (topLevel == null) return "Top level internal backing field should exist"
|
||||
if (!topLevel.isSynthetic) return "Top level internal backing field should be synthetic"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package test
|
||||
|
||||
internal fun noMangling() = 1;
|
||||
|
||||
class Z {
|
||||
internal fun mangled() = 1;
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val clazz = Z::class.java
|
||||
val declaredMethods = clazz.declaredMethods
|
||||
|
||||
val mangled = declaredMethods.firstOrNull {
|
||||
it.name.startsWith("mangled$")
|
||||
}
|
||||
if (mangled == null) return "Class internal function should exist"
|
||||
if (!mangled.isSynthetic) return "Class internal function should be synthetic"
|
||||
|
||||
val topLevel = Class.forName("test.FunKt").getMethod("noMangling")
|
||||
if (topLevel == null) return "Top level internal function should exist"
|
||||
if (!topLevel.isSynthetic) return "Top level internal function should be synthetic"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
OUT:
|
||||
Buildfile: [TestData]/build.xml
|
||||
|
||||
build:
|
||||
[kotlinc] Compiling [[TestData]/module1.kt] => [[Temp]/module1.jar]
|
||||
[kotlinc] Compiling [[TestData]/module2.kt] => [[Temp]/module2.jar]
|
||||
[java] A_OA_K
|
||||
[java] B_OB_K
|
||||
[java] C_OC_K
|
||||
|
||||
BUILD SUCCESSFUL
|
||||
Total time: [time]
|
||||
|
||||
Return code: 0
|
||||
@@ -0,0 +1,21 @@
|
||||
<project name="Ant Task Test" default="build">
|
||||
<taskdef resource="org/jetbrains/kotlin/ant/antlib.xml" classpath="${kotlin.lib}/kotlin-ant.jar"/>
|
||||
|
||||
<target name="build">
|
||||
<kotlinc src="${test.data}/module1.kt" output="${temp}/module1.jar" modulename="module1"/>
|
||||
|
||||
<kotlinc src="${test.data}/module2.kt" output="${temp}/module2.jar" modulename="module2">
|
||||
<classpath>
|
||||
<pathelement path="${temp}/module1.jar"/>
|
||||
</classpath>
|
||||
</kotlinc>
|
||||
|
||||
<java classname="hello.Module2Kt" fork="true">
|
||||
<classpath>
|
||||
<pathelement path="${temp}/module1.jar"/>
|
||||
<pathelement path="${temp}/module2.jar"/>
|
||||
<pathelement location="${kotlin.runtime.jar}"/>
|
||||
</classpath>
|
||||
</java>
|
||||
</target>
|
||||
</project>
|
||||
@@ -0,0 +1,11 @@
|
||||
package hello
|
||||
|
||||
open class A {
|
||||
|
||||
internal val z: String = "A_O"
|
||||
|
||||
internal fun test() = "A_K"
|
||||
|
||||
}
|
||||
|
||||
public fun invokeOnA(a: A) = a.z + a.test()
|
||||
@@ -0,0 +1,29 @@
|
||||
package hello
|
||||
|
||||
open class B : A() {
|
||||
|
||||
internal val z: String = "B_O"
|
||||
|
||||
internal fun test() = "B_K"
|
||||
|
||||
}
|
||||
|
||||
class C : A() {
|
||||
|
||||
public val z: String = "C_O"
|
||||
|
||||
public fun test() = "C_K"
|
||||
|
||||
}
|
||||
|
||||
|
||||
public fun invokeOnB(b: B) = b.z + b.test()
|
||||
|
||||
public fun invokeOnC(c: C) = c.z + c.test()
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
val b = B()
|
||||
println(invokeOnA(b))
|
||||
println(invokeOnB(b))
|
||||
println(invokeOnC(C()))
|
||||
}
|
||||
Reference in New Issue
Block a user