From affd1c50e389938e51b09b1ebe205dd0901cfdd9 Mon Sep 17 00:00:00 2001 From: Kuan-Ying Chou Date: Tue, 24 Sep 2024 16:35:57 +0100 Subject: [PATCH 1/2] Test asMemberOf --- kotlin-analysis-api/testData/asMemberOf.kt | 28 ++++++++++++++++++ .../ksp/processor/AsMemberOfProcessor.kt | 14 +++++++++ test-utils/testData/api/asMemberOf.kt | 29 +++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/kotlin-analysis-api/testData/asMemberOf.kt b/kotlin-analysis-api/testData/asMemberOf.kt index 5c07d1d59c..80b5e92702 100644 --- a/kotlin-analysis-api/testData/asMemberOf.kt +++ b/kotlin-analysis-api/testData/asMemberOf.kt @@ -111,6 +111,21 @@ // (kotlin.Int!!) -> kotlin.Unit!! // Baz!! // END +// MODULE: lib +// FILE: Test.java +package lib; +import java.util.List; +class Test { + List f() { + throw new RuntimeException("stub"); + } +} +// FILE: TestKt.kt +package lib +class TestKt { + fun f(): MutableList = TODO() +} +// MODULE: main(lib) // FILE: Input.kt open class Base { val intType: Int = 0 @@ -196,3 +211,16 @@ class JavaImpl implements KotlinInterface { public void setY(int value) { } } +// FILE: main/Test.java +package main; +import java.util.List; +class Test { + List f() { + throw new RuntimeException("stub"); + } +} +// FILE: TestKt.kt +package main +class TestKt { + fun f(): MutableList = TODO() +} diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt index 642e6847ba..5fe8c08316 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt @@ -16,6 +16,20 @@ class AsMemberOfProcessor : AbstractTestProcessor() { } override fun process(resolver: Resolver): List { + + listOf("main.Test", "lib.Test", "main.TestKt", "lib.TestKt").forEach { clsName -> + resolver.getClassDeclarationByName(clsName)!!.let { cls -> + val listType = cls.getAllFunctions().single {it.simpleName.asString() == "f"}.returnType!!.resolve() + val listDecl = listType.declaration as KSClassDeclaration + val iterator = listDecl.getAllFunctions().single { it.simpleName.asString() == "iterator" } + println("$clsName: ${iterator.asMemberOf(listType).returnType}") + val listIterator = resolver.getClassDeclarationByName("kotlin.collections.List")!!.getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } + println("$clsName: ${listIterator.asMemberOf(listType).returnType}") + val mutableListIterator = resolver.getClassDeclarationByName("kotlin.collections.MutableCollection")!!.getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } + println("$clsName: ${mutableListIterator.asMemberOf(listType).returnType}") + } + } + val base = resolver.getClassDeclarationByName("Base")!! val child1 = resolver.getClassDeclarationByName("Child1")!! addToResults(resolver, base, child1.asStarProjectedType()) diff --git a/test-utils/testData/api/asMemberOf.kt b/test-utils/testData/api/asMemberOf.kt index 03d5abf815..0c4e5fa74d 100644 --- a/test-utils/testData/api/asMemberOf.kt +++ b/test-utils/testData/api/asMemberOf.kt @@ -112,6 +112,21 @@ // (kotlin.Int!!) -> kotlin.Unit!! // Baz!! // END +// MODULE: lib +// FILE: Test.java +package lib; +import java.util.List; +class Test { + List f() { + throw new RuntimeException("stub"); + } +} +// FILE: TestKt.kt +package lib +class TestKt { + fun f(): MutableList = TODO() +} +// MODULE: main(lib) // FILE: Input.kt open class Base { val intType: Int = 0 @@ -197,3 +212,17 @@ class JavaImpl implements KotlinInterface { public void setY(int value) { } } + +// FILE: main/Test.java +package main; +import java.util.List; +class Test { + List f() { + throw new RuntimeException("stub"); + } +} +// FILE: TestKt.kt +package main +class TestKt { + fun f(): MutableList = TODO() +} From eba61477bc8275b97391e4ce4215923c3cbf9e78 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Fri, 4 Oct 2024 15:20:51 -0700 Subject: [PATCH 2/2] asMemberOf: substitude upper and lower bounds recursively for flexible types. --- .../devtools/ksp/impl/symbol/kotlin/util.kt | 6 +++++- kotlin-analysis-api/testData/asMemberOf.kt | 12 ++++++++++++ .../devtools/ksp/processor/AsMemberOfProcessor.kt | 15 +++++++++------ test-utils/testData/api/asMemberOf.kt | 12 ++++++++++++ 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt index 2455e19ba7..f18d357b24 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt @@ -608,7 +608,11 @@ internal fun KaValueParameterSymbol.getDefaultValue(): KaAnnotationValue? { internal fun fillInDeepSubstitutor(context: KaType, substitutorBuilder: KaSubstitutorBuilder) { val unwrappedType = when (context) { is KaClassType -> context - is KaFlexibleType -> context.lowerBound as? KaClassType ?: return + is KaFlexibleType -> { + fillInDeepSubstitutor(context.upperBound, substitutorBuilder) + fillInDeepSubstitutor(context.lowerBound, substitutorBuilder) + return + } else -> return } val parameters = unwrappedType.symbol.typeParameters diff --git a/kotlin-analysis-api/testData/asMemberOf.kt b/kotlin-analysis-api/testData/asMemberOf.kt index 80b5e92702..d334058d2f 100644 --- a/kotlin-analysis-api/testData/asMemberOf.kt +++ b/kotlin-analysis-api/testData/asMemberOf.kt @@ -18,6 +18,18 @@ // 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 +// main.TestKt: Iterator +// main.TestKt: MutableIterator +// lib.TestKt: MutableIterator +// lib.TestKt: Iterator +// lib.TestKt: MutableIterator // Child1!! // intType: kotlin.Int!! // baseTypeArg1: kotlin.Int!! diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt index 5fe8c08316..655cb5cf51 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/AsMemberOfProcessor.kt @@ -19,14 +19,17 @@ class AsMemberOfProcessor : AbstractTestProcessor() { listOf("main.Test", "lib.Test", "main.TestKt", "lib.TestKt").forEach { clsName -> resolver.getClassDeclarationByName(clsName)!!.let { cls -> - val listType = cls.getAllFunctions().single {it.simpleName.asString() == "f"}.returnType!!.resolve() + val listType = cls.getAllFunctions().single { it.simpleName.asString() == "f" }.returnType!!.resolve() val listDecl = listType.declaration as KSClassDeclaration val iterator = listDecl.getAllFunctions().single { it.simpleName.asString() == "iterator" } - println("$clsName: ${iterator.asMemberOf(listType).returnType}") - val listIterator = resolver.getClassDeclarationByName("kotlin.collections.List")!!.getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } - println("$clsName: ${listIterator.asMemberOf(listType).returnType}") - val mutableListIterator = resolver.getClassDeclarationByName("kotlin.collections.MutableCollection")!!.getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } - println("$clsName: ${mutableListIterator.asMemberOf(listType).returnType}") + results.add("$clsName: ${iterator.asMemberOf(listType).returnType}") + val listIterator = resolver.getClassDeclarationByName("kotlin.collections.List")!! + .getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } + results.add("$clsName: ${listIterator.asMemberOf(listType).returnType}") + val mutableListIterator = + resolver.getClassDeclarationByName("kotlin.collections.MutableCollection")!! + .getDeclaredFunctions().single { it.simpleName.asString() == "iterator" } + results.add("$clsName: ${mutableListIterator.asMemberOf(listType).returnType}") } } diff --git a/test-utils/testData/api/asMemberOf.kt b/test-utils/testData/api/asMemberOf.kt index 0c4e5fa74d..cd2ade6b8b 100644 --- a/test-utils/testData/api/asMemberOf.kt +++ b/test-utils/testData/api/asMemberOf.kt @@ -18,6 +18,18 @@ // 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 +// main.TestKt: Iterator +// main.TestKt: MutableIterator +// lib.TestKt: MutableIterator +// lib.TestKt: Iterator +// lib.TestKt: MutableIterator // Child1!! // intType: kotlin.Int!! // baseTypeArg1: kotlin.Int!!