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 8b53347283..96c6fad883 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 @@ -77,12 +77,11 @@ internal fun KSType.toTypeName( } val resolvedType = decl.type.resolve() - val mappedArgs = mapTypeAliasArgsToAbbreviatedTypeArgs( + val mappedArgs = mapTypeArgumentsFromTypeAliasToAbbreviatedType( typeParamResolver = typeParamResolver, - typeAliasTypeParams = decl.typeParameters, - typeAliasTypeArgs = arguments, - abbreviatedTypeParams = resolvedType.declaration.typeParameters, - abbreviatedTypeArgs = resolvedType.arguments, + typeAlias = decl, + typeAliasTypeArguments = arguments, + abbreviatedType = resolvedType, ) val abbreviatedType = resolvedType @@ -104,27 +103,25 @@ internal fun KSType.toTypeName( } @KotlinPoetKspPreview -private fun mapTypeAliasArgsToAbbreviatedTypeArgs( +private fun mapTypeArgumentsFromTypeAliasToAbbreviatedType( typeParamResolver: TypeParameterResolver, - typeAliasTypeParams: List, - typeAliasTypeArgs: List, - abbreviatedTypeParams: List, - abbreviatedTypeArgs: List, + typeAlias: KSTypeAlias, + typeAliasTypeArguments: List, + abbreviatedType: KSType, ): List { - val orderedAbbreviatedTypeArgs = if (typeAliasTypeParams.size < 2) { - // egor: If there's only one type parameter, KSP might use different names for it in typealias vs abbreviated type - // (not sure why), so we'll return early - order doesn't matter when there are less than 2 parameters. - abbreviatedTypeArgs - } else { - abbreviatedTypeParams - .map { abbreviatedTypeParam -> - typeAliasTypeParams.indexOfFirst { typeAliasTypeParam -> - abbreviatedTypeParam.name.asString() == typeAliasTypeParam.name.asString() - } + return abbreviatedType.arguments + .map { typeArgument -> + // Check if type argument is a reference to a typealias type parameter, and not an actual type. + val typeAliasTypeParameterIndex = typeAlias.typeParameters.indexOfFirst { typeAliasTypeParameter -> + typeAliasTypeParameter.name.asString() == typeArgument.type.toString() } - .map(typeAliasTypeArgs::get) - } - return orderedAbbreviatedTypeArgs.map { it.toTypeName(typeParamResolver) } + if (typeAliasTypeParameterIndex >= 0) { + typeAliasTypeArguments[typeAliasTypeParameterIndex] + } else { + 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 746f9af24f..e22ae003d6 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 @@ -269,6 +269,7 @@ class TestProcessorTest { typealias TypeAliasName = String typealias GenericTypeAlias = List typealias GenericMapTypeAlias = Map + typealias T1Unused = Map @ExampleAnnotation class Example { @@ -276,6 +277,7 @@ class TestProcessorTest { aliasedName: TypeAliasName, genericAlias: GenericTypeAlias, genericMapAlias: GenericMapTypeAlias, + t1Unused: T1Unused, ) { } } @@ -302,6 +304,7 @@ class TestProcessorTest { aliasedName: String, genericAlias: List, genericMapAlias: Map, + t1Unused: Map, ): Unit { } }