[NI] Support @OnlyInputTypes annotation. #KT-29307 fixed

This commit is contained in:
Dmitriy Novozhilov
2019-03-21 17:36:17 +03:00
parent 0f7e91ff6d
commit e574106799
25 changed files with 474 additions and 32 deletions
@@ -0,0 +1,22 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// !WITH_NEW_INFERENCE
open class Base()
class CX : Base()
class CY : Base()
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
fun <@kotlin.internal.OnlyInputTypes T> foo(a: T, b: T) {}
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
fun <@kotlin.internal.OnlyInputTypes T : Any> fooA(a: T, b: T) {}
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
fun <@kotlin.internal.OnlyInputTypes T : Base> fooB(a: T, b: T) {}
fun usage(x: CX, y: CY) {
<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>foo<!>(x, y) // expected err, got err
<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>fooA<!>(x, y) // expected err, got ok
<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>fooB<!>(x, y) // expected err, got ok
}
@@ -0,0 +1,27 @@
package
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T> foo(/*0*/ a: T, /*1*/ b: T): kotlin.Unit
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T : kotlin.Any> fooA(/*0*/ a: T, /*1*/ b: T): kotlin.Unit
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T : Base> fooB(/*0*/ a: T, /*1*/ b: T): kotlin.Unit
public fun usage(/*0*/ x: CX, /*1*/ y: CY): kotlin.Unit
public open class Base {
public constructor Base()
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 CX : Base {
public constructor CX()
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 CY : Base {
public constructor CY()
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,31 @@
// !DIAGNOSTICS: -UNUSED_VARIABLE
// !WITH_NEW_INFERENCE
// ISSUE: KT-29307
fun test_1(map: Map<String, String>) {
val x = <!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>map[<!OI;CONSTANT_EXPECTED_TYPE_MISMATCH!>42<!>]<!> // OK
}
open class A
class B : A()
fun test_2(map: Map<A, String>) {
val x = <!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>map[<!OI;CONSTANT_EXPECTED_TYPE_MISMATCH!>42<!>]<!>
}
fun test_3(m: Map<*, String>) {
val x = <!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>m[42]<!> // should be ok
}
fun test_4(m: Map<out Number, String>) {
val x = m.<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>get<!>(42) // should be ok
}
fun test_5(map: Map<B, Int>, a: A) {
map.get(a)
}
fun test_6(map: Map<A, Int>, b: B) {
map.get(b)
}
@@ -0,0 +1,22 @@
package
public fun test_1(/*0*/ map: kotlin.collections.Map<kotlin.String, kotlin.String>): kotlin.Unit
public fun test_2(/*0*/ map: kotlin.collections.Map<A, kotlin.String>): kotlin.Unit
public fun test_3(/*0*/ m: kotlin.collections.Map<*, kotlin.String>): kotlin.Unit
public fun test_4(/*0*/ m: kotlin.collections.Map<out kotlin.Number, kotlin.String>): kotlin.Unit
public fun test_5(/*0*/ map: kotlin.collections.Map<B, kotlin.Int>, /*1*/ a: A): kotlin.Unit
public fun test_6(/*0*/ map: kotlin.collections.Map<A, kotlin.Int>, /*1*/ b: B): kotlin.Unit
public open class A {
public constructor A()
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 B : A {
public constructor B()
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,47 @@
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
// !WITH_NEW_INFERENCE
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
public fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.contains1(element: T): Boolean = null!!
class In<in T>
class Out<out T>
class Inv<T>
fun test_1(list: List<In<Number>>, x: In<Number>, y: In<Int>, z: In<Any>) {
list.contains1(x)
list.contains1(y)
list.contains1(z)
}
fun test_2(list: List<In<Int>>, x: In<Int>, y: In<Number>, z: In<Any>) {
list.contains1(x)
list.contains1(y)
list.contains1(z)
}
fun test_3(list: List<Out<Number>>, x: Out<Number>, y: Out<Int>, z: Out<Any>) {
list.contains1(x)
list.contains1(y)
list.contains1(z)
}
fun test_4(list: List<Out<Int>>, x: Out<Int>, y: Out<Number>, z: Out<Any>) {
list.contains1(x)
list.contains1(y)
list.contains1(z)
}
fun test_5(list: List<Inv<Number>>, x: Inv<Number>, y: Inv<Int>, z: Inv<Any>) {
list.contains1(x)
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(y)
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(z)
}
fun test_6(list: List<Inv<Int>>, x: Inv<Int>, y: Inv<Number>, z: Inv<Any>) {
list.contains1(x)
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(y)
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(z)
}
@@ -0,0 +1,30 @@
package
public fun test_1(/*0*/ list: kotlin.collections.List<In<kotlin.Number>>, /*1*/ x: In<kotlin.Number>, /*2*/ y: In<kotlin.Int>, /*3*/ z: In<kotlin.Any>): kotlin.Unit
public fun test_2(/*0*/ list: kotlin.collections.List<In<kotlin.Int>>, /*1*/ x: In<kotlin.Int>, /*2*/ y: In<kotlin.Number>, /*3*/ z: In<kotlin.Any>): kotlin.Unit
public fun test_3(/*0*/ list: kotlin.collections.List<Out<kotlin.Number>>, /*1*/ x: Out<kotlin.Number>, /*2*/ y: Out<kotlin.Int>, /*3*/ z: Out<kotlin.Any>): kotlin.Unit
public fun test_4(/*0*/ list: kotlin.collections.List<Out<kotlin.Int>>, /*1*/ x: Out<kotlin.Int>, /*2*/ y: Out<kotlin.Number>, /*3*/ z: Out<kotlin.Any>): kotlin.Unit
public fun test_5(/*0*/ list: kotlin.collections.List<Inv<kotlin.Number>>, /*1*/ x: Inv<kotlin.Number>, /*2*/ y: Inv<kotlin.Int>, /*3*/ z: Inv<kotlin.Any>): kotlin.Unit
public fun test_6(/*0*/ list: kotlin.collections.List<Inv<kotlin.Int>>, /*1*/ x: Inv<kotlin.Int>, /*2*/ y: Inv<kotlin.Number>, /*3*/ z: Inv<kotlin.Any>): kotlin.Unit
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T> kotlin.collections.Iterable<T>.contains1(/*0*/ element: T): kotlin.Boolean
public final class In</*0*/ in T> {
public constructor In</*0*/ in 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 final class Inv</*0*/ T> {
public constructor Inv</*0*/ 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 final class Out</*0*/ out T> {
public constructor Out</*0*/ out 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
}
@@ -18,9 +18,9 @@ public fun <K, V> Map<K, V>.get1(key: Any?): Int = null!!
public fun <@kotlin.internal.OnlyInputTypes K, V> Map<out K, V>.get1(key: K): V? = null!!
fun test(map: Map<Int, String>) {
val a: Int = <!NI;TYPE_MISMATCH!>listOf(1).<!NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!>contains1("")<!><!>
val a: Int = <!NI;TYPE_MISMATCH!>listOf(1).<!NI;TYPE_MISMATCH, OI;TYPE_INFERENCE_EXPECTED_TYPE_MISMATCH!><!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>("")<!><!>
val b: Boolean = listOf(1).contains1(1)
val c: String? = map.<!OI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>get1<!>("")
val c: String? = map.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>get1<!>("")
val d: String? = map.get1(1)
}
@@ -0,0 +1,113 @@
// !WITH_NEW_INFERENCE
// !DIAGNOSTICS: -UNUSED_VARIABLE -UNUSED_PARAMETER
// Issue: KT-26698
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
public fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.contains1(element: T): Boolean = null!!
@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
public fun <@kotlin.internal.OnlyInputTypes T> Iterable<T>.foo(element: T): T = null!!
class Inv<T>
class Inv2<T, R>
class In<in T>
class Out<out T>
// -------------------------------------------------------
fun test_0(x: Inv2<in Number, out Number>, list: List<Inv2<Any, Int>>) {
list.<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>foo<!>(x)
}
// ------------------------- Inv -------------------------
fun test_1(x: Inv<Number>, list: List<Inv<Number>>) {
list.contains1(x)
}
fun test_2(x: Inv<Number>, list: List<Inv<Int>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_3(x: Inv<Number>, list: List<Inv<Any>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_4(x: Inv<in Number>, list: List<Inv<Any>>) {
list.<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_5(x: Inv<in Number>, list: List<Inv<Number>>) {
list.<!NI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_6(x: Inv<in Number>, list: List<Inv<Int>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_7(x: Inv<out Number>, list: List<Inv<Any>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_8(x: Inv<out Number>, list: List<Inv<Number>>) {
list.contains1(x)
}
fun test_9(x: Inv<out Number>, list: List<Inv<Int>>) {
list.contains1(x)
}
// ------------------------- In -------------------------
fun test_11(x: In<Number>, list: List<In<Number>>) {
list.contains1(x)
}
fun test_12(x: In<Number>, list: List<In<Int>>) {
list.contains1(x)
}
fun test_13(x: In<Number>, list: List<In<Any>>) {
list.contains1(x)
}
// ------------------------- Out -------------------------
fun test_21(x: Out<Number>, list: List<Out<Number>>) {
list.contains1(x)
}
fun test_22(x: Out<Number>, list: List<Out<Int>>) {
list.contains1(x)
}
fun test_23(x: Out<Number>, list: List<Out<Any>>) {
list.contains1(x)
}
// --------------------------------------------------------
fun test_31(x: Inv<Number>, list: List<Inv<in Number>>) {
list.contains1(x)
}
fun test_32(x: Inv<Number>, list: List<Inv<in Int>>) {
list.contains1(x)
}
fun test_33(x: Inv<Number>, list: List<Inv<in Any>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_34(x: Inv<Number>, list: List<Inv<out Number>>) {
list.contains1(x)
}
fun test_35(x: Inv<Number>, list: List<Inv<out Int>>) {
list.<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>contains1<!>(x)
}
fun test_36(x: Inv<Number>, list: List<Inv<out Any>>) {
list.contains1(x)
}
@@ -0,0 +1,54 @@
package
public fun test_0(/*0*/ x: Inv2<in kotlin.Number, out kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv2<kotlin.Any, kotlin.Int>>): kotlin.Unit
public fun test_1(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Number>>): kotlin.Unit
public fun test_11(/*0*/ x: In<kotlin.Number>, /*1*/ list: kotlin.collections.List<In<kotlin.Number>>): kotlin.Unit
public fun test_12(/*0*/ x: In<kotlin.Number>, /*1*/ list: kotlin.collections.List<In<kotlin.Int>>): kotlin.Unit
public fun test_13(/*0*/ x: In<kotlin.Number>, /*1*/ list: kotlin.collections.List<In<kotlin.Any>>): kotlin.Unit
public fun test_2(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Int>>): kotlin.Unit
public fun test_21(/*0*/ x: Out<kotlin.Number>, /*1*/ list: kotlin.collections.List<Out<kotlin.Number>>): kotlin.Unit
public fun test_22(/*0*/ x: Out<kotlin.Number>, /*1*/ list: kotlin.collections.List<Out<kotlin.Int>>): kotlin.Unit
public fun test_23(/*0*/ x: Out<kotlin.Number>, /*1*/ list: kotlin.collections.List<Out<kotlin.Any>>): kotlin.Unit
public fun test_3(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Any>>): kotlin.Unit
public fun test_31(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<in kotlin.Number>>): kotlin.Unit
public fun test_32(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<in kotlin.Int>>): kotlin.Unit
public fun test_33(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<in kotlin.Any>>): kotlin.Unit
public fun test_34(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<out kotlin.Number>>): kotlin.Unit
public fun test_35(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<out kotlin.Int>>): kotlin.Unit
public fun test_36(/*0*/ x: Inv<kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<out kotlin.Any>>): kotlin.Unit
public fun test_4(/*0*/ x: Inv<in kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Any>>): kotlin.Unit
public fun test_5(/*0*/ x: Inv<in kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Number>>): kotlin.Unit
public fun test_6(/*0*/ x: Inv<in kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Int>>): kotlin.Unit
public fun test_7(/*0*/ x: Inv<out kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Any>>): kotlin.Unit
public fun test_8(/*0*/ x: Inv<out kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Number>>): kotlin.Unit
public fun test_9(/*0*/ x: Inv<out kotlin.Number>, /*1*/ list: kotlin.collections.List<Inv<kotlin.Int>>): kotlin.Unit
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T> kotlin.collections.Iterable<T>.contains1(/*0*/ element: T): kotlin.Boolean
@kotlin.Suppress(names = {"INVISIBLE_MEMBER", "INVISIBLE_REFERENCE"}) public fun </*0*/ @kotlin.internal.OnlyInputTypes T> kotlin.collections.Iterable<T>.foo(/*0*/ element: T): T
public final class In</*0*/ in T> {
public constructor In</*0*/ in 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 final class Inv</*0*/ T> {
public constructor Inv</*0*/ 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 final class Inv2</*0*/ T, /*1*/ R> {
public constructor Inv2</*0*/ T, /*1*/ R>()
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 Out</*0*/ out T> {
public constructor Out</*0*/ out 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
}
@@ -11,7 +11,7 @@ class D
fun test1(a: A, b: B, c: C) {
assertEquals1(a, b)
<!OI;TYPE_INFERENCE_ONLY_INPUT_TYPES!>assertEquals1<!>(b, c)
<!TYPE_INFERENCE_ONLY_INPUT_TYPES!>assertEquals1<!>(b, c)
assertEquals1(3, 3)
assertEquals1(1 or 2, 2 or 1)