From 5d34a1f14a63a256dfc3fd4e290a1280931a6c40 Mon Sep 17 00:00:00 2001 From: Egor Andreevici Date: Thu, 21 Apr 2022 17:25:18 -0400 Subject: [PATCH] Unwrap nested KSTypeAliases recursively --- .../com/squareup/kotlinpoet/ksp/ksTypes.kt | 39 +++++++++++-------- .../ksp/test/processor/TestProcessorTest.kt | 4 ++ 2 files changed, 27 insertions(+), 16 deletions(-) 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 96c6fad883..3de5a77361 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 @@ -70,25 +70,34 @@ internal fun KSType.toTypeName( } is KSTypeParameter -> typeParamResolver[decl.name.getShortName()] is KSTypeAlias -> { - val extraResolver = if (decl.typeParameters.isEmpty()) { - typeParamResolver - } else { - decl.typeParameters.toTypeParameterResolver(typeParamResolver) - } + var typeAlias: KSTypeAlias = decl + var arguments = arguments - val resolvedType = decl.type.resolve() - val mappedArgs = mapTypeArgumentsFromTypeAliasToAbbreviatedType( - typeParamResolver = typeParamResolver, - typeAlias = decl, - typeAliasTypeArguments = arguments, - abbreviatedType = resolvedType, - ) + var resolvedType: KSType + var mappedArgs: List + var extraResolver: TypeParameterResolver + while (true) { + resolvedType = typeAlias.type.resolve() + mappedArgs = mapTypeArgumentsFromTypeAliasToAbbreviatedType( + typeAlias = typeAlias, + typeAliasTypeArguments = arguments, + abbreviatedType = resolvedType, + ) + extraResolver = if (typeAlias.typeParameters.isEmpty()) { + typeParamResolver + } else { + typeAlias.typeParameters.toTypeParameterResolver(typeParamResolver) + } + + typeAlias = resolvedType.declaration as? KSTypeAlias ?: break + arguments = mappedArgs + } val abbreviatedType = resolvedType .toTypeName(extraResolver) .copy(nullable = isMarkedNullable) .rawType() - .withTypeArguments(mappedArgs) + .withTypeArguments(mappedArgs.map { it.toTypeName(typeParamResolver) }) val aliasArgs = typeArguments.map { it.toTypeName(typeParamResolver) } @@ -104,11 +113,10 @@ internal fun KSType.toTypeName( @KotlinPoetKspPreview private fun mapTypeArgumentsFromTypeAliasToAbbreviatedType( - typeParamResolver: TypeParameterResolver, typeAlias: KSTypeAlias, typeAliasTypeArguments: List, abbreviatedType: KSType, -): List { +): List { return abbreviatedType.arguments .map { typeArgument -> // Check if type argument is a reference to a typealias type parameter, and not an actual type. @@ -121,7 +129,6 @@ private fun mapTypeArgumentsFromTypeAliasToAbbreviatedType( typeArgument } } - .map { it.toTypeName(typeParamResolver) } } /** 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 e22ae003d6..5cfb657eec 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 @@ -270,6 +270,8 @@ class TestProcessorTest { typealias GenericTypeAlias = List typealias GenericMapTypeAlias = Map typealias T1Unused = Map + typealias A1 = A2 + typealias A2 = Map @ExampleAnnotation class Example { @@ -278,6 +280,7 @@ class TestProcessorTest { genericAlias: GenericTypeAlias, genericMapAlias: GenericMapTypeAlias, t1Unused: T1Unused, + a1: A1, ) { } } @@ -305,6 +308,7 @@ class TestProcessorTest { genericAlias: List, genericMapAlias: Map, t1Unused: Map, + a1: Map, ): Unit { } }