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..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 @@ -531,7 +531,11 @@ private class KSAstType private constructor( return if (type.isError) { 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 87cd2336..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 @@ -1273,4 +1273,37 @@ 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 + val cProvider: () -> 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") + } + } }