From e72dd9b6a6ebf3efbc67a02027f6de6dc9289e13 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Tue, 27 Aug 2024 03:29:39 -0400 Subject: [PATCH 1/3] Don't crash if the root of a trace is a TypeParameter --- .../kotlin/me/tatarka/kotlin/ast/KSAst.kt | 3 ++ .../me/tatarka/inject/test/FailureTest.kt | 32 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt index 6ae4086f..db7fe0ba 100644 --- a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt +++ b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt @@ -21,6 +21,7 @@ import com.google.devtools.ksp.symbol.KSFunctionDeclaration import com.google.devtools.ksp.symbol.KSPropertyDeclaration import com.google.devtools.ksp.symbol.KSType import com.google.devtools.ksp.symbol.KSTypeAlias +import com.google.devtools.ksp.symbol.KSTypeParameter import com.google.devtools.ksp.symbol.KSTypeReference import com.google.devtools.ksp.symbol.KSValueParameter import com.google.devtools.ksp.symbol.Modifier @@ -530,6 +531,8 @@ private class KSAstType private constructor( // we check for error first because KotlinPoet will throw an exception return if (type.isError) { typeRef.toString() + } else if (type.declaration is KSTypeParameter) { + typeRef.toString() } else { typeRef.toTypeName().toString() }.shortenPackage() diff --git a/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt b/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt index 87cd2336..1441fb9c 100644 --- a/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt +++ b/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt @@ -1273,4 +1273,36 @@ class FailureTest { contains("Qualifier: @MyQualifier can only be applied to the outer type") } } + + @ParameterizedTest + @EnumSource(Target::class) + fun fails_if_cannot_find_inject_or_provider_and_root_is_a_type_parameter(target: Target) { + val projectCompiler = ProjectCompiler(target, workingDir) + + assertFailure { + projectCompiler.source( + "MyComponent.kt", + """ + import me.tatarka.inject.annotations.Component + import me.tatarka.inject.annotations.Inject + import me.tatarka.inject.annotations.Provides + + class Foo + + @Inject class Bar(val foo: Foo) + + interface DestinationComponent { + val c: C + } + + @Inject class CType(val bar: Bar) + + @Component + abstract class FooBarComponent : DestinationComponent + """.trimIndent() + ).compile() + }.output().all { + contains("e: [ksp] Cannot find an @Inject constructor or provider for: Foo") + } + } } From a311d3d81331d7bc345e5ce058ef47e760fb6527 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Tue, 10 Sep 2024 19:16:12 -0400 Subject: [PATCH 2/3] Catch errors instead of checking for KSTypeParameter --- ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt | 9 ++++++--- .../test/kotlin/me/tatarka/inject/test/FailureTest.kt | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt index db7fe0ba..501a450c 100644 --- a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt +++ b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt @@ -531,10 +531,13 @@ private class KSAstType private constructor( // we check for error first because KotlinPoet will throw an exception return if (type.isError) { typeRef.toString() - } else if (type.declaration is KSTypeParameter) { - typeRef.toString() } else { - typeRef.toTypeName().toString() + try { + typeRef.toTypeName().toString() + } + catch (_: Throwable) { + typeRef.toString() + } }.shortenPackage() } diff --git a/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt b/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt index 1441fb9c..faab527d 100644 --- a/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt +++ b/kotlin-inject-compiler/test/src/test/kotlin/me/tatarka/inject/test/FailureTest.kt @@ -1293,6 +1293,7 @@ class FailureTest { interface DestinationComponent { val c: C + val cProvider: () -> C } @Inject class CType(val bar: Bar) From 4eb58db23a0a6420888de2578d68772f70f695d8 Mon Sep 17 00:00:00 2001 From: Eliezer Graber Date: Tue, 10 Sep 2024 19:35:48 -0400 Subject: [PATCH 3/3] Fix detekt violations --- ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt index 501a450c..d3885ad0 100644 --- a/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt +++ b/ast/ksp/src/main/kotlin/me/tatarka/kotlin/ast/KSAst.kt @@ -21,7 +21,6 @@ import com.google.devtools.ksp.symbol.KSFunctionDeclaration import com.google.devtools.ksp.symbol.KSPropertyDeclaration import com.google.devtools.ksp.symbol.KSType import com.google.devtools.ksp.symbol.KSTypeAlias -import com.google.devtools.ksp.symbol.KSTypeParameter import com.google.devtools.ksp.symbol.KSTypeReference import com.google.devtools.ksp.symbol.KSValueParameter import com.google.devtools.ksp.symbol.Modifier @@ -534,8 +533,7 @@ private class KSAstType private constructor( } else { try { typeRef.toTypeName().toString() - } - catch (_: Throwable) { + } catch (_: Throwable) { typeRef.toString() } }.shortenPackage()