[NI] Add missing substitution of known type parameters
Known type parameters appear after inheriting from class with type parameters. Their substitution matters for inner class constructor, because without substitution it's parameters will be type checked against incorrect (original) parameter descriptor with unsubstituted type parameters. Skip creation of composite substitutor, if old substitutor is empty. New substitutors return null in case they don't substitute a type, but old type substitutors have explicit isEmpty method. Composite substitutor with empty old substitutor leads to creation of incorrect descriptor copies.
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
|
||||
open class A<T1, T2> {
|
||||
open inner class A1(val a1: T1)
|
||||
open inner class A2(val a2: T2)
|
||||
|
||||
open fun f1(arg: T1) = arg
|
||||
open fun f2(arg: T2) = arg
|
||||
}
|
||||
|
||||
open class B<T> : A<T, Int>() {
|
||||
open inner class B1(b1: T) : A1(b1)
|
||||
open inner class B2(b2: Int) : A2(b2)
|
||||
|
||||
fun variableToKnownParameter(p: T): Int =
|
||||
p as? Int ?: 0
|
||||
|
||||
inner class B3(b3: T) : A2(variableToKnownParameter(b3))
|
||||
|
||||
override fun f1(arg: T) = arg
|
||||
override fun f2(arg: Int) = arg
|
||||
}
|
||||
|
||||
class C : B<String>() {
|
||||
inner class C1(c1: String): B1(c1)
|
||||
inner class C2 : B2(15)
|
||||
|
||||
override fun f1(arg: String) = arg
|
||||
override fun f2(arg: Int) = arg
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package
|
||||
|
||||
public open class A</*0*/ T1, /*1*/ T2> {
|
||||
public constructor A</*0*/ T1, /*1*/ T2>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open fun f1(/*0*/ arg: T1): T1
|
||||
public open fun f2(/*0*/ arg: T2): T2
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public open inner class A1 /*captured type parameters: /*0*/ T1, /*1*/ T2*/ {
|
||||
public constructor A1(/*0*/ a1: T1)
|
||||
public final val a1: T1
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open inner class A2 /*captured type parameters: /*0*/ T1, /*1*/ T2*/ {
|
||||
public constructor A2(/*0*/ a2: T2)
|
||||
public final val a2: T2
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
public open class B</*0*/ T> : A<T, kotlin.Int> {
|
||||
public constructor B</*0*/ T>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun f1(/*0*/ arg: T): T
|
||||
public open override /*1*/ fun f2(/*0*/ arg: kotlin.Int): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
public final fun variableToKnownParameter(/*0*/ p: T): kotlin.Int
|
||||
|
||||
public open inner class B1 /*captured type parameters: /*0*/ T*/ : A<T, kotlin.Int>.A1 {
|
||||
public constructor B1(/*0*/ b1: T)
|
||||
public final override /*1*/ /*fake_override*/ val a1: T
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public open inner class B2 /*captured type parameters: /*0*/ T*/ : A<T, kotlin.Int>.A2 {
|
||||
public constructor B2(/*0*/ b2: kotlin.Int)
|
||||
public final override /*1*/ /*fake_override*/ val a2: kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final inner class B3 /*captured type parameters: /*0*/ T*/ : A<T, kotlin.Int>.A2 {
|
||||
public constructor B3(/*0*/ b3: T)
|
||||
public final override /*1*/ /*fake_override*/ val a2: kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
public final class C : B<kotlin.String> {
|
||||
public constructor C()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ fun f1(/*0*/ arg: kotlin.String): kotlin.String
|
||||
public open override /*1*/ fun f2(/*0*/ arg: kotlin.Int): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
public final override /*1*/ /*fake_override*/ fun variableToKnownParameter(/*0*/ p: kotlin.String): kotlin.Int
|
||||
|
||||
public final inner class C1 : B<kotlin.String>.B1 {
|
||||
public constructor C1(/*0*/ c1: kotlin.String)
|
||||
public final override /*1*/ /*fake_override*/ val a1: kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final inner class C2 : B<kotlin.String>.B2 {
|
||||
public constructor C2()
|
||||
public final override /*1*/ /*fake_override*/ val a2: kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
|
||||
abstract class TestType<V: Any> {
|
||||
open inner class Inner(val item: V)
|
||||
}
|
||||
|
||||
class Derived: TestType<Long>() {
|
||||
inner class DerivedInner(item: Long): Inner(item)
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package
|
||||
|
||||
public final class Derived : TestType<kotlin.Long> {
|
||||
public constructor Derived()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public final inner class DerivedInner : TestType<kotlin.Long>.Inner {
|
||||
public constructor DerivedInner(/*0*/ item: kotlin.Long)
|
||||
public final override /*1*/ /*fake_override*/ val item: kotlin.Long
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class TestType</*0*/ V : kotlin.Any> {
|
||||
public constructor TestType</*0*/ V : kotlin.Any>()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
|
||||
public open inner class Inner /*captured type parameters: /*0*/ V : kotlin.Any*/ {
|
||||
public constructor Inner(/*0*/ item: V)
|
||||
public final val item: V
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user