From c7fe08fd0ba7010d3ca4233f4078185cf5cfad6c Mon Sep 17 00:00:00 2001 From: Anton Duyun Date: Fri, 28 Apr 2023 19:52:56 +0300 Subject: [PATCH] KSType.toTypeName fixed to work with aliased types (#1534) * KSType.toTypeName fixed to work with aliased types resolves #1513 * test fixed * imports fixed * test case * import fix * imports fix * Simplify test + fix formatting/style issues --------- Co-authored-by: Zac Sweers --- .editorconfig | 1 + .../com/squareup/kotlinpoet/ksp/KsTypes.kt | 2 +- .../ksp/test/processor/TestProcessor.kt | 22 +++++++--- .../ksp/test/processor/KsTypesTest.kt | 2 +- .../ksp/test/processor/TestProcessorTest.kt | 40 +++++++++++++++++++ 5 files changed, 60 insertions(+), 7 deletions(-) diff --git a/.editorconfig b/.editorconfig index 3ac566130f..f69b685ddb 100644 --- a/.editorconfig +++ b/.editorconfig @@ -10,3 +10,4 @@ insert_final_newline = true ij_kotlin_imports_layout = * ij_kotlin_allow_trailing_comma = true ij_kotlin_allow_trailing_comma_on_call_site = true +ij_kotlin_name_count_to_use_star_import = 99999 \ No newline at end of file diff --git a/interop/ksp/src/main/kotlin/com/squareup/kotlinpoet/ksp/KsTypes.kt b/interop/ksp/src/main/kotlin/com/squareup/kotlinpoet/ksp/KsTypes.kt index a034fb62eb..8d072201e5 100644 --- a/interop/ksp/src/main/kotlin/com/squareup/kotlinpoet/ksp/KsTypes.kt +++ b/interop/ksp/src/main/kotlin/com/squareup/kotlinpoet/ksp/KsTypes.kt @@ -52,7 +52,7 @@ public fun KSType.toClassName(): ClassName { */ public fun KSType.toTypeName( typeParamResolver: TypeParameterResolver = TypeParameterResolver.EMPTY, -): TypeName = toTypeName(typeParamResolver, emptyList()) +): TypeName = toTypeName(typeParamResolver, arguments) internal fun KSType.toTypeName( typeParamResolver: TypeParameterResolver, diff --git a/interop/ksp/test-processor/src/main/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessor.kt b/interop/ksp/test-processor/src/main/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessor.kt index 036a64b6b2..83726028c4 100644 --- a/interop/ksp/test-processor/src/main/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessor.kt +++ b/interop/ksp/test-processor/src/main/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessor.kt @@ -25,12 +25,15 @@ import com.google.devtools.ksp.processing.SymbolProcessorEnvironment import com.google.devtools.ksp.symbol.ClassKind import com.google.devtools.ksp.symbol.KSAnnotated import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSTypeReference import com.squareup.kotlinpoet.ANY import com.squareup.kotlinpoet.FileSpec import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.ParameterSpec import com.squareup.kotlinpoet.PropertySpec +import com.squareup.kotlinpoet.TypeName import com.squareup.kotlinpoet.TypeSpec +import com.squareup.kotlinpoet.ksp.TypeParameterResolver import com.squareup.kotlinpoet.ksp.addOriginatingKSFile import com.squareup.kotlinpoet.ksp.kspDependencies import com.squareup.kotlinpoet.ksp.originatingKSFiles @@ -55,6 +58,15 @@ class TestProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcess return emptyList() } + private fun KSTypeReference.toValidatedTypeName(resolver: TypeParameterResolver): TypeName { + // Validates that both toTypeName() and resolve() return the same TypeName. + // Regression for https://github.com/square/kotlinpoet/issues/1513. + val typeName = toTypeName(resolver) + val resolvedTypeName = resolve().toTypeName(resolver) + check(typeName == resolvedTypeName) + return typeName + } + private fun process(decl: KSAnnotated) { check(decl is KSClassDeclaration) @@ -84,13 +96,13 @@ class TestProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcess } superclassReference?.let { - val typeName = it.toTypeName(decl.typeParameters.toTypeParameterResolver()) + val typeName = it.toValidatedTypeName(decl.typeParameters.toTypeParameterResolver()) if (typeName != ANY) { superclass(typeName) } } addSuperinterfaces( - superInterfaces.map { it.toTypeName(decl.typeParameters.toTypeParameterResolver()) } + superInterfaces.map { it.toValidatedTypeName(decl.typeParameters.toTypeParameterResolver()) } .filterNot { it == ANY } .toList(), ) @@ -113,7 +125,7 @@ class TestProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcess classBuilder.addProperty( PropertySpec.builder( property.simpleName.getShortName(), - property.type.toTypeName(classTypeParams).let { + property.type.toValidatedTypeName(classTypeParams).let { if (unwrapTypeAliases) { it.unwrapTypeAlias() } else { @@ -158,7 +170,7 @@ class TestProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcess ) .addParameters( function.parameters.map { parameter -> - val parameterType = parameter.type.toTypeName(functionTypeParams).let { + val parameterType = parameter.type.toValidatedTypeName(functionTypeParams).let { if (unwrapTypeAliases) { it.unwrapTypeAlias() } else { @@ -171,7 +183,7 @@ class TestProcessor(private val env: SymbolProcessorEnvironment) : SymbolProcess }, ) .returns( - function.returnType!!.toTypeName(functionTypeParams).let { + function.returnType!!.toValidatedTypeName(functionTypeParams).let { if (unwrapTypeAliases) { it.unwrapTypeAlias() } else { diff --git a/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/KsTypesTest.kt b/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/KsTypesTest.kt index b392f374ce..8da749db96 100644 --- a/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/KsTypesTest.kt +++ b/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/KsTypesTest.kt @@ -36,7 +36,7 @@ class KsTypesTest { override val annotations: Sequence get() = throw NotImplementedError() override val arguments: List - get() = throw NotImplementedError() + get() = emptyList() override val declaration: KSDeclaration get() = throw NotImplementedError() override val isFunctionType: Boolean diff --git a/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessorTest.kt b/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessorTest.kt index d17f229d98..ce2df8c4ec 100644 --- a/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessorTest.kt +++ b/interop/ksp/test-processor/src/test/kotlin/com/squareup/kotlinpoet/ksp/test/processor/TestProcessorTest.kt @@ -595,6 +595,46 @@ class TestProcessorTest { ) } + @Test + fun regression_1304_with_type_parameters() { + val compilation = prepareCompilation( + kotlin( + "Example.kt", + """ + package test + + import com.squareup.kotlinpoet.ksp.test.processor.ExampleAnnotation + + interface Flow + typealias LeAlias = Flow + + @ExampleAnnotation + class RealRepository { + lateinit var prop: LeAlias + } + """, + ), + ) + + val result = compilation.compile() + assertThat(result.exitCode).isEqualTo(KotlinCompilation.ExitCode.OK) + val generatedFileText = File(compilation.kspSourcesDir, "kotlin/test/TestRealRepository.kt") + .readText() + + assertThat(generatedFileText).isEqualTo( + """ + package test + + import kotlin.String + + public class RealRepository { + public lateinit var prop: LeAlias + } + + """.trimIndent(), + ) + } + private fun prepareCompilation(vararg sourceFiles: SourceFile): KotlinCompilation { return KotlinCompilation() .apply {