Align generic signature for inner classes to work as in Java
#KT-10397 Fixed According to JVMS (p. 4.3.4) inner classes should be separated with `$` in generic signature. Note that in Java, inner types separated with `.` after first parameterized type, and now we preserve the same behaviour. See tests for clarification.
This commit is contained in:
+23
@@ -0,0 +1,23 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer {
|
||||
|
||||
inner class FirstInner {
|
||||
inner class SecondInner<A> {
|
||||
inner class ThirdInnner {
|
||||
inner class FourthInner<B>
|
||||
|
||||
fun <C> foo(): FourthInner<C> = TODO()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"Outer\$FirstInner.Outer\$FirstInner\$SecondInner<A>.ThirdInnner.FourthInner<C>",
|
||||
Outer.FirstInner.SecondInner.ThirdInnner::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer {
|
||||
|
||||
inner class FirstInner {
|
||||
inner class SecondInner<A> {
|
||||
inner class ThirdInnner {
|
||||
inner class FourthInner
|
||||
|
||||
fun foo(): FourthInner = TODO()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"Outer\$FirstInner.Outer\$FirstInner\$SecondInner<A>.ThirdInnner.FourthInner",
|
||||
Outer.FirstInner.SecondInner.ThirdInnner::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+23
@@ -0,0 +1,23 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer {
|
||||
|
||||
inner class FirstInner {
|
||||
inner class SecondInner {
|
||||
inner class ThirdInnner {
|
||||
inner class FourthInner<A>
|
||||
|
||||
fun <B> foo(): FourthInner<B> = TODO()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"Outer\$FirstInner\$SecondInner\$ThirdInnner.Outer\$FirstInner\$SecondInner\$ThirdInnner\$FourthInner<B>",
|
||||
Outer.FirstInner.SecondInner.ThirdInnner::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer<S> {
|
||||
inner class Inner<R>
|
||||
fun <R> foo(): Inner<R>? = null
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"Outer<S>.Inner<R>",
|
||||
Outer::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer {
|
||||
inner class Inner<R>
|
||||
fun <R> foo(): Inner<R>? = null
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"Outer.Outer\$Inner<R>",
|
||||
Outer::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
// WITH_REFLECT
|
||||
// IGNORE_BACKEND: JS, NATIVE
|
||||
|
||||
abstract class Outer {
|
||||
inner class Inner
|
||||
fun foo(): Inner? = null
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
kotlin.test.assertEquals(
|
||||
"class Outer\$Inner",
|
||||
Outer::class.java.declaredMethods.single().genericReturnType.toString())
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user