/*
 * Copyright 2022 Google LLC
 * Copyright 2010-2022 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: AsMemberOfProcessor
// EXPECTED:
// main.Test: MutableIterator<(String..String?)>
// main.Test: Iterator<(String..String?)>
// main.Test: MutableIterator<(String..String?)>
// lib.Test: MutableIterator<(String..String?)>
// lib.Test: Iterator<(String..String?)>
// lib.Test: MutableIterator<(String..String?)>
// main.TestKt: MutableIterator<String>
// main.TestKt: Iterator<String>
// main.TestKt: MutableIterator<String>
// lib.TestKt: MutableIterator<String>
// lib.TestKt: Iterator<String>
// lib.TestKt: MutableIterator<String>
// Child1!!
// intType: kotlin.Int!!
// baseTypeArg1: kotlin.Int!!
// baseTypeArg2: kotlin.String?
// typePair: kotlin.Pair!!<kotlin.String?, kotlin.Int!!>
// errorType: <ERROR TYPE: NonExistType>?
// extensionProperty: kotlin.String?
// returnInt: () -> kotlin.Int!!
// returnArg1: () -> kotlin.Int!!
// returnArg1Nullable: () -> kotlin.Int?
// returnArg2: () -> kotlin.String?
// returnArg2Nullable: () -> kotlin.String?
// receiveArgs: (kotlin.Int?, kotlin.Int!!, kotlin.String?) -> kotlin.Unit!!
// receiveArgsPair: (kotlin.Pair!!<kotlin.Int!!, kotlin.String?>, kotlin.Pair?<kotlin.Int?, kotlin.String?>) -> kotlin.Unit!!
// functionArgType: <BaseTypeArg1: kotlin.Any?>(Base.functionArgType.BaseTypeArg1?) -> kotlin.String?
// functionArgTypeWithBounds: <in T: kotlin.Int!!>(Base.functionArgTypeWithBounds.T?) -> kotlin.String?
// extensionFunction: kotlin.Int!!.() -> kotlin.Int?
// Child2!!<kotlin.Any?>
// intType: kotlin.Int!!
// baseTypeArg1: kotlin.Any?
// baseTypeArg2: kotlin.Any?
// typePair: kotlin.Pair!!<kotlin.Any?, kotlin.Any?>
// errorType: <ERROR TYPE: NonExistType>?
// extensionProperty: kotlin.Any?
// returnInt: () -> kotlin.Int!!
// returnArg1: () -> kotlin.Any?
// returnArg1Nullable: () -> kotlin.Any?
// returnArg2: () -> kotlin.Any?
// returnArg2Nullable: () -> kotlin.Any?
// receiveArgs: (kotlin.Int?, kotlin.Any?, kotlin.Any?) -> kotlin.Unit!!
// receiveArgsPair: (kotlin.Pair!!<kotlin.Any?, kotlin.Any?>, kotlin.Pair?<kotlin.Any?, kotlin.Any?>) -> kotlin.Unit!!
// functionArgType: <BaseTypeArg1: kotlin.Any?>(Base.functionArgType.BaseTypeArg1?) -> kotlin.Any?
// functionArgTypeWithBounds: <in T: kotlin.Any?>(Base.functionArgTypeWithBounds.T?) -> kotlin.Any?
// extensionFunction: kotlin.Any?.() -> kotlin.Any?
// Child2!!<kotlin.String!!>
// intType: kotlin.Int!!
// baseTypeArg1: kotlin.String!!
// baseTypeArg2: kotlin.String?
// typePair: kotlin.Pair!!<kotlin.String?, kotlin.String!!>
// errorType: <ERROR TYPE: NonExistType>?
// extensionProperty: kotlin.String?
// returnInt: () -> kotlin.Int!!
// returnArg1: () -> kotlin.String!!
// returnArg1Nullable: () -> kotlin.String?
// returnArg2: () -> kotlin.String?
// returnArg2Nullable: () -> kotlin.String?
// receiveArgs: (kotlin.Int?, kotlin.String!!, kotlin.String?) -> kotlin.Unit!!
// receiveArgsPair: (kotlin.Pair!!<kotlin.String!!, kotlin.String?>, kotlin.Pair?<kotlin.String?, kotlin.String?>) -> kotlin.Unit!!
// functionArgType: <BaseTypeArg1: kotlin.Any?>(Base.functionArgType.BaseTypeArg1?) -> kotlin.String?
// functionArgTypeWithBounds: <in T: kotlin.String!!>(Base.functionArgTypeWithBounds.T?) -> kotlin.String?
// extensionFunction: kotlin.String!!.() -> kotlin.String?
// NotAChild!!
// intType: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `intType` (Base)
// baseTypeArg1: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `baseTypeArg1` (Base)
// baseTypeArg2: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `baseTypeArg2` (Base)
// typePair: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `typePair` (Base)
// errorType: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `errorType` (Base)
// extensionProperty: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `extensionProperty` (Base)
// returnInt: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `returnInt` (Base)
// returnArg1: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `returnArg1` (Base)
// returnArg1Nullable: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `returnArg1Nullable` (Base)
// returnArg2: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `returnArg2` (Base)
// returnArg2Nullable: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `returnArg2Nullable` (Base)
// receiveArgs: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `receiveArgs` (Base)
// receiveArgsPair: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `receiveArgsPair` (Base)
// functionArgType: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `functionArgType` (Base)
// functionArgTypeWithBounds: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `functionArgTypeWithBounds` (Base)
// extensionFunction: java.lang.IllegalArgumentException: NotAChild is not a sub type of the class/interface that contains `extensionFunction` (Base)
// List#get
// listOfStrings: (kotlin.Int!!) -> kotlin.String!!
// setOfStrings: java.lang.IllegalArgumentException: Set<String> is not a sub type of the class/interface that contains `get` (List)
// Set#contains
// listOfStrings: java.lang.IllegalArgumentException: List<String> is not a sub type of the class/interface that contains `contains` (Set)
// setOfStrings: (kotlin.String!!) -> kotlin.Boolean!!
// JavaChild1!!
// intType: kotlin.Int!!
// typeArg1: kotlin.String
// typeArg2: kotlin.Int
// errorType: <ERROR TYPE: NonExist>?
// returnArg1: () -> kotlin.Int
// receiveArgs: (kotlin.String, kotlin.Int, kotlin.Int!!) -> kotlin.Unit!!
// methodArgType: <BaseTypeArg1: kotlin.Any>(JavaBase.methodArgType.BaseTypeArg1, kotlin.Int) -> kotlin.Unit!!
// methodArgTypeWithBounds: <T: kotlin.String>(JavaBase.methodArgTypeWithBounds.T) -> kotlin.Unit!!
// fileLevelFunction: java.lang.IllegalArgumentException: Cannot call asMemberOf with a function that is not declared in a class or an interface
// fileLevelExtensionFunction: java.lang.IllegalArgumentException: Cannot call asMemberOf with a function that is not declared in a class or an interface
// fileLevelProperty: java.lang.IllegalArgumentException: Cannot call asMemberOf with a property that is not declared in a class or an interface
// errorType: (<ERROR TYPE: Int>?) -> <ERROR TYPE: E>?
// expected comparison failures
// <BaseTypeArg1: kotlin.Any?>(Base.functionArgType.BaseTypeArg1?) -> kotlin.String?
// () -> kotlin.Int!!
// () -> kotlin.Int!!
// (kotlin.Int!!) -> kotlin.Unit!!
// Baz!!<kotlin.Long!!, kotlin.Number!!>
// END
// MODULE: lib
// FILE: Test.java
package lib;
import java.util.List;
class Test {
    List<String> f() {
        throw new RuntimeException("stub");
    }
}
// FILE: TestKt.kt
package lib
class TestKt {
    fun f(): MutableList<String> = TODO()
}
// MODULE: main(lib)
// FILE: Input.kt
open class Base<BaseTypeArg1, BaseTypeArg2> {
    val intType: Int = 0
    val baseTypeArg1: BaseTypeArg1 = TODO()
    val baseTypeArg2: BaseTypeArg2 = TODO()
    val typePair: Pair<BaseTypeArg2, BaseTypeArg1>  = TODO()
    val errorType: NonExistType = TODO()
    fun returnInt():Int = TODO()
    fun returnArg1(): BaseTypeArg1 = TODO()
    fun returnArg1Nullable(): BaseTypeArg1? = TODO()
    fun returnArg2(): BaseTypeArg2 = TODO()
    fun returnArg2Nullable(): BaseTypeArg2? = TODO()
    fun receiveArgs(intArg:Int?, arg1: BaseTypeArg1, arg2:BaseTypeArg2):Unit = TODO()
    fun receiveArgsPair(
        pairs: Pair<BaseTypeArg1, BaseTypeArg2>,
        pairNullable: Pair<BaseTypeArg1?, BaseTypeArg2?>?,
    ):Unit = TODO()
    // intentional type argument name conflict here to ensure it does not get replaced by mistake
    fun <BaseTypeArg1> functionArgType(t:BaseTypeArg1?): BaseTypeArg2 = TODO()
    fun <in T: BaseTypeArg1> functionArgTypeWithBounds(t:T?): BaseTypeArg2 = TODO()
    fun BaseTypeArg1.extensionFunction():BaseTypeArg1? = TODO()
    val BaseTypeArg2.extensionProperty:BaseTypeArg2? = TODO()
}

open class Child1 : Base<Int, String?>() {
}

open class Child2<ChildTypeArg1> : Base<ChildTypeArg1, ChildTypeArg1?>() {
}

class NotAChild
val child2WithString: Child2<String> = TODO()
val listOfStrings: List<String> = TODO()
val setOfStrings: Set<String> = TODO()

fun <T>List<T>.fileLevelExtensionFunction():Unit = TODO()
fun <T>fileLevelFunction():Unit = TODO()
val fileLevelProperty:Int = 3
val errorType: NonExistingType

interface KotlinInterface {
    val x:Int
    var y:Int
}

interface Usage : Foo<Long, Integer> {
    fun foo(param: Foo<Double, Integer>): Foo<String, Integer>
}
interface Foo<V1, V2: Integer> : Bar<Baz<V1, Number>, V2> {}
interface Bar<U1, U2: Integer> : Baz<U1, U2> {}
interface Baz<T1, T2: Number> {
    fun method1(): T1
    fun method2(): T2
}

// FILE: JavaInput.java
class JavaBase<BaseTypeArg1, BaseTypeArg2> {
    int intType;
    BaseTypeArg1 typeArg1;
    BaseTypeArg2 typeArg2;
    NonExist errorType;
    BaseTypeArg2 returnArg1() {
        return null;
    }
    void receiveArgs(BaseTypeArg1 arg1, BaseTypeArg2 arg2, int intArg) {
    }
    <BaseTypeArg1> void methodArgType(BaseTypeArg1 arg1, BaseTypeArg2 arg2) {
    }
    <T extends BaseTypeArg1> void methodArgTypeWithBounds(T arg1) {
    }
}

class JavaChild1 extends JavaBase<String, Integer> {
}

class JavaImpl implements KotlinInterface {
    public int getX() {
        return 1;
    }
    public int getY() {
        return 1;
    }
    public void setY(int value) {
    }
}

// FILE: main/Test.java
package main;
import java.util.List;
class Test {
    List<String> f() {
        throw new RuntimeException("stub");
    }
}
// FILE: TestKt.kt
package main
class TestKt {
    fun f(): MutableList<String> = TODO()
}
