/* * 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 // : X -> X // Y : X -> X // : Y -> Y // A : Any -> Any // T1 : Any? -> Any? // T2 : Any? -> Any? // : A -> A // B : Any -> Any // T : Any? -> Any? // synthetic constructor for B : B<*> -> B // bar1 : [@kotlin.jvm.JvmSuppressWildcards] A -> [@kotlin.jvm.JvmSuppressWildcards] A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards // bar2 : [@kotlin.jvm.JvmSuppressWildcards] A -> [@kotlin.jvm.JvmSuppressWildcards] A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // - @JvmSuppressWildcards : JvmSuppressWildcards -> JvmSuppressWildcards // bar3 : [@kotlin.jvm.JvmWildcard] A -> [@kotlin.jvm.JvmWildcard] A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // - @JvmWildcard : JvmWildcard -> JvmWildcard // p1 : A -> A // - CONTRAVARIANT X : X -> X // - COVARIANT X : X -> X // p1.getter() : A -> A // - CONTRAVARIANT X : X -> X // - COVARIANT X : X -> X // p2 : A -> A // - INVARIANT Any : Any -> Any // - INVARIANT Y : Y -> Y // p2.getter() : A -> A // - INVARIANT Any : Any -> Any // - INVARIANT Y : Y -> Y // p3 : A<*, *> -> A // p3.getter() : A<*, *> -> A // - STAR Any : Any? -> Any? // - STAR Any : Any? -> Any? // p4 : B -> B // - INVARIANT X : X -> X // p4.getter() : B -> B // - INVARIANT X : X -> X // p5 : B -> B // - CONTRAVARIANT X : X -> X // p5.getter() : B -> B // - CONTRAVARIANT X : X -> X // p6 : B -> B // - COVARIANT X : X -> X // p6.getter() : B -> B // - COVARIANT X : X -> X // p7 : B<*> -> B // p7.getter() : B<*> -> B // - STAR Any : Any? -> Any? // p8 : B> -> B> // - INVARIANT A : A -> A // - - INVARIANT X : X -> X // - - COVARIANT Y : Y -> Y // p8.getter() : B> -> B> // - INVARIANT A : A -> A // - - INVARIANT X : X -> X // - - COVARIANT Y : Y -> Y // v1 : A -> A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // v2 : A -> A // - INVARIANT Any : Any -> Any // - INVARIANT Y : Y -> Y // v3 : A<*, *> -> A // v4 : B -> B // - INVARIANT X : X -> X // v5 : B -> B // - CONTRAVARIANT X : X -> X // v6 : B -> B // - COVARIANT X : X -> X // v7 : B<*> -> B // v8 : B> -> B> // - INVARIANT A : A -> A // - - INVARIANT X : X -> X // - - COVARIANT Y : Y -> Y // foo : Unit -> Unit // r1 : A -> A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // r2 : A -> A // - INVARIANT Any : Any -> Any // - INVARIANT Y : Y -> Y // r3 : A<*, *> -> A // r4 : B -> B // - INVARIANT X : X -> X // r5 : B -> B // - CONTRAVARIANT X : X -> X // r6 : B -> B // - COVARIANT X : X -> X // r7 : B<*> -> B // r8 : B> -> B> // - INVARIANT A : A -> A // - - INVARIANT X : X -> X // - - COVARIANT Y : Y -> Y // C1 : A -> A // - INVARIANT X : X -> X // - INVARIANT X : X -> X // : C1 -> C1 // C2 : A -> A // - INVARIANT Any : Any -> Any // - INVARIANT Y : Y -> Y // : C2 -> C2 // C3 : B -> B // - INVARIANT X : X -> X // : C3 -> C3 // C4 : B> -> B> // - INVARIANT A : A -> A // - - INVARIANT X : X -> X // - - COVARIANT Y : Y -> Y // : C4 -> C4 // END open class X() final class Y() : X() open class A() open class B // FIXME: should this annotation propagate to the return type? // @JvmSuppressWildcards(false) // fun bar(): A = TODO() // A fun bar1(): @JvmSuppressWildcards(true) A = TODO() // A fun bar2(): @JvmSuppressWildcards(false) A = TODO() // A fun bar3(): @JvmWildcard A = TODO() // A val p1: A = TODO() // A val p2: A = TODO() // A val p3: A<*, *> = TODO() // B val p4: B = TODO() // B val p5: B = TODO() // B val p6: B = TODO() // B val p7: B<*> = TODO() // B> val p8: B> // void foo(A, A, A, B, B, B, B, B>); fun foo( v1: A, v2: A, v3: A<*, *>, v4: B, v5: B, v6: B, v7: B<*>, v8: B>, ): Unit = Unit // A fun r1(): A = TODO() // A fun r2(): A = TODO() // A fun r3(): A<*, *> = TODO() // B fun r4(): B = TODO() // B fun r5(): B = TODO() // B fun r6(): B = TODO() // B fun r7(): B<*> = TODO() // B> fun r8(): B> = TODO() // extends A class C1() : A() // A class C2() : A() // B class C3() : B() // B> class C4() : B>()