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