| /* | |
| * 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!!<no-type> | |
| // 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>..<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: java.lang.IllegalArgumentException: <ERROR TYPE: NonExistingType> is not a sub type of the class/interface that contains `get` (List) | |
| // expected comparison failures | |
| // () -> 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() | |
| } |