1*af87fb4bSXin Li /*
2*af87fb4bSXin Li * Copyright 2020 Google LLC
3*af87fb4bSXin Li * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
4*af87fb4bSXin Li *
5*af87fb4bSXin Li * Licensed under the Apache License, Version 2.0 (the "License");
6*af87fb4bSXin Li * you may not use this file except in compliance with the License.
7*af87fb4bSXin Li * You may obtain a copy of the License at
8*af87fb4bSXin Li *
9*af87fb4bSXin Li * http://www.apache.org/licenses/LICENSE-2.0
10*af87fb4bSXin Li *
11*af87fb4bSXin Li * Unless required by applicable law or agreed to in writing, software
12*af87fb4bSXin Li * distributed under the License is distributed on an "AS IS" BASIS,
13*af87fb4bSXin Li * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*af87fb4bSXin Li * See the License for the specific language governing permissions and
15*af87fb4bSXin Li * limitations under the License.
16*af87fb4bSXin Li */
17*af87fb4bSXin Li
18*af87fb4bSXin Li // WITH_RUNTIME
19*af87fb4bSXin Li // TEST PROCESSOR: EquivalentJavaWildcardProcessor
20*af87fb4bSXin Li // EXPECTED:
21*af87fb4bSXin Li // X : Any -> Any
22*af87fb4bSXin Li // <init> : X -> X
23*af87fb4bSXin Li // Y : X -> X
24*af87fb4bSXin Li // <init> : Y -> Y
25*af87fb4bSXin Li // A : Any -> Any
26*af87fb4bSXin Li // T1 : Any? -> Any?
27*af87fb4bSXin Li // T2 : Any? -> Any?
28*af87fb4bSXin Li // <init> : A<T1, T2> -> A<T1, T2>
29*af87fb4bSXin Li // B : Any -> Any
30*af87fb4bSXin Li // T : Any? -> Any?
31*af87fb4bSXin Li // synthetic constructor for B : B<*> -> B<out Any?>
32*af87fb4bSXin Li // bar1 : [@kotlin.jvm.JvmSuppressWildcards] A<X, X> -> [@kotlin.jvm.JvmSuppressWildcards] A<X, X>
33*af87fb4bSXin Li // - INVARIANT X : X -> X
34*af87fb4bSXin Li // - INVARIANT X : X -> X
35*af87fb4bSXin Li // - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
36*af87fb4bSXin Li // bar2 : [@kotlin.jvm.JvmSuppressWildcards] A<X, X> -> [@kotlin.jvm.JvmSuppressWildcards] A<in X, out X>
37*af87fb4bSXin Li // - INVARIANT X : X -> X
38*af87fb4bSXin Li // - INVARIANT X : X -> X
39*af87fb4bSXin Li // - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
40*af87fb4bSXin Li // bar3 : [@kotlin.jvm.JvmWildcard] A<X, X> -> [@kotlin.jvm.JvmWildcard] A<X, X>
41*af87fb4bSXin Li // - INVARIANT X : X -> X
42*af87fb4bSXin Li // - INVARIANT X : X -> X
43*af87fb4bSXin Li // - @JvmWildcard : JvmWildcard -> JvmWildcard
44*af87fb4bSXin Li // p1 : A<in X, out X> -> A<X, X>
45*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
46*af87fb4bSXin Li // - COVARIANT X : X -> X
47*af87fb4bSXin Li // p1.getter() : A<in X, out X> -> A<X, X>
48*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
49*af87fb4bSXin Li // - COVARIANT X : X -> X
50*af87fb4bSXin Li // p2 : A<Any, Y> -> A<Any, Y>
51*af87fb4bSXin Li // - INVARIANT Any : Any -> Any
52*af87fb4bSXin Li // - INVARIANT Y : Y -> Y
53*af87fb4bSXin Li // p2.getter() : A<Any, Y> -> A<Any, Y>
54*af87fb4bSXin Li // - INVARIANT Any : Any -> Any
55*af87fb4bSXin Li // - INVARIANT Y : Y -> Y
56*af87fb4bSXin Li // p3 : A<*, *> -> A<Any?, Any?>
57*af87fb4bSXin Li // p3.getter() : A<*, *> -> A<Any?, Any?>
58*af87fb4bSXin Li // - STAR Any : Any? -> Any?
59*af87fb4bSXin Li // - STAR Any : Any? -> Any?
60*af87fb4bSXin Li // p4 : B<X> -> B<X>
61*af87fb4bSXin Li // - INVARIANT X : X -> X
62*af87fb4bSXin Li // p4.getter() : B<X> -> B<X>
63*af87fb4bSXin Li // - INVARIANT X : X -> X
64*af87fb4bSXin Li // p5 : B<in X> -> B<in X>
65*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
66*af87fb4bSXin Li // p5.getter() : B<in X> -> B<in X>
67*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
68*af87fb4bSXin Li // p6 : B<out X> -> B<out X>
69*af87fb4bSXin Li // - COVARIANT X : X -> X
70*af87fb4bSXin Li // p6.getter() : B<out X> -> B<out X>
71*af87fb4bSXin Li // - COVARIANT X : X -> X
72*af87fb4bSXin Li // p7 : B<*> -> B<out Any?>
73*af87fb4bSXin Li // p7.getter() : B<*> -> B<out Any?>
74*af87fb4bSXin Li // - STAR Any : Any? -> Any?
75*af87fb4bSXin Li // p8 : B<A<X, out Y>> -> B<A<X, Y>>
76*af87fb4bSXin Li // - INVARIANT A : A<X, out Y> -> A<X, Y>
77*af87fb4bSXin Li // - - INVARIANT X : X -> X
78*af87fb4bSXin Li // - - COVARIANT Y : Y -> Y
79*af87fb4bSXin Li // p8.getter() : B<A<X, out Y>> -> B<A<X, Y>>
80*af87fb4bSXin Li // - INVARIANT A<X, out Y> : A<X, out Y> -> A<in X, Y>
81*af87fb4bSXin Li // - - INVARIANT X : X -> X
82*af87fb4bSXin Li // - - COVARIANT Y : Y -> Y
83*af87fb4bSXin Li // v1 : A<X, X> -> A<in X, out X>
84*af87fb4bSXin Li // - INVARIANT X : X -> X
85*af87fb4bSXin Li // - INVARIANT X : X -> X
86*af87fb4bSXin Li // v2 : A<Any, Y> -> A<Any, Y>
87*af87fb4bSXin Li // - INVARIANT Any : Any -> Any
88*af87fb4bSXin Li // - INVARIANT Y : Y -> Y
89*af87fb4bSXin Li // v3 : A<*, *> -> A<out Any?, out Any?>
90*af87fb4bSXin Li // v4 : B<X> -> B<X>
91*af87fb4bSXin Li // - INVARIANT X : X -> X
92*af87fb4bSXin Li // v5 : B<in X> -> B<in X>
93*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
94*af87fb4bSXin Li // v6 : B<out X> -> B<out X>
95*af87fb4bSXin Li // - COVARIANT X : X -> X
96*af87fb4bSXin Li // v7 : B<*> -> B<out Any?>
97*af87fb4bSXin Li // v8 : B<A<X, out Y>> -> B<A<X, Y>>
98*af87fb4bSXin Li // - INVARIANT A : A<X, out Y> -> A<X, Y>
99*af87fb4bSXin Li // - - INVARIANT X : X -> X
100*af87fb4bSXin Li // - - COVARIANT Y : Y -> Y
101*af87fb4bSXin Li // foo : Unit -> Unit
102*af87fb4bSXin Li // r1 : A<X, X> -> A<X, X>
103*af87fb4bSXin Li // - INVARIANT X : X -> X
104*af87fb4bSXin Li // - INVARIANT X : X -> X
105*af87fb4bSXin Li // r2 : A<Any, Y> -> A<Any, Y>
106*af87fb4bSXin Li // - INVARIANT Any : Any -> Any
107*af87fb4bSXin Li // - INVARIANT Y : Y -> Y
108*af87fb4bSXin Li // r3 : A<*, *> -> A<Any?, Any?>
109*af87fb4bSXin Li // r4 : B<X> -> B<X>
110*af87fb4bSXin Li // - INVARIANT X : X -> X
111*af87fb4bSXin Li // r5 : B<in X> -> B<in X>
112*af87fb4bSXin Li // - CONTRAVARIANT X : X -> X
113*af87fb4bSXin Li // r6 : B<out X> -> B<out X>
114*af87fb4bSXin Li // - COVARIANT X : X -> X
115*af87fb4bSXin Li // r7 : B<*> -> B<out Any?>
116*af87fb4bSXin Li // r8 : B<A<X, out Y>> -> B<A<X, Y>>
117*af87fb4bSXin Li // - INVARIANT A : A<X, out Y> -> A<X, Y>
118*af87fb4bSXin Li // - - INVARIANT X : X -> X
119*af87fb4bSXin Li // - - COVARIANT Y : Y -> Y
120*af87fb4bSXin Li // C1 : A<X, X> -> A<X, X>
121*af87fb4bSXin Li // - INVARIANT X : X -> X
122*af87fb4bSXin Li // - INVARIANT X : X -> X
123*af87fb4bSXin Li // <init> : C1 -> C1
124*af87fb4bSXin Li // C2 : A<Any, Y> -> A<Any, Y>
125*af87fb4bSXin Li // - INVARIANT Any : Any -> Any
126*af87fb4bSXin Li // - INVARIANT Y : Y -> Y
127*af87fb4bSXin Li // <init> : C2 -> C2
128*af87fb4bSXin Li // C3 : B<X> -> B<X>
129*af87fb4bSXin Li // - INVARIANT X : X -> X
130*af87fb4bSXin Li // <init> : C3 -> C3
131*af87fb4bSXin Li // C4 : B<A<X, out Y>> -> B<A<in X, out Y>>
132*af87fb4bSXin Li // - INVARIANT A : A<X, out Y> -> A<in X, out Y>
133*af87fb4bSXin Li // - - INVARIANT X : X -> X
134*af87fb4bSXin Li // - - COVARIANT Y : Y -> Y
135*af87fb4bSXin Li // <init> : C4 -> C4
136*af87fb4bSXin Li // END
137*af87fb4bSXin Li
138*af87fb4bSXin Li open class X()
139*af87fb4bSXin Li final class Y() : X()
140*af87fb4bSXin Li
141*af87fb4bSXin Li open class A<in T1, out T2>()
142*af87fb4bSXin Li open class B<T>
143*af87fb4bSXin Li
144*af87fb4bSXin Li // FIXME: should this annotation propagate to the return type?
145*af87fb4bSXin Li // @JvmSuppressWildcards(false)
146*af87fb4bSXin Li // fun bar(): A<X, X> = TODO()
147*af87fb4bSXin Li
148*af87fb4bSXin Li // A<X, X>
bar1null149*af87fb4bSXin Li fun bar1(): @JvmSuppressWildcards(true) A<X, X> = TODO()
150*af87fb4bSXin Li // A<? super X, ? extends X>
151*af87fb4bSXin Li fun bar2(): @JvmSuppressWildcards(false) A<X, X> = TODO()
152*af87fb4bSXin Li // A<X, X>
153*af87fb4bSXin Li fun bar3(): @JvmWildcard A<X, X> = TODO()
154*af87fb4bSXin Li
155*af87fb4bSXin Li // A<X, X>
156*af87fb4bSXin Li val p1: A<in X, out X> = TODO()
157*af87fb4bSXin Li // A<java.lang.Object, Y>
158*af87fb4bSXin Li val p2: A<Any, Y> = TODO()
159*af87fb4bSXin Li // A<?, ?>
160*af87fb4bSXin Li val p3: A<*, *> = TODO()
161*af87fb4bSXin Li // B<X>
162*af87fb4bSXin Li val p4: B<X> = TODO()
163*af87fb4bSXin Li // B<? super X>
164*af87fb4bSXin Li val p5: B<in X> = TODO()
165*af87fb4bSXin Li // B<? extends X>
166*af87fb4bSXin Li val p6: B<out X> = TODO()
167*af87fb4bSXin Li // B<?>
168*af87fb4bSXin Li val p7: B<*> = TODO()
169*af87fb4bSXin Li // B<A<X, Y>>
170*af87fb4bSXin Li val p8: B<A<X, out Y>>
171*af87fb4bSXin Li
172*af87fb4bSXin Li // void foo(A<? super X, ? extends X>, A<java.lang.Object, Y>, A<?, ?>, B<X>, B<? super X>, B<? extends X>, B<?>, B<A<X, Y>>);
173*af87fb4bSXin Li fun foo(
174*af87fb4bSXin Li v1: A<X, X>,
175*af87fb4bSXin Li v2: A<Any, Y>,
176*af87fb4bSXin Li v3: A<*, *>,
177*af87fb4bSXin Li v4: B<X>,
178*af87fb4bSXin Li v5: B<in X>,
179*af87fb4bSXin Li v6: B<out X>,
180*af87fb4bSXin Li v7: B<*>,
181*af87fb4bSXin Li v8: B<A<X, out Y>>,
182*af87fb4bSXin Li ): Unit = Unit
183*af87fb4bSXin Li
184*af87fb4bSXin Li // A<X, X>
185*af87fb4bSXin Li fun r1(): A<X, X> = TODO()
186*af87fb4bSXin Li // A<java.lang.Object, Y>
187*af87fb4bSXin Li fun r2(): A<Any, Y> = TODO()
188*af87fb4bSXin Li // A<?, ?>
189*af87fb4bSXin Li fun r3(): A<*, *> = TODO()
190*af87fb4bSXin Li // B<X>
191*af87fb4bSXin Li fun r4(): B<X> = TODO()
192*af87fb4bSXin Li // B<? super X>
193*af87fb4bSXin Li fun r5(): B<in X> = TODO()
194*af87fb4bSXin Li // B<? extends X>
195*af87fb4bSXin Li fun r6(): B<out X> = TODO()
196*af87fb4bSXin Li // B<?>
197*af87fb4bSXin Li fun r7(): B<*> = TODO()
198*af87fb4bSXin Li // B<A<X, Y>>
199*af87fb4bSXin Li fun r8(): B<A<X, out Y>> = TODO()
200*af87fb4bSXin Li
201*af87fb4bSXin Li // extends A<X, X>
202*af87fb4bSXin Li class C1() : A<X, X>()
203*af87fb4bSXin Li // A<java.lang.Object, Y>
204*af87fb4bSXin Li class C2() : A<Any, Y>()
205*af87fb4bSXin Li // B<X>
206*af87fb4bSXin Li class C3() : B<X>()
207*af87fb4bSXin Li // B<A<? super X, ? extends Y>>
208*af87fb4bSXin Li class C4() : B<A<X, out Y>>()
209