[FIR] Implement TYPE_VARIANCE_CONFLICT, TYPE_VARIANCE_CONFLICT_IN_EXPANDED_TYPE diagnostics, fix tests

This commit is contained in:
Ivan Kochurkin
2021-05-21 17:53:01 +03:00
committed by TeamCityServer
parent ef53f0e0b3
commit cf531dbbe6
36 changed files with 392 additions and 300 deletions
@@ -1,23 +0,0 @@
interface In<in T>
interface Out<out T>
interface Inv<T>
interface TypeBounds1<in I, out O, P, X : I>
interface TypeBounds2<in I, out O, P, X : O>
interface TypeBounds3<in I, out O, P, X : P>
interface TypeBounds4<in I, out O, P, X : In<I>>
interface TypeBounds5<in I, out O, P, X : In<O>>
interface WhereTypeBounds1<in I, out O, P, X> where X : I
interface WhereTypeBounds2<in I, out O, P, X> where X : O
interface WhereTypeBounds3<in I, out O, P, X> where X : P
interface WhereTypeBounds4<in I, out O, P, X> where X : In<I>
interface WhereTypeBounds5<in I, out O, P, X> where X : In<O>
class SubClass1<in I, out O, P> : Out<I>
class SubClass2<in I, out O, P> : Out<O>
class SubClass3<in I, out O, P> : Out<P>
class SubClass4<in I, out O, P> : In<I>
class SubClass5<in I, out O, P> : In<O>
class SubClass6<in I, out O, P> : Inv<O>
class SubClass7<in I, out O, P> : Inv<I>
+1
View File
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface In<in T>
interface Out<out T>
interface Inv<T>
@@ -1,34 +0,0 @@
interface In<in T>
interface Out<out T>
interface Inv<T>
fun <T> getT(): T = null!!
interface Test<in I, out O, P> {
fun parameters1(i: I, o: O, p: P)
fun parameters2(i: In<I>)
fun parameters3(i: In<O>)
fun explicitReturnType1() : I
fun explicitReturnType2() : O
fun explicitReturnType3() : P
fun explicitReturnType4() : In<I>
fun explicitReturnType5() : In<O>
fun imlicitReturnType1() = getT<I>()
fun imlicitReturnType2() = getT<O>()
fun imlicitReturnType3() = getT<P>()
fun imlicitReturnType4() = getT<In<I>>()
fun imlicitReturnType5() = getT<In<O>>()
fun I.receiver1()
fun O.receiver2()
fun P.receiver3()
fun In<I>.receiver4()
fun In<O>.receiver5()
fun <X : I> typeParameter1()
fun <X : O> typeParameter2()
fun <X : P> typeParameter3()
fun <X : In<I>> typeParameter4()
fun <X : In<O>> typeParameter5()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface In<in T>
interface Out<out T>
interface Inv<T>
@@ -1,12 +0,0 @@
interface In<in T>
fun <T> getT(): T = null!!
interface Test<in I, out O, P> {
fun ok1(i: (O) -> I) : (I) -> O
fun ok2(i: (P) -> P) : (P) -> P
fun ok3(i: (In<I>) -> In<O>) = getT<(In<O>) -> In<I>>()
fun neOk1(i: (I) -> O): (O) -> I
fun neOk2(i: (In<O>) -> In<I>)
fun neOk3() = getT<(In<I>) -> In<O>>()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface In<in T>
fun <T> getT(): T = null!!
@@ -27,22 +27,22 @@ interface Test<in I, out O, P> {
fun Ok22(i: Inv<out I>)
fun Ok23(i: Inv<out P>)
fun neOk1(i: O)
fun neOk2(i: In<I>)
fun neOk3(i: In<In<O>>)
fun neOk4(i: Inv<I>)
fun neOk5(i: Inv<O>)
fun neOk6(i: In<In<O>>)
fun neOk7(i: Pair<In<I>, O>)
fun neOk8(i: Inv<out O>)
fun neOk1(i: <!TYPE_VARIANCE_CONFLICT("O; out; in; O")!>O<!>)
fun neOk2(i: In<<!TYPE_VARIANCE_CONFLICT("I; in; out; In<I>")!>I<!>>)
fun neOk3(i: In<In<<!TYPE_VARIANCE_CONFLICT("O; out; in; In<In<O>>")!>O<!>>>)
fun neOk4(i: Inv<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Inv<I>")!>I<!>>)
fun neOk5(i: Inv<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; Inv<O>")!>O<!>>)
fun neOk6(i: In<In<<!TYPE_VARIANCE_CONFLICT("O; out; in; In<In<O>>")!>O<!>>>)
fun neOk7(i: Pair<In<<!TYPE_VARIANCE_CONFLICT("I; in; out; Pair<In<I>, O>")!>I<!>>, <!TYPE_VARIANCE_CONFLICT("O; out; in; Pair<In<I>, O>")!>O<!>>)
fun neOk8(i: Inv<out <!TYPE_VARIANCE_CONFLICT("O; out; in; Inv<out O>")!>O<!>>)
fun neOk9(i: <!CONFLICTING_PROJECTION!>In<out P><!>)
fun neOk10(i: Out<O>)
fun neOk10(i: Out<<!TYPE_VARIANCE_CONFLICT("O; out; in; Out<O>")!>O<!>>)
fun neOk11(i: Inv<in I>)
fun neOk12(i: Inv<out O>)
fun neOk11(i: Inv<in <!TYPE_VARIANCE_CONFLICT("I; in; out; Inv<in I>")!>I<!>>)
fun neOk12(i: Inv<out <!TYPE_VARIANCE_CONFLICT("O; out; in; Inv<out O>")!>O<!>>)
fun neOk30(i: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Pair<O, ><!>)
fun neOk31(i: Pair<O, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>)
fun neOk31(i: Pair<<!TYPE_VARIANCE_CONFLICT("O; out; in; Pair<O, ERROR CLASS: Wrong number of type arguments>")!>O<!>, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>)
fun neOk32(i: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>)
fun neOk33(i: Inv<<!SYNTAX!><!>>)
fun neOk34(i: Inv<<!UNRESOLVED_REFERENCE!>C<!>>)
@@ -14,32 +14,32 @@ interface Test<in I, out O, P> {
var ok6: Inv<in P>
var ok7: Inv<out P>
var neOk1: O
var neOk2: In<I>
var neOk3: In<In<O>>
var neOk4: Inv<I>
var neOk5: Inv<O>
var neOk6: In<In<O>>
var neOk7: Pair<In<I>, O>
var neOk8: Inv<in O>
var neOk9: Inv<in I>
var neOk1: <!TYPE_VARIANCE_CONFLICT("O; out; invariant; O")!>O<!>
var neOk2: In<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; In<I>")!>I<!>>
var neOk3: In<In<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; In<In<O>>")!>O<!>>>
var neOk4: Inv<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Inv<I>")!>I<!>>
var neOk5: Inv<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; Inv<O>")!>O<!>>
var neOk6: In<In<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; In<In<O>>")!>O<!>>>
var neOk7: Pair<In<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Pair<In<I>, O>")!>I<!>>, <!TYPE_VARIANCE_CONFLICT("O; out; invariant; Pair<In<I>, O>")!>O<!>>
var neOk8: Inv<in <!TYPE_VARIANCE_CONFLICT("O; out; invariant; Inv<in O>")!>O<!>>
var neOk9: Inv<in <!TYPE_VARIANCE_CONFLICT("I; in; invariant; Inv<in I>")!>I<!>>
var neOk10: <!CONFLICTING_PROJECTION!>In<out I><!>
var neOk11: I
var neOk12: In<O>
var neOk13: In<In<I>>
var neOk14: Out<I>
var neOk15: Out<Out<I>>
var neOk16: Out<In<O>>
var neOk17: Pair<In<O>, I>
var neOk11: <!TYPE_VARIANCE_CONFLICT("I; in; invariant; I")!>I<!>
var neOk12: In<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; In<O>")!>O<!>>
var neOk13: In<In<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; In<In<I>>")!>I<!>>>
var neOk14: Out<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Out<I>")!>I<!>>
var neOk15: Out<Out<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Out<Out<I>>")!>I<!>>>
var neOk16: Out<In<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; Out<In<O>>")!>O<!>>>
var neOk17: Pair<In<<!TYPE_VARIANCE_CONFLICT("O; out; invariant; Pair<In<O>, I>")!>O<!>>, <!TYPE_VARIANCE_CONFLICT("I; in; invariant; Pair<In<O>, I>")!>I<!>>
var neOk20: Inv<in O>
var neOk21: Inv<in I>
var neOk22: Inv<out O>
var neOk23: Inv<out I>
var neOk20: Inv<in <!TYPE_VARIANCE_CONFLICT("O; out; invariant; Inv<in O>")!>O<!>>
var neOk21: Inv<in <!TYPE_VARIANCE_CONFLICT("I; in; invariant; Inv<in I>")!>I<!>>
var neOk22: Inv<out <!TYPE_VARIANCE_CONFLICT("O; out; invariant; Inv<out O>")!>O<!>>
var neOk23: Inv<out <!TYPE_VARIANCE_CONFLICT("I; in; invariant; Inv<out I>")!>I<!>>
var neOk30: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Pair<I, ><!>
var neOk31: Pair<I, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>
var neOk31: Pair<<!TYPE_VARIANCE_CONFLICT("I; in; invariant; Pair<I, ERROR CLASS: Wrong number of type arguments>")!>I<!>, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>
var neOk32: <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>
var neOk33: Inv<<!SYNTAX!><!>>
var neOk34: Inv<<!UNRESOLVED_REFERENCE!>C<!>>
@@ -1,16 +0,0 @@
interface In<in I>
interface Out<out O>
interface Inv<P>
fun <T> getT(): T = null!!
interface Test<in I : Any, out O : Any, P : Any> {
fun ok1(i: I?) : O?
fun ok2(i: In<O?>?) : Out<O?>?
fun ok3(i: Inv<in O?>) = getT<Inv<in I?>>()
fun neOk1(i: O?) : I?
fun neOk(i: Out<O?>?) : In<O?>?
fun neOk3(i: Inv<in I?>)
fun neOk4() = getT<Inv<in O?>?>()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface In<in I>
interface Out<out O>
interface Inv<P>
@@ -15,26 +15,26 @@ interface Test<in I, out O, P> {
fun ok7(): Out<P>
fun ok8(): Out<In<P>>
fun ok9(): Pair<In<I>, O>
fun ok10(): Inv<in I>
fun ok11(): Inv<out O>
fun ok12(): Inv<in P>
fun ok13(): Inv<out P>
fun neOk1(): I
fun neOk2(): In<O>
fun neOk3(): In<In<I>>
fun neOk4(): Inv<I>
fun neOk5(): Inv<O>
fun neOk6(): Pair<In<O>, I>
fun neOk7(): Inv<in O>
fun neOk1(): <!TYPE_VARIANCE_CONFLICT!>I<!>
fun neOk2(): In<<!TYPE_VARIANCE_CONFLICT!>O<!>>
fun neOk3(): In<In<<!TYPE_VARIANCE_CONFLICT!>I<!>>>
fun neOk4(): Inv<<!TYPE_VARIANCE_CONFLICT!>I<!>>
fun neOk5(): Inv<<!TYPE_VARIANCE_CONFLICT!>O<!>>
fun neOk6(): Pair<In<<!TYPE_VARIANCE_CONFLICT!>O<!>>, <!TYPE_VARIANCE_CONFLICT!>I<!>>
fun neOk7(): Inv<in <!TYPE_VARIANCE_CONFLICT!>O<!>>
fun neOk8(): <!CONFLICTING_PROJECTION!>Out<in I><!>
fun neOk10(): Inv<in O>
fun neOk11(): Inv<out I>
fun neOk10(): Inv<in <!TYPE_VARIANCE_CONFLICT!>O<!>>
fun neOk11(): Inv<out <!TYPE_VARIANCE_CONFLICT!>I<!>>
fun neOk30(): <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Pair<I, ><!>
fun neOk31(): Pair<I, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>
fun neOk31(): Pair<<!TYPE_VARIANCE_CONFLICT!>I<!>, <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>>
fun neOk32(): <!WRONG_NUMBER_OF_TYPE_ARGUMENTS!>Inv<!>
fun neOk33(): Inv<<!SYNTAX!><!>>
fun neOk34(): Inv<<!UNRESOLVED_REFERENCE!>C<!>>
@@ -15,7 +15,7 @@ interface Test<in I, out O, P> {
fun ok7(): Out<P>
fun ok8(): Out<In<P>>
fun ok9(): Pair<In<I>, O>
fun ok10(): Inv<in I>
fun ok11(): Inv<out O>
fun ok12(): Inv<in P>
@@ -29,7 +29,7 @@ interface Test<in I, out O, P> {
fun neOk6(): Pair<In<<!TYPE_VARIANCE_CONFLICT("O; out; in; Pair<In<O>, I>")!>O<!>>, <!TYPE_VARIANCE_CONFLICT("I; in; out; Pair<In<O>, I>")!>I<!>>
fun neOk7(): Inv<in <!TYPE_VARIANCE_CONFLICT("O; out; in; Inv<in O>")!>O<!>>
fun neOk8(): Out<<!CONFLICTING_PROJECTION("Out")!>in<!> I>
fun neOk10(): Inv<in <!TYPE_VARIANCE_CONFLICT("O; out; in; Inv<in O>")!>O<!>>
fun neOk11(): Inv<out <!TYPE_VARIANCE_CONFLICT("I; in; out; Inv<out I>")!>I<!>>
@@ -1,25 +0,0 @@
interface In<in T>
interface Out<out T>
interface Inv<T>
fun <T> getT(): T = null!!
class Test<in I, out O, P>(
val type1: I,
val type2: O,
val type3: P,
val type4: In<I>,
val type5: In<O>,
var type6: I,
var type7: O,
var type8: P,
var type9: In<I>,
var type0: In<O>,
type11: I,
type12: O,
type13: P,
type14: In<I>,
type15: In<O>
)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
interface In<in T>
interface Out<out T>
interface Inv<T>
@@ -1,50 +0,0 @@
import kotlin.reflect.KProperty
interface In<in T>
interface Out<out T>
interface Inv<T>
class Delegate<T> {
operator fun getValue(t: Any, p: KProperty<*>): T = null!!
operator fun setValue(t: Any, p: KProperty<*>, value: T) {}
}
fun <T> getT(): T = null!!
abstract class Test<in I, out O, P> {
abstract val type1: I
abstract val type2: O
abstract val type3: P
abstract val type4: In<I>
abstract val type5: In<O>
val implicitType1 = getT<I>()
val implicitType2 = getT<O>()
val implicitType3 = getT<P>()
val implicitType4 = getT<In<I>>()
val implicitType5 = getT<In<O>>()
val delegateType1 by Delegate<I>()
val delegateType2 by Delegate<O>()
val delegateType3 by Delegate<P>()
val delegateType4 by Delegate<In<I>>()
val delegateType5 by Delegate<In<O>>()
abstract val I.receiver1: Int
abstract val O.receiver2: Int
abstract val P.receiver3: Int
abstract val In<I>.receiver4: Int
abstract val In<O>.receiver5: Int
val <X : I> X.typeParameter1: Int get() = 0
val <X : O> X.typeParameter2: Int get() = 0
val <X : P> X.typeParameter3: Int get() = 0
val <X : In<I>> X.typeParameter4: Int get() = 0
val <X : In<O>> X.typeParameter5: Int get() = 0
val <X> X.typeParameter6: Int where X : I get() = 0
val <X> X.typeParameter7: Int where X : O get() = 0
val <X> X.typeParameter8: Int where X : P get() = 0
val <X> X.typeParameter9: Int where X : In<I> get() = 0
val <X> X.typeParameter0: Int where X : In<O> get() = 0
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
import kotlin.reflect.KProperty
interface In<in T>
@@ -1,50 +0,0 @@
import kotlin.reflect.KProperty
interface In<in T>
interface Out<out T>
interface Inv<T>
class Delegate<T> {
operator fun getValue(t: Any, p: KProperty<*>): T = null!!
operator fun setValue(t: Any, p: KProperty<*>, varue: T) {}
}
fun <T> getT(): T = null!!
abstract class Test<in I, out O, P> {
abstract var type1: I
abstract var type2: O
abstract var type3: P
abstract var type4: In<I>
abstract var type5: In<O>
var implicitType1 = getT<I>()
var implicitType2 = getT<O>()
var implicitType3 = getT<P>()
var implicitType4 = getT<In<I>>()
var implicitType5 = getT<In<O>>()
var delegateType1 by Delegate<I>()
var delegateType2 by Delegate<O>()
var delegateType3 by Delegate<P>()
var delegateType4 by Delegate<In<I>>()
var delegateType5 by Delegate<In<O>>()
abstract var I.receiver1: Int
abstract var O.receiver2: Int
abstract var P.receiver3: Int
abstract var In<I>.receiver4: Int
abstract var In<O>.receiver5: Int
var <X : I> X.typeParameter1: Int get() = 0; set(i) {}
var <X : O> X.typeParameter2: Int get() = 0; set(i) {}
var <X : P> X.typeParameter3: Int get() = 0; set(i) {}
var <X : In<I>> X.typeParameter4: Int get() = 0; set(i) {}
var <X : In<O>> X.typeParameter5: Int get() = 0; set(i) {}
var <X> X.typeParameter6: Int where X : I get() = 0; set(i) {}
var <X> X.typeParameter7: Int where X : O get() = 0; set(i) {}
var <X> X.typeParameter8: Int where X : P get() = 0; set(i) {}
var <X> X.typeParameter9: Int where X : In<I> get() = 0; set(i) {}
var <X> X.typeParameter0: Int where X : In<O> get() = 0; set(i) {}
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
import kotlin.reflect.KProperty
interface In<in T>
@@ -1,20 +1,20 @@
interface Test<in I, out O> {
val internal_val: I
public val public_val: I
protected val protected_val: I
val internal_val: <!TYPE_VARIANCE_CONFLICT!>I<!>
public val public_val: <!TYPE_VARIANCE_CONFLICT!>I<!>
protected val protected_val: <!TYPE_VARIANCE_CONFLICT!>I<!>
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> val private_val: I
var interlan_private_set: O
var interlan_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
<!PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY!>private<!> set
public var public_private_set: O
public var public_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
<!PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY!>private<!> set
protected var protected_private_set: O
protected var protected_private_set: <!TYPE_VARIANCE_CONFLICT!>O<!>
<!PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY!>private<!> set
<!PRIVATE_PROPERTY_IN_INTERFACE!>private<!> var private_private_set: O
private set
fun internal_fun(i: O) : I
public fun public_fun(i: O) : I
protected fun protected_fun(i: O) : I
fun internal_fun(i: <!TYPE_VARIANCE_CONFLICT!>O<!>) : <!TYPE_VARIANCE_CONFLICT!>I<!>
public fun public_fun(i: <!TYPE_VARIANCE_CONFLICT!>O<!>) : <!TYPE_VARIANCE_CONFLICT!>I<!>
protected fun protected_fun(i: <!TYPE_VARIANCE_CONFLICT!>O<!>) : <!TYPE_VARIANCE_CONFLICT!>I<!>
<!PRIVATE_FUNCTION_WITH_NO_BODY!>private<!> fun private_fun(i: O) : I
}