/*
 * 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:
// bar1 : [@JvmSuppressWildcards(true)] A<X, X> -> A<X, X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
// bar2 : [@JvmSuppressWildcards(false)] A<X, X> -> A<in X, out X>
// - INVARIANT X : X -> X
// - INVARIANT X : X -> X
// - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards
// bar3 : [@JvmWildcard] A<X, X> -> 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
// EXPECT NEXT: p1.field : A<in X, out X> -> A<in X, out X>
// EXPECT NEXT: - CONTRAVARIANT X : X -> X
// EXPECT NEXT: - 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
// EXPECT NEXT: p2.field : A<Any, Y> -> A<Any, Y>
// EXPECT NEXT: - INVARIANT Any : Any -> Any
// EXPECT NEXT: - INVARIANT Y : Y -> Y
// p3 : A<*, *> -> A<Any?, Any?>
// p3.getter() : A<*, *> -> A<Any?, Any?>
// EXPECT NEXT: p3.field : A<*, *> -> A<out Any?, out Any?>
// p4 : B<X> -> B<X>
// - INVARIANT X : X -> X
// p4.getter() : B<X> -> B<X>
// - INVARIANT X : X -> X
// EXPECT NEXT: p4.field : B<X> -> B<X>
// EXPECT NEXT: - 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
// EXPECT NEXT: p5.field : B<in X> -> B<in X>
// EXPECT NEXT: - 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
// EXPECT NEXT: p6.field : B<out X> -> B<out X>
// EXPECT NEXT: - COVARIANT X : X -> X
// p7 : B<*> -> B<out Any?>
// p7.getter() : B<*> -> B<out Any?>
// EXPECT NEXT: p7.field : B<*> -> B<out Any?>
// p8 : B<A<X, out Y>> -> B<A<X, Y>>
// - INVARIANT A<INVARIANT X, COVARIANT Y> : 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<INVARIANT X, COVARIANT Y> : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// EXPECT NEXT: p8.field : B<A<X, out Y>> -> B<A<X, Y>>
// EXPECT NEXT: - INVARIANT A<X, out Y> : A<X, out Y> -> A<X, Y>
// EXPECT NEXT: - - INVARIANT X : X -> X
// EXPECT NEXT: - - 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<X, out Y> : 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<INVARIANT X, COVARIANT Y> : A<X, out Y> -> A<X, Y>
// - - INVARIANT X : X -> X
// - - COVARIANT Y : Y -> Y
// X : Any -> Any
// <init> : X -> X
// Y : X -> X
// <init> : Y -> Y
// A : Any -> Any
// T1 : Any? -> Any?
// T2 : Any? -> Any?
// <init> : A<*, *> -> A<Any?, Any?>
// T1 : Any? -> Any?
// T2 : Any? -> Any?
// B : Any -> Any
// T : Any? -> Any?
// synthetic constructor for B : B<*> -> B<out Any?>
// T : Any? -> Any?
// 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<INVARIANT X, COVARIANT Y> : 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>>()
