Support JvmWildcard/JvmSuppressWildcard in ultra-light classes

The idea is reusing logic from KotlinTypeMapper for that
This commit is contained in:
Denis Zharkov
2018-11-16 15:26:51 +03:00
parent ce3b489fa9
commit 580d03be5f
7 changed files with 156 additions and 25 deletions
@@ -0,0 +1,38 @@
class Inv<E>
class Out<out T>
class OutPair<out Final, out Y>
class In<in Z>
class Final
open class Open
class Container {
@JvmSuppressWildcards(true)
fun deepOpen(x: Out<Out<Out<Open>>>) {}
@JvmSuppressWildcards(false)
fun bar(): Out<Open> = null!!
fun simpleOut(x: Out<@JvmWildcard Final>) {}
fun simpleIn(x: In<@JvmWildcard Any?>) {}
fun falseTrueFalse(): @JvmSuppressWildcards(false) OutPair<Final, @JvmSuppressWildcards OutPair<Out<Final>, Out<@JvmSuppressWildcards(false) Final>>> = null!!
fun combination(): @JvmSuppressWildcards OutPair<Open, @JvmWildcard OutPair<Open, @JvmWildcard Out<Open>>> = null!!
@JvmSuppressWildcards(false)
fun foo(x: Boolean, y: Out<Int>): Int = 1
@JvmSuppressWildcards(true)
fun bar(x: Boolean, y: In<Long>, z: @JvmSuppressWildcards(false) Long): Int = 1
}
interface A<T> {
@JvmSuppressWildcards(true)
fun foo(): Out<T>
}
interface B {
@JvmSuppressWildcards(true)
fun foo(): In<Open>
}
@@ -0,0 +1,53 @@
class Inv<E>
class Out<out T>
class OutPair<out Final, out Y>
class In<in Z>
class Final
open class Open
class Container {
// The signatures are obtained from compiler/testData/writeSignature/declarationSiteVariance/wildcardOptimization
fun openClassArgument(x: Out<Open>, y: In<Open>) {}
fun finalClassArgument(x: Out<Final>, y: In<Final>) {}
fun oneArgumentFinal(x: OutPair<Final, Open>) {}
fun arrayOfOutOpen(x: Array<Out<Open>>) {}
fun arrayOfOutFinal(x: Array<Out<Final>>) {}
fun outOfArrayOpen(x: Out<Array<Open>>) {}
fun outOfArrayOutOpen(x: Out<Array<out Open>>) {}
fun deepOpen(x: Out<Out<Out<Open>>>) {}
fun deepFinal(x: Out<Out<Out<Final>>>) {}
fun skipAllOutInvWildcards(): Inv<OutPair<Open, Out<Out<Open>>>> = null!!
fun skipAllInvWildcards(): Inv<In<Out<Open>>> = null!!
fun notDeepIn(): In<Final> = null!!
fun skipWildcardsUntilIn0(): Out<In<Out<Open>>> = null!!
fun skipWildcardsUntilIn1(): Out<In<Out<Final>>> = null!!
fun skipWildcardsUntilIn2(): Out<In<OutPair<Final, Out<Open>>>> = null!!
fun skipWildcardsUntilInProjection(): Inv<in Out<Open>> = null!!
fun outIn(x: Out<In<Final>>) {}
fun outInAny(x: Out<In<Any?>>) {}
fun invInv(x: Out<Inv<Open>>) {}
fun invOut(x: Out<Inv<out Open>>) {}
fun invOutFinal(x: Out<Inv<out Final>>) {}
fun invIn(x: Out<Inv<in Final>>) {}
fun invInAny(x: Out<Inv<in Any>>) {}
fun inFinal(x: In<Final>) {}
fun inAny(x: In<Any>) {}
fun inOutFinal(x: In<Out<Final>>) {}
fun invOpen(x: Inv<Open>) {}
fun invFinal(x: Inv<Final>) {}
fun invOutOpen(x: Inv<Out<Open>>) {}
fun invOutFinal(x: Inv<Out<Final>>) {}
fun invInOutOpen(x: Inv<In<Out<Open>>>) {}
fun invInOutFinal(x: Inv<In<Out<Final>>>) {}
fun invOutProjectedOutFinal(x: Inv<out Out<Final>>) {}
fun <Q : Final> typeParameter(x: Out<Q>, y: In<Q>) {}
}