Initial internal member mangling

This commit is contained in:
Michael Bogdanov
2015-10-05 11:54:06 +03:00
parent 306ac73eb7
commit 882f6113dc
28 changed files with 364 additions and 30 deletions
@@ -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,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"
}
+24
View File
@@ -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()))
}