From 7e2924a729a14cc2443767d402eafc67c2f90b14 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Fri, 22 Nov 2024 01:48:25 -0500 Subject: [PATCH] Handle typealias to typealias --- .../me/tatarka/inject/test/TypeAliasTest.kt | 29 +++++++++++++++++++ .../me/tatarka/inject/test/TypeAlias.kt | 28 ++++++++++++++++++ .../inject/compiler/TypeResultResolver.kt | 4 ++- .../kotlin/me/tatarka/inject/compiler/Util.kt | 12 +++++++- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 integration-tests/common-test/src/test/kotlin/me/tatarka/inject/test/TypeAliasTest.kt create mode 100644 integration-tests/common/src/main/kotlin/me/tatarka/inject/test/TypeAlias.kt diff --git a/integration-tests/common-test/src/test/kotlin/me/tatarka/inject/test/TypeAliasTest.kt b/integration-tests/common-test/src/test/kotlin/me/tatarka/inject/test/TypeAliasTest.kt new file mode 100644 index 00000000..1bd3dd74 --- /dev/null +++ b/integration-tests/common-test/src/test/kotlin/me/tatarka/inject/test/TypeAliasTest.kt @@ -0,0 +1,29 @@ +package me.tatarka.inject.test + +import assertk.assertThat +import assertk.assertions.isNotNull +import kotlin.test.Test + +class TypeAliasTest { + + @Test + fun can_generate_for_typealias_on_typealias_function() { + val component = TypeAliasesComponent::class.create() + + assertThat(component.typeAliasFoo()).isNotNull() + } + + @Test + fun can_generate_for_typealias_on_typealias_to_typealias_function() { + val component = TypeAliasesComponent::class.create() + + assertThat(component.typeAliasToTypeAliasFoo()).isNotNull() + } + + @Test + fun can_generate_for_typealias_on_typealias_to_typealias_to_typealias_function() { + val component = TypeAliasesComponent::class.create() + + assertThat(component.typeAliasToTypeAliasToTypeAliasFoo()).isNotNull() + } +} diff --git a/integration-tests/common/src/main/kotlin/me/tatarka/inject/test/TypeAlias.kt b/integration-tests/common/src/main/kotlin/me/tatarka/inject/test/TypeAlias.kt new file mode 100644 index 00000000..01fa71f9 --- /dev/null +++ b/integration-tests/common/src/main/kotlin/me/tatarka/inject/test/TypeAlias.kt @@ -0,0 +1,28 @@ +package me.tatarka.inject.test + +import me.tatarka.inject.annotations.Component +import me.tatarka.inject.annotations.Inject + +@Inject +class TypeAliasBar + +typealias TypeAliasToTypeAliasBar = TypeAliasBar +typealias TypeAliasToTypeAliasToTypeAliasBar = TypeAliasToTypeAliasBar + +@Inject +fun TypeAliasFoo( + bar: TypeAliasBar, + typeAliasToBar: TypeAliasToTypeAliasBar, + typeAliasToTypeAliasToBar: TypeAliasToTypeAliasToTypeAliasBar, +) {} +typealias TypeAliasFoo = () -> Unit + +typealias TypeAliasToTypeAliasFoo = TypeAliasFoo +typealias TypeAliasToTypeAliasToTypeAliasFoo = TypeAliasToTypeAliasFoo + +@Component +abstract class TypeAliasesComponent { + abstract fun typeAliasFoo(): TypeAliasFoo + abstract fun typeAliasToTypeAliasFoo(): TypeAliasToTypeAliasFoo + abstract fun typeAliasToTypeAliasToTypeAliasFoo(): TypeAliasToTypeAliasToTypeAliasFoo +} diff --git a/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/TypeResultResolver.kt b/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/TypeResultResolver.kt index d9a9e80a..32ad1ccf 100644 --- a/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/TypeResultResolver.kt +++ b/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/TypeResultResolver.kt @@ -382,8 +382,10 @@ class TypeResultResolver(private val provider: AstProvider, private val options: val resolveType = key.type.resolvedType() val args = resolveType.arguments.dropLast(1) if (key.type.isTypeAlias()) { + val resolvedTypeAlias = key.type.resolveToHighestTypeAlias() + // Check to see if we have a function matching the type alias - val functions = provider.findFunctions(key.type.packageName, key.type.simpleName) + val functions = provider.findFunctions(resolvedTypeAlias.packageName, resolvedTypeAlias.simpleName) val injectedFunction = functions.find { it.isInject() } if (injectedFunction != null) { return NamedFunction( diff --git a/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/Util.kt b/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/Util.kt index 7fce2a3c..842e22b4 100644 --- a/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/Util.kt +++ b/kotlin-inject-compiler/core/src/main/kotlin/me/tatarka/inject/compiler/Util.kt @@ -73,4 +73,14 @@ private fun renderTree(node: T, visitor: TreeVisitor, indent: String, isL fun AstType.isSet(): Boolean = packageName == "kotlin.collections" && simpleName == "Set" fun AstType.isMap(): Boolean = packageName == "kotlin.collections" && simpleName == "Map" fun AstType.isPair(): Boolean = packageName == "kotlin" && simpleName == "Pair" -fun AstType.isFunctionOrTypeAliasOfFunction() = isFunction() || isTypeAlias() && resolvedType().isFunction() +fun AstType.isFunctionOrTypeAliasOfFunction(): Boolean = isFunction() || isTypeAlias() && + resolvedType().isFunctionOrTypeAliasOfFunction() + +tailrec fun AstType.resolveToHighestTypeAlias(): AstType { + check(isTypeAlias()) { + "resolveToHighestTypeAlias should only be called on a typealias AstType" + } + + val resolvedType = resolvedType() + return if (resolvedType.isTypeAlias()) resolvedType.resolveToHighestTypeAlias() else this +}