Skip to content

ContributesSubcomponent.Factory validation fails when the function is overridden #1044

@jonamireh

Description

@jonamireh

It appears that after #1042, overridden abstract functions are being miscounted in regards to subcomponent factory interfaces, despite being the same function. Consider the following configuration:

//Example.kt
package com.squareup.test

import com.squareup.anvil.annotations.ContributesSubcomponent

@ContributesSubcomponent(Any::class, parentScope = Unit::class)
interface SubcomponentInterface : BaseSubcomponent {
  @ContributesSubcomponent.Factory
  interface Factory : BaseSubcomponent.Factory {
    override fun create(@BindsInstance provided: String): SubcomponentInterface
  }

  @ContributesTo(Unit::class)
  interface ParentComponent {
      fun createSubcomponentFactory(): SubcomponentInterface.Factory
  }
}

interface BaseSubcomponent {
  interface Factory {
    fun create(provided: String): BaseSubcomponent
  }
}

This works as expected on 2.5.0-beta09 but if you try to compile this on 2.5.0-beta10, you get:

e: com.squareup.anvil.compiler.api.AnvilCompilationException: Back-end (JVM) Internal error: A factory must have exactly one abstract function returning the subcomponent com.squareup.test.SubcomponentInterface
File being compiled: (09,12) in Example.kt

        at com.squareup.anvil.compiler.internal.reference.ClassReferenceKt.AnvilCompilationExceptionClassReference(ClassReference.kt:553)
        at com.squareup.anvil.compiler.internal.reference.ClassReferenceKt.AnvilCompilationExceptionClassReference$default(ClassReference.kt:548)
        at com.squareup.anvil.compiler.codegen.ContributesSubcomponentCodeGen$Embedded.checkFactory(ContributesSubcomponentCodeGen.kt:390)
        at com.squareup.anvil.compiler.codegen.ContributesSubcomponentCodeGen$Embedded.access$checkFactory(ContributesSubcomponentCodeGen.kt:244)
        at com.squareup.anvil.compiler.codegen.ContributesSubcomponentCodeGen$Embedded$generateCode$3.invoke(ContributesSubcomponentCodeGen.kt:285)
        at com.squareup.anvil.compiler.codegen.ContributesSubcomponentCodeGen$Embedded$generateCode$3.invoke(ContributesSubcomponentCodeGen.kt:284)
        at kotlin.sequences.TransformingSequence$iterator$1.next(Sequences.kt:210)
        at kotlin.sequences.SequencesKt___SequencesKt.toList(_Sequences.kt:811)
        at com.squareup.anvil.compiler.codegen.ContributesSubcomponentCodeGen$Embedded.generateCode(ContributesSubcomponentCodeGen.kt:303)
        at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.generateCode$generateAndCache(CodeGenerationExtension.kt:229)
        at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.generateCode$loopGeneration(CodeGenerationExtension.kt:255)
        at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.generateCode(CodeGenerationExtension.kt:266)
        at com.squareup.anvil.compiler.codegen.CodeGenerationExtension.analysisCompleted(CodeGenerationExtension.kt:121)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions