[FE 1.0] Introduce builder inference stub types checker which may report more precise and clear errors due to resolution ambiguity

^KT-49828 Fixed
This commit is contained in:
Victor Petukhov
2022-01-10 14:16:42 +03:00
committed by teamcity
parent dcc42d66c3
commit 455b3143e7
25 changed files with 884 additions and 71 deletions
@@ -0,0 +1,221 @@
// WITH_STDLIB
// !DIAGNOSTICS: -OPT_IN_USAGE_ERROR
// For FIR, see: KT-50704
@JvmName("foo1")
fun foo(x: Inv<String>) {}
fun foo(x: Inv<Int>) {}
@JvmName("foo21")
fun Inv<String>.foo2() {}
fun Inv<Int>.foo2() {}
@JvmName("bar1")
fun String.bar() {}
fun Int.bar() {}
class Inv<K>(x: K)
fun foo0(x: String, y: Float, z: String = "") {}
fun foo0(x: String, y: Float, z: Int = 1) {}
fun foo00(x: String, y: Number) {}
fun foo00(x: CharSequence, y: Float) {}
fun foo000(x: String, y: Number, z: String) {}
fun foo000(x: CharSequence, y: Float, z: Int) {}
fun foo0000(x: String, y: Number, z: String) {}
fun foo0000(x: Int, y: Float, z: Int) {}
fun foo0001(x: List<Int>, y: Number, z: String) {}
fun foo0001(x: String, y: Float, z: Int) {}
fun foo0002(x: Int, y: Number, z: String) {}
fun foo0002(x: String, y: Float, z: Int) {}
fun Int.foo0003(y: Number, z: String) {}
fun String.foo0003(y: Float, z: Int) {}
@JvmName("foo111")
fun foo11(x: MutableSet<MutableMap.MutableEntry<String, Int>>) {}
@JvmName("foo112")
fun foo11(x: MutableSet<MutableMap.MutableEntry<Int, String>>) {}
fun foo11(x: MutableSet<MutableMap.MutableEntry<Int, Int>>) {}
fun main() {
val list1 = buildList {
add("one")
val secondParameter = get(1)
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(secondParameter) // ERROR: [OVERLOAD_RESOLUTION_AMBIGUITY] Overload resolution ambiguity. All these functions match.
}
val list2 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>println<!>(get(1)) // ERROR: [OVERLOAD_RESOLUTION_AMBIGUITY] Overload resolution ambiguity. All these functions match.
}
val list3 = buildList {
add("one")
val secondParameter = Inv(get(1))
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(secondParameter)
}
val list4 = buildList {
add("one")
val secondParameter = get(1)
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(Inv(secondParameter))
}
val list5 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo<!>(Inv(get(1)))
}
val list6 = buildList {
add("one")
get(0).<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
val list7 = buildList {
add("one")
with (get(0)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
}
val list71 = buildList {
add("one")
with (get(0)) l1@ {
with (listOf(1)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
}
}
val list711 = buildList {
add("one")
with (get(0)) {
with (listOf(1)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
}
}
val list8 = buildList {
add("one")
Inv(get(0)).<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo2<!>()
}
val list9 = buildList {
add("one")
with (get(0)) {
with (Inv(this)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo2<!>()
}
}
}
val list91 = buildList {
add("one")
with (get(0)) {
with (Inv(this)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
}
}
// Resolution ambiguities below aren't due to stub types
val list10 = buildList {
add("one")
foo0(get(0), 0f)
}
val list11 = buildList {
add("one")
val x = get(0)
foo0(x, 0f)
}
val list12 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo00<!>(get(0), 0f)
}
// Below are multi-arguments resolution ambiguities
val list13 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo000<!>(get(0), 0f, get(0))
}
val list14 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo0000<!>(get(0), 0f, get(0))
}
val list17 = buildList l1@ {
add("one")
with (get(0)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo0003<!>(0f, this@l1.get(0))
}
}
val list18 = buildList {
add("one")
get(0).<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo0003<!>(0f, get(0))
}
val map1 = buildMap {
put(1, "one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo11<!>(entries)
}
// There aren't specific errors below as casting value arguments doesn't make a resolve successful
val list15 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo0001<!>(get(0), 0f, get(0))
}
val list16 = buildList {
add("one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo0002<!>(get(0), 0f, get(0))
}
}
interface Foo<K> {
fun add(x: K)
fun get(): K
}
interface Foo2<K, V> {
fun put(x: K, y: V)
fun get(): MutableSet<MutableMap.MutableEntry<K, V>>
fun entries(): MutableSet<MutableMap.MutableEntry<K, V>>
}
fun <L, K, V> twoBuilderLambdas(@BuilderInference block: Foo<L>.() -> Unit, @BuilderInference block2: Foo2<K, V>.() -> Unit) {}
fun test() {
<!NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER, NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER!>twoBuilderLambdas<!>(
{
add("")
with (get()) {
with (listOf(1)) {
<!OVERLOAD_RESOLUTION_AMBIGUITY!>bar<!>()
}
}
},
{
put(1, "one")
<!OVERLOAD_RESOLUTION_AMBIGUITY!>foo11<!>(entries())
}
)
}
@@ -0,0 +1,221 @@
// WITH_STDLIB
// !DIAGNOSTICS: -OPT_IN_USAGE_ERROR
// For FIR, see: KT-50704
@JvmName("foo1")
fun foo(x: Inv<String>) {}
fun foo(x: Inv<Int>) {}
@JvmName("foo21")
fun Inv<String>.foo2() {}
fun Inv<Int>.foo2() {}
@JvmName("bar1")
fun String.bar() {}
fun Int.bar() {}
class Inv<K>(x: K)
fun foo0(x: String, y: Float, z: String = "") {}
fun foo0(x: String, y: Float, z: Int = 1) {}
fun foo00(x: String, y: Number) {}
fun foo00(x: CharSequence, y: Float) {}
fun foo000(x: String, y: Number, z: String) {}
fun foo000(x: CharSequence, y: Float, z: Int) {}
fun foo0000(x: String, y: Number, z: String) {}
fun foo0000(x: Int, y: Float, z: Int) {}
fun foo0001(x: List<Int>, y: Number, z: String) {}
fun foo0001(x: String, y: Float, z: Int) {}
fun foo0002(x: Int, y: Number, z: String) {}
fun foo0002(x: String, y: Float, z: Int) {}
fun Int.foo0003(y: Number, z: String) {}
fun String.foo0003(y: Float, z: Int) {}
@JvmName("foo111")
fun foo11(x: MutableSet<MutableMap.MutableEntry<String, Int>>) {}
@JvmName("foo112")
fun foo11(x: MutableSet<MutableMap.MutableEntry<Int, String>>) {}
fun foo11(x: MutableSet<MutableMap.MutableEntry<Int, Int>>) {}
fun main() {
val list1 = buildList {
add("one")
val secondParameter = get(1)
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>println<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>secondParameter<!>) // ERROR: [OVERLOAD_RESOLUTION_AMBIGUITY] Overload resolution ambiguity. All these functions match.
}
val list2 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>println<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(1)<!>) // ERROR: [OVERLOAD_RESOLUTION_AMBIGUITY] Overload resolution ambiguity. All these functions match.
}
val list3 = buildList {
add("one")
val secondParameter = Inv(get(1))
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("Inv<String>; E; String")!>secondParameter<!>)
}
val list4 = buildList {
add("one")
val secondParameter = get(1)
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("Inv<String>; E; String")!>Inv(secondParameter)<!>)
}
val list5 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("Inv<String>; E; String")!>Inv(get(1))<!>)
}
val list6 = buildList {
add("one")
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; null")!>get(0)<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()
}
val list7 = buildList {
add("one")
with (get(0)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; null")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()<!>
}
}
val list71 = buildList {
add("one")
with (get(0)) l1@ {
with (listOf(1)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; LAMBDA_EXPRESSION")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()<!>
}
}
}
val list711 = buildList {
add("one")
with (get(0)) {
with (listOf(1)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; LAMBDA_EXPRESSION")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()<!>
}
}
}
val list8 = buildList {
add("one")
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("Inv<String>; E; String; null")!>Inv(get(0))<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo2<!>()
}
val list9 = buildList {
add("one")
with (get(0)) {
with (Inv(this)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("Inv<String>; E; String; null")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo2<!>()<!>
}
}
}
val list91 = buildList {
add("one")
with (get(0)) {
with (Inv(this)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; LAMBDA_EXPRESSION")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()<!>
}
}
}
// Resolution ambiguities below aren't due to stub types
val list10 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY!>foo0<!>(get(0), 0f)
}
val list11 = buildList {
add("one")
val x = get(0)
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY!>foo0<!>(x, 0f)
}
val list12 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY!>foo00<!>(get(0), 0f)
}
// Below are multi-arguments resolution ambiguities
val list13 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo000<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(0)<!>, 0f, <!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(0)<!>)
}
val list14 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo0000<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(0)<!>, 0f, <!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(0)<!>)
}
val list17 = buildList l1@ {
add("one")
with (get(0)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; null")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo0003<!>(0f, <!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>this@l1.get(0)<!>)<!>
}
}
val list18 = buildList {
add("one")
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; E; String; null")!>get(0)<!>.<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo0003<!>(0f, <!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("String; E; String")!>get(0)<!>)
}
val map1 = buildMap {
put(1, "one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo11<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("MutableSet<MutableMap.MutableEntry<Int, String>>; K, V; Int, String")!>entries<!>)
}
// There aren't specific errors below as casting value arguments doesn't make a resolve successful
val list15 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY!>foo0001<!>(get(0), 0f, get(0))
}
val list16 = buildList {
add("one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY!>foo0002<!>(get(0), 0f, get(0))
}
}
interface Foo<K> {
fun add(x: K)
fun get(): K
}
interface Foo2<K, V> {
fun put(x: K, y: V)
fun get(): MutableSet<MutableMap.MutableEntry<K, V>>
fun entries(): MutableSet<MutableMap.MutableEntry<K, V>>
}
fun <L, K, V> twoBuilderLambdas(@BuilderInference block: Foo<L>.() -> Unit, @BuilderInference block2: Foo2<K, V>.() -> Unit) {}
fun test() {
twoBuilderLambdas(
{
add("")
with (get()) {
with (listOf(1)) {
<!STUB_TYPE_IN_RECEIVER_CAUSES_AMBIGUITY("String; L; String; LAMBDA_EXPRESSION")!><!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>bar<!>()<!>
}
}
},
{
put(1, "one")
<!DEBUG_INFO_ELEMENT_WITH_ERROR_TYPE, OVERLOAD_RESOLUTION_AMBIGUITY, OVERLOAD_RESOLUTION_AMBIGUITY_BECAUSE_OF_STUB_TYPES!>foo11<!>(<!STUB_TYPE_IN_ARGUMENT_CAUSES_AMBIGUITY("MutableSet<MutableMap.MutableEntry<Int, String>>; K, V; Int, String")!>entries()<!>)
}
)
}
@@ -0,0 +1,53 @@
package
public fun foo(/*0*/ x: Inv<kotlin.Int>): kotlin.Unit
@kotlin.jvm.JvmName(name = "foo1") public fun foo(/*0*/ x: Inv<kotlin.String>): kotlin.Unit
public fun foo0(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.Int = ...): kotlin.Unit
public fun foo0(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.String = ...): kotlin.Unit
public fun foo00(/*0*/ x: kotlin.CharSequence, /*1*/ y: kotlin.Float): kotlin.Unit
public fun foo00(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Number): kotlin.Unit
public fun foo000(/*0*/ x: kotlin.CharSequence, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.Int): kotlin.Unit
public fun foo000(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Number, /*2*/ z: kotlin.String): kotlin.Unit
public fun foo0000(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.Int): kotlin.Unit
public fun foo0000(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Number, /*2*/ z: kotlin.String): kotlin.Unit
public fun foo0001(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.Int): kotlin.Unit
public fun foo0001(/*0*/ x: kotlin.collections.List<kotlin.Int>, /*1*/ y: kotlin.Number, /*2*/ z: kotlin.String): kotlin.Unit
public fun foo0002(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Number, /*2*/ z: kotlin.String): kotlin.Unit
public fun foo0002(/*0*/ x: kotlin.String, /*1*/ y: kotlin.Float, /*2*/ z: kotlin.Int): kotlin.Unit
public fun foo11(/*0*/ x: kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<kotlin.Int, kotlin.Int>>): kotlin.Unit
@kotlin.jvm.JvmName(name = "foo112") public fun foo11(/*0*/ x: kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<kotlin.Int, kotlin.String>>): kotlin.Unit
@kotlin.jvm.JvmName(name = "foo111") public fun foo11(/*0*/ x: kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<kotlin.String, kotlin.Int>>): kotlin.Unit
public fun main(): kotlin.Unit
public fun test(): kotlin.Unit
public fun </*0*/ L, /*1*/ K, /*2*/ V> twoBuilderLambdas(/*0*/ @kotlin.BuilderInference block: Foo<L>.() -> kotlin.Unit, /*1*/ @kotlin.BuilderInference block2: Foo2<K, V>.() -> kotlin.Unit): kotlin.Unit
public fun kotlin.Int.bar(): kotlin.Unit
@kotlin.jvm.JvmName(name = "bar1") public fun kotlin.String.bar(): kotlin.Unit
public fun kotlin.Int.foo0003(/*0*/ y: kotlin.Number, /*1*/ z: kotlin.String): kotlin.Unit
public fun kotlin.String.foo0003(/*0*/ y: kotlin.Float, /*1*/ z: kotlin.Int): kotlin.Unit
public fun Inv<kotlin.Int>.foo2(): kotlin.Unit
@kotlin.jvm.JvmName(name = "foo21") public fun Inv<kotlin.String>.foo2(): kotlin.Unit
public interface Foo</*0*/ K> {
public abstract fun add(/*0*/ x: K): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun get(): K
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface Foo2</*0*/ K, /*1*/ V> {
public abstract fun entries(): kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<K, V>>
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun get(): kotlin.collections.MutableSet<kotlin.collections.MutableMap.MutableEntry<K, V>>
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public abstract fun put(/*0*/ x: K, /*1*/ y: V): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Inv</*0*/ K> {
public constructor Inv</*0*/ K>(/*0*/ x: K)
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
}