Skip to content

K2 factory generation: don't unwrap generic types in IR #1120

Open
@RBusarow

Description

@RBusarow

Given this test:

compile2(
  """
  package com.squareup.test
  
  import dagger.Lazy
  import javax.inject.Inject
  import javax.inject.Provider
  
  class InjectClass @Inject constructor(
    val string: String, 
    val stringProvider: Provider<String>,
    val stringListProvider: Provider<List<String>>,
    val lazyString: Lazy<String>
  ) {
    override fun equals(other: Any?): Boolean {
      return toString() == other.toString()
    }
    override fun toString(): String {
     return string + stringProvider.get() + 
         stringListProvider.get()[0] + lazyString.get()
    }
  }
  """,
) {
  val factoryClass = classLoader.injectClass_Factory
  val staticMethods = factoryClass.declaredMethods.filter { it.isStatic }

  val factoryInstance = staticMethods.single { it.name == "create" }
    .invoke(
      null,
      Provider { "a" },
      Provider { "b" },
      Provider { listOf("c") },
      Provider { "d" },
    )
  assertThat(factoryInstance::class.java).isEqualTo(factoryClass)

  val newInstance = staticMethods.single { it.name == "newInstance" }
    .invoke(null, "a", Provider { "b" }, Provider { listOf("c") }, Lazy { "d" })
  val getInstance = (factoryInstance as Factory<*>).get()
}

The call to factoryInstant.get() will fail:

java.lang.ClassCastException: class java.lang.String cannot be cast to class javax.inject.Provider (java.lang.String is in module java.base of loader 'bootstrap'; javax.inject.Provider is in unnamed module of loader 'app')

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdagger factoryHappens when generateDaggerFactories is set to true

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions