Inference for some kind of self types

This commit is contained in:
Mikhail Zarechenskiy
2021-06-18 02:50:22 +03:00
committed by Victor Petukhov
parent db72fd1e93
commit 44cf4be1e5
15 changed files with 273 additions and 16 deletions
@@ -12,15 +12,15 @@ class A<T> {
}
fun foo2(a: A<out CharSequence>, b: A<in CharSequence>) {
a.foo1(<!TYPE_MISMATCH!>Out<CharSequence>()<!>)
a.foo1<<!UPPER_BOUND_VIOLATED!>Out<CharSequence><!>>(<!TYPE_MISMATCH!>Out()<!>)
a.foo1(Out<CharSequence>())
a.foo1<Out<CharSequence>>(Out())
a.foo1(Out())
a.foo1(Out<Nothing>())
a.foo2(<!TYPE_MISMATCH!>Inv()<!>)
a.foo2(<!TYPE_MISMATCH!>Inv<CharSequence>()<!>)
a.foo2<<!UPPER_BOUND_VIOLATED!>Inv<CharSequence><!>>(<!TYPE_MISMATCH!>Inv()<!>)
a.foo2(Inv())
a.foo2(Inv<CharSequence>())
a.foo2<Inv<CharSequence>>(Inv())
a.foo3(In())
a.foo3(In<CharSequence>())
@@ -30,13 +30,13 @@ fun foo2(a: A<out CharSequence>, b: A<in CharSequence>) {
b.foo1(Out<CharSequence>())
b.foo1<Out<CharSequence>>(Out())
b.foo2(<!TYPE_MISMATCH!>Inv()<!>)
b.foo2(<!TYPE_MISMATCH!>Inv<CharSequence>()<!>)
b.foo2<<!UPPER_BOUND_VIOLATED!>Inv<CharSequence><!>>(<!TYPE_MISMATCH!>Inv()<!>)
b.foo2(Inv())
b.foo2(Inv<CharSequence>())
b.foo2<Inv<CharSequence>>(Inv())
b.foo3(<!TYPE_MISMATCH!>In<CharSequence>()<!>)
b.foo3<<!UPPER_BOUND_VIOLATED!>In<CharSequence><!>>(<!TYPE_MISMATCH!>In()<!>)
b.foo3(In<CharSequence>())
b.foo3<In<CharSequence>>(In())
b.foo3(In<Any?>())
b.foo3(In())
@@ -0,0 +1,29 @@
class Builder<B : Builder<B>> {
fun <T : B> test(): T = TODO()
fun foo() {}
}
fun testStar(builder: Builder<*>) {
builder.test()
builder
.test()
.foo()
}
fun <K : Builder<K>> testTypeParam(builder: Builder<K>) {
builder.test()
builder
.test()
.foo()
}
interface BodySpec<B, S : BodySpec<B, S>> {
fun <T : S> isEqualTo(expected: B): T
}
fun test(b: BodySpec<String, *>) {
b.isEqualTo("")
}
@@ -0,0 +1,21 @@
class Builder<B : Builder<B>> {
fun <T : B> test(): T = TODO()
fun foo() {}
}
fun testStar(builder: Builder<*>) {
<!DEBUG_INFO_EXPRESSION_TYPE("Builder<*>")!>builder.test()<!>
builder
.test()
.foo()
}
fun <K : Builder<K>> testTypeParam(builder: Builder<K>) {
<!DEBUG_INFO_EXPRESSION_TYPE("K")!>builder.test()<!>
builder
.test()
.foo()
}
@@ -0,0 +1,14 @@
package
public fun testStar(/*0*/ builder: Builder<*>): kotlin.Unit
public fun </*0*/ K : Builder<K>> testTypeParam(/*0*/ builder: Builder<K>): kotlin.Unit
public final class Builder</*0*/ B : Builder<B>> {
public constructor Builder</*0*/ B : Builder<B>>()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun </*0*/ T : B> test(): T
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,8 @@
interface BodySpec<B, S : BodySpec<B, S>> {
fun <T : S> isEqualTo(expected: B): T
}
fun test(b: BodySpec<String, *>) {
val x = b.isEqualTo("")
x
}
@@ -0,0 +1,8 @@
interface BodySpec<B, S : BodySpec<B, S>> {
fun <T : S> isEqualTo(expected: B): T
}
fun test(b: BodySpec<String, *>) {
val x = b.isEqualTo("")
<!DEBUG_INFO_EXPRESSION_TYPE("BodySpec<*, *>")!>x<!>
}
@@ -0,0 +1,10 @@
package
public fun test(/*0*/ b: BodySpec<kotlin.String, *>): kotlin.Unit
public interface BodySpec</*0*/ B, /*1*/ S : BodySpec<B, S>> {
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 abstract fun </*0*/ T : S> isEqualTo(/*0*/ expected: B): T
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,15 @@
fun test() {
WriterAppender.newBuilder()
}
object WriterAppender {
class Builder<B : Builder<B>> {
fun asBuilder(): B {
return this as B
}
}
fun <B : Builder<B>> newBuilder(): B {
return Builder<B>().asBuilder()
}
}
@@ -0,0 +1,15 @@
fun test() {
WriterAppender.<!TYPE_MISMATCH!>newBuilder<!>()
}
object WriterAppender {
class Builder<B : Builder<B>> {
fun asBuilder(): B {
return this <!UNCHECKED_CAST!>as B<!>
}
}
fun <B : Builder<B>> newBuilder(): B {
return Builder<B>().asBuilder()
}
}
@@ -0,0 +1,19 @@
package
public fun test(): kotlin.Unit
public object WriterAppender {
private constructor WriterAppender()
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 final fun </*0*/ B : WriterAppender.Builder<B>> newBuilder(): B
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
public final class Builder</*0*/ B : WriterAppender.Builder<B>> {
public constructor Builder</*0*/ B : WriterAppender.Builder<B>>()
public final fun asBuilder(): 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
}
}