From c16ad39221030e3a08e159e2459031615a932e33 Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Wed, 12 Feb 2025 19:57:03 -0800 Subject: [PATCH] KSFunction: return type aliases if possible AA expands types by default. Luckily, the abbreviations are handily available. This change makes KSFunction behave the same as other parts that return KSType in the API. (cherry picked from commit 6b59afdc153d53d2cc8832c9306449133a70ae24) --- .../ksp/impl/symbol/kotlin/KSFunctionImpl.kt | 7 ++++--- kotlin-analysis-api/testData/typeAlias.kt | 8 ++++++++ .../devtools/ksp/processor/TypeAliasProcessor.kt | 14 ++++++++++++++ test-utils/testData/api/typeAlias.kt | 8 ++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionImpl.kt index fb10c602f2..880f77c121 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionImpl.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.typeParameters import org.jetbrains.kotlin.analysis.api.types.KaSubstitutor import org.jetbrains.kotlin.analysis.api.types.KaType +import org.jetbrains.kotlin.analysis.api.types.abbreviationOrSelf import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty import java.util.* @@ -35,11 +36,11 @@ class KSFunctionImpl @OptIn(KaExperimentalApi::class) constructor( ) : KSFunction { override val returnType: KSType? by lazy { - functionSignature.returnType.let { KSTypeImpl.getCached(it) } + functionSignature.returnType.abbreviationOrSelf.let { KSTypeImpl.getCached(it) } } override val parameterTypes: List by lazy { - functionSignature.valueParameters.map { it.returnType.let { KSTypeImpl.getCached(it) } } + functionSignature.valueParameters.map { it.returnType.abbreviationOrSelf.let { KSTypeImpl.getCached(it) } } } @OptIn(KaExperimentalApi::class) @@ -69,7 +70,7 @@ class KSFunctionImpl @OptIn(KaExperimentalApi::class) constructor( } override val extensionReceiverType: KSType? by lazy { - functionSignature.receiverType?.let { KSTypeImpl.getCached(it) } + functionSignature.receiverType?.abbreviationOrSelf?.let { KSTypeImpl.getCached(it) } } override val isError: Boolean = false diff --git a/kotlin-analysis-api/testData/typeAlias.kt b/kotlin-analysis-api/testData/typeAlias.kt index 7a9a85b218..7992e9f56b 100644 --- a/kotlin-analysis-api/testData/typeAlias.kt +++ b/kotlin-analysis-api/testData/typeAlias.kt @@ -34,6 +34,8 @@ // viewBinderProviders : Map, @JvmSuppressWildcards Provider> = (expanded) Map, Provider>> // nested1 : MyList = List = (expanded) List> // nested2 : List = (expanded) List> +// param w.o. asMemberOf: MyAlias = Foo, Baz> = (expanded) Foo, Baz> +// param with asMemberOf: MyAlias = Foo, Baz> = (expanded) Foo, Baz> // END // MODULE: module1 @@ -78,3 +80,9 @@ typealias BaseEmbedViewBinder = ViewBinder, @JvmSuppressWildcards Provider> = TODO() val nested1: MyList val nested2: List + +class Subject(val param: MyAlias) +typealias MyAlias = Foo, Baz> +class Foo +class Bar +class Baz diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/TypeAliasProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/TypeAliasProcessor.kt index 5fe13c65e0..3198d891c5 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/TypeAliasProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/TypeAliasProcessor.kt @@ -17,6 +17,7 @@ package com.google.devtools.ksp.processor +import com.google.devtools.ksp.getConstructors import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.symbol.* @@ -57,6 +58,19 @@ open class TypeAliasProcessor : AbstractTestProcessor() { } } } + + val subjectName = resolver.getKSNameFromString("Subject") + val subject = resolver.getClassDeclarationByName(subjectName)!! + val constructor = subject.getConstructors().single() + val type1 = constructor.parameters.single().type.resolve() + val type2 = constructor.asMemberOf(subject.asType(emptyList())).parameterTypes.single()!! + val type1Signatures = type1.typeAliasSignatures().joinToString(" = ") + val type2Signatures = type2.typeAliasSignatures().joinToString(" = ") + val type1Expanded = resolver.expandType(type1).toSignature() + val type2Expanded = resolver.expandType(type2).toSignature() + + results.add("param w.o. asMemberOf: $type1Signatures = (expanded) $type1Expanded") + results.add("param with asMemberOf: $type2Signatures = (expanded) $type2Expanded") return emptyList() } diff --git a/test-utils/testData/api/typeAlias.kt b/test-utils/testData/api/typeAlias.kt index d34d2bb787..e33172ff15 100644 --- a/test-utils/testData/api/typeAlias.kt +++ b/test-utils/testData/api/typeAlias.kt @@ -34,6 +34,8 @@ // viewBinderProviders : Map, @JvmSuppressWildcards Provider> = (expanded) Map, Provider>> // nested1 : MyList = List = (expanded) List> // nested2 : List = (expanded) List> +// param w.o. asMemberOf: MyAlias = Foo, Baz> = (expanded) Foo, Baz> +// param with asMemberOf: MyAlias = Foo, Baz> = (expanded) Foo, Baz> // END // MODULE: module1 @@ -79,3 +81,9 @@ typealias BaseEmbedViewBinder = ViewBinder, @JvmSuppressWildcards Provider> = TODO() val nested1: MyList val nested2: List + +class Subject(val param: MyAlias) +typealias MyAlias = Foo, Baz> +class Foo +class Bar +class Baz