[NI] Support fixation to subtype in completion mode calculator
Allow full compltion mode for return type depending on type parameters in contravariant position only if they have proper equality constraint.
This commit is contained in:
@@ -57,7 +57,6 @@ fun test7(cls: Cls) {
|
||||
}
|
||||
|
||||
fun test8(cls: Cls) {
|
||||
// TODO
|
||||
id(
|
||||
wrapIn(cls)
|
||||
)
|
||||
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
class In<in I>(arg: I)
|
||||
class Out<out O>(val prop: O)
|
||||
class Inv<T>(val prop: T)
|
||||
|
||||
interface Upper
|
||||
class Lower : Upper
|
||||
|
||||
fun <K> id(arg: K): K = arg
|
||||
|
||||
fun test(lower: Lower) {
|
||||
id<Inv<Upper>>(Inv(lower))
|
||||
id<In<Upper>>(In(lower))
|
||||
id<Out<Upper>>(Out(lower))
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER
|
||||
|
||||
class In<in I>(arg: I)
|
||||
class Out<out O>(val prop: O)
|
||||
class Inv<T>(val prop: T)
|
||||
|
||||
interface Upper
|
||||
class Lower : Upper
|
||||
|
||||
fun <K> id(arg: K): K = arg
|
||||
|
||||
fun test(lower: Lower) {
|
||||
id<Inv<Upper>>(Inv(lower))
|
||||
id<In<Upper>>(In(lower))
|
||||
id<Out<Upper>>(Out(lower))
|
||||
}
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ K> id(/*0*/ arg: K): K
|
||||
public fun test(/*0*/ lower: Lower): kotlin.Unit
|
||||
|
||||
public final class In</*0*/ in I> {
|
||||
public constructor In</*0*/ in I>(/*0*/ arg: I)
|
||||
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>(/*0*/ prop: T)
|
||||
public final val prop: 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 Lower : Upper {
|
||||
public constructor Lower()
|
||||
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 O> {
|
||||
public constructor Out</*0*/ out O>(/*0*/ prop: O)
|
||||
public final val prop: O
|
||||
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 interface Upper {
|
||||
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
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
|
||||
|
||||
interface Bound
|
||||
interface Upper : Bound
|
||||
class Lower : Upper
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun <T : Bound, U : T> makeInv(v: U): Inv<T> = TODO()
|
||||
fun <K> id(arg: K): K = arg
|
||||
|
||||
fun test(lower: Lower) {
|
||||
id<Inv<Upper>>(makeInv(lower))
|
||||
}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
// !LANGUAGE: +NewInference
|
||||
// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE
|
||||
|
||||
interface Bound
|
||||
interface Upper : Bound
|
||||
class Lower : Upper
|
||||
|
||||
class Inv<T>
|
||||
|
||||
fun <T : Bound, U : T> makeInv(v: U): Inv<T> = TODO()
|
||||
fun <K> id(arg: K): K = arg
|
||||
|
||||
fun test(lower: Lower) {
|
||||
id<Inv<Upper>>(makeInv(lower))
|
||||
}
|
||||
+31
@@ -0,0 +1,31 @@
|
||||
package
|
||||
|
||||
public fun </*0*/ K> id(/*0*/ arg: K): K
|
||||
public fun </*0*/ T : Bound, /*1*/ U : T> makeInv(/*0*/ v: U): Inv<T>
|
||||
public fun test(/*0*/ lower: Lower): kotlin.Unit
|
||||
|
||||
public interface Bound {
|
||||
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 Lower : Upper {
|
||||
public constructor Lower()
|
||||
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 interface Upper : Bound {
|
||||
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