blob: 7282cf40f19ce173cf82e4884848479c81e1bd43 [file] [log] [blame]
/*
* Copyright 2020 Google LLC
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// WITH_RUNTIME
// TEST PROCESSOR: EquivalentJavaWildcardProcessor
// EXPECTED:
// X : Any -> Any
// <init> : X -> X
// Y : X -> X
// <init> : Y -> Y
// A : Any -> Any
// T1 : Any? -> Any?
// T2 : Any? -> Any?
// <init> : A<T1, T2> -> A<T1, T2>
// B : Any -> Any
// T : Any? -> Any?
// synthetic constructor for B : B<*> -> B<out Any?>
// bar1 : [@kotlin.jvm.JvmSuppressWildcards] A<X, X> -> [@kotlin.jvm.JvmSuppressWildcards] A<X, X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
// bar2 : [@kotlin.jvm.JvmSuppressWildcards] A<X, X> -> [@kotlin.jvm.JvmSuppressWildcards] A<in X, out X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
// bar3 : [@kotlin.jvm.JvmWildcard] A<X, X> -> [@kotlin.jvm.JvmWildcard] A<X, X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// - @JvmWildcard : JvmWildcard -> JvmWildcard
// p1 : A<in X, out X> -> A<X, X>
// - CONTRAVARIANT X : X -> X
// - COVARIANT X : X -> X
// p1.getter() : A<in X, out X> -> A<X, X>
// - CONTRAVARIANT X : X -> X
// - COVARIANT X : X -> X
// p2 : A<Any, Y> -> A<Any, Y>
// - INVARIANT Any : Any -> Any
// - INVARIANT Y : Y -> Y
// p2.getter() : A<Any, Y> -> A<Any, Y>
// - INVARIANT Any : Any -> Any
// - INVARIANT Y : Y -> Y
// p3 : A<*, *> -> A<Any?, Any?>
// p3.getter() : A<*, *> -> A<Any?, Any?>
// - STAR Any : Any? -> Any?
// - STAR Any : Any? -> Any?
// p4 : B<X> -> B<X>
// - INVARIANT X : X -> X
// p4.getter() : B<X> -> B<X>
// - INVARIANT X : X -> X
// p5 : B<in X> -> B<in X>
// - CONTRAVARIANT X : X -> X
// p5.getter() : B<in X> -> B<in X>
// - CONTRAVARIANT X : X -> X
// p6 : B<out X> -> B<out X>
// - COVARIANT X : X -> X
// p6.getter() : B<out X> -> B<out X>
// - COVARIANT X : X -> X
// p7 : B<*> -> B<out Any?>
// p7.getter() : B<*> -> B<out Any?>
// - STAR Any : Any? -> Any?
// p8 : B<A<X, out Y>> -> B<A<X, Y>>
// - INVARIANT A : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// p8.getter() : B<A<X, out Y>> -> B<A<X, Y>>
// - INVARIANT A<X, out Y> : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// v1 : A<X, X> -> A<in X, out X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// v2 : A<Any, Y> -> A<Any, Y>
// - INVARIANT Any : Any -> Any
// - INVARIANT Y : Y -> Y
// v3 : A<*, *> -> A<out Any?, out Any?>
// v4 : B<X> -> B<X>
// - INVARIANT X : X -> X
// v5 : B<in X> -> B<in X>
// - CONTRAVARIANT X : X -> X
// v6 : B<out X> -> B<out X>
// - COVARIANT X : X -> X
// v7 : B<*> -> B<out Any?>
// v8 : B<A<X, out Y>> -> B<A<X, Y>>
// - INVARIANT A : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// foo : Unit -> Unit
// r1 : A<X, X> -> A<X, X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// r2 : A<Any, Y> -> A<Any, Y>
// - INVARIANT Any : Any -> Any
// - INVARIANT Y : Y -> Y
// r3 : A<*, *> -> A<Any?, Any?>
// r4 : B<X> -> B<X>
// - INVARIANT X : X -> X
// r5 : B<in X> -> B<in X>
// - CONTRAVARIANT X : X -> X
// r6 : B<out X> -> B<out X>
// - COVARIANT X : X -> X
// r7 : B<*> -> B<out Any?>
// r8 : B<A<X, out Y>> -> B<A<X, Y>>
// - INVARIANT A : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// C1 : A<X, X> -> A<X, X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// <init> : C1 -> C1
// C2 : A<Any, Y> -> A<Any, Y>
// - INVARIANT Any : Any -> Any
// - INVARIANT Y : Y -> Y
// <init> : C2 -> C2
// C3 : B<X> -> B<X>
// - INVARIANT X : X -> X
// <init> : C3 -> C3
// C4 : B<A<X, out Y>> -> B<A<in X, out Y>>
// - INVARIANT A : A<X, out Y> -> A<in X, out Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// <init> : C4 -> C4
// END
open class X()
final class Y() : X()
open class A<in T1, out T2>()
open class B<T>
// FIXME: should this annotation propagate to the return type?
// @JvmSuppressWildcards(false)
// fun bar(): A<X, X> = TODO()
// A<X, X>
fun bar1(): @JvmSuppressWildcards(true) A<X, X> = TODO()
// A<? super X, ? extends X>
fun bar2(): @JvmSuppressWildcards(false) A<X, X> = TODO()
// A<X, X>
fun bar3(): @JvmWildcard A<X, X> = TODO()
// A<X, X>
val p1: A<in X, out X> = TODO()
// A<java.lang.Object, Y>
val p2: A<Any, Y> = TODO()
// A<?, ?>
val p3: A<*, *> = TODO()
// B<X>
val p4: B<X> = TODO()
// B<? super X>
val p5: B<in X> = TODO()
// B<? extends X>
val p6: B<out X> = TODO()
// B<?>
val p7: B<*> = TODO()
// B<A<X, Y>>
val p8: B<A<X, out Y>>
// 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>>);
fun foo(
v1: A<X, X>,
v2: A<Any, Y>,
v3: A<*, *>,
v4: B<X>,
v5: B<in X>,
v6: B<out X>,
v7: B<*>,
v8: B<A<X, out Y>>,
): Unit = Unit
// A<X, X>
fun r1(): A<X, X> = TODO()
// A<java.lang.Object, Y>
fun r2(): A<Any, Y> = TODO()
// A<?, ?>
fun r3(): A<*, *> = TODO()
// B<X>
fun r4(): B<X> = TODO()
// B<? super X>
fun r5(): B<in X> = TODO()
// B<? extends X>
fun r6(): B<out X> = TODO()
// B<?>
fun r7(): B<*> = TODO()
// B<A<X, Y>>
fun r8(): B<A<X, out Y>> = TODO()
// extends A<X, X>
class C1() : A<X, X>()
// A<java.lang.Object, Y>
class C2() : A<Any, Y>()
// B<X>
class C3() : B<X>()
// B<A<? super X, ? extends Y>>
class C4() : B<A<X, out Y>>()