Skip to content

AssistedInject sometimes fails to generate factory if the annotated factory interface extends another factory interface #5032

@arkivanov

Description

@arkivanov

Kotlin: 2.1.21
Dagger: 2.56.2
Anvil-KSP: 0.4.1
KSP: 2.1.20-2.0.1

In an api module:

interface Foo {

    interface Factory {
        fun create(dependency: Dependency): Foo
    }
}

In an impl module:

class FooImpl @AssistedInject constructor(
    @Assisted dependency: Dependency,
)  : Foo {

    @ContributesBinding(AppScope::class)
    @AssistedFactory
    interface Factory : Foo.Factory {
        override fun create(dependency: Dependency): FooImpl
    }
}

Then somewhere in the code:

@SingleIn(AppScope:class)
class MyThing @Inject constructor(
    fooFactory:  Foo.Factory,
)

This code always compiles and works locally. But the kspReleaseKotlin task often fails on CI. There are 2 possible errors, and the same build might pass when restarted.

Possible failure 1:

* What went wrong:
Execution failed for task ':app:kspReleaseKotlin'.
> A failure occurred while executing com.google.devtools.ksp.gradle.KspAAWorkerAction
   > expected one element but was: <create, create>

Possible failure 2:

e: [ksp] [com.example.Foo.Factory.create(com.example.Dependency)] Invalid return type: com.example.Foo. An assisted factory's abstract method must return a type with an @AssistedInject-annotated constructor.
e: [ksp] The @AssistedFactory-annotated type should contain a single abstract, non-default method but found multiple: [com.example.Foo.Factory.create(com.example.Dependency), com.example.FooImpl.Factory.create(com.example.Dependency)]

I think this started to happen after we updated Kotlin from 2.0.21 to 2.1.20, Dagger from 2.52 to 2.56.2 and KSP from 2.0.21-1.0.26 to 2.1.20-2.0.1.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions