/*
 * 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>>()
