package dagger.functional.kotlin import dagger.Binds import dagger.Component import dagger.Module import dagger.Provides import javax.inject.Named @Component( modules = [ TestKotlinModuleWithCompanion::class, TestKotlinModuleWithNamedCompanion::class, TestKotlinAbstractModuleWithCompanion::class, TestKotlinWorkaroundModuleWithCompanion::class, TestKotlinModuleWithPrivateCompanion::class ] ) interface TestKotlinComponentWithCompanionModule { fun getDataA(): TestDataA fun getDataB(): TestDataB fun getBoolean(): Boolean fun getStringType(): String @Named("Cat") fun getCatNamedStringType(): String @Named("Dog") fun getDogNamedStringType(): String fun getInterface(): TestInterface fun getLong(): Long fun getDouble(): Double fun getInteger(): Int } @Module class TestKotlinModuleWithCompanion { @Provides fun provideDataA() = TestDataA("test") companion object { @Provides fun provideDataB() = TestDataB("test") @Provides fun provideBoolean(): Boolean = true } } @Module class TestKotlinModuleWithNamedCompanion { @Provides @Named("Cat") fun provideNamedString() = "Cat" companion object Foo { @Provides fun provideStringType(): String = "" } } @Module abstract class TestKotlinAbstractModuleWithCompanion { @Binds abstract fun bindInterface(injectable: TestInjectable): TestInterface companion object { @Provides fun provideLong() = 4L } } @Module class TestKotlinWorkaroundModuleWithCompanion { @Provides fun provideDouble() = 1.0 @Module companion object { @Provides @JvmStatic fun provideInteger() = 2 } } @Module class TestKotlinModuleWithPrivateCompanion { @Provides @Named("Dog") fun getNamedStringType() = "Dog" private companion object { fun randomFunction() = "" } }