Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion compiler/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,9 @@ dependencies {

testFixturesApi(libs.bundles.jvmTesting)
testFixturesApi(libs.dagger)
testFixturesApi(libs.dagger.compiler)
testFixturesApi(libs.dagger.hilt.core)
testFixturesApi(libs.dagger.hilt.compiler)
testFixturesApi(libs.bundles.compileTesting)
testFixturesApi(projects.compiler.common)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ class HiltKotlinModuleBuilder private constructor(
bindings.isNotEmpty() ->
TypeSpec.classBuilder(info.moduleName)
.addModifiers(KModifier.ABSTRACT)
.primaryConstructor(FunSpec.constructorBuilder().addModifiers(KModifier.PRIVATE).build())
.addFunctions(bindings)
.applyIf(providers.isNotEmpty()) {
addType(
Expand Down Expand Up @@ -189,4 +188,4 @@ private fun Parameter<TypeName, AnnotationSpec>.asParameterName(): String =
asParameterName { rawType().simpleName }

private fun Parameter<TypeName, AnnotationSpec>.asTypeName(): TypeName =
asTypeName { rawType, arguments -> rawType.asClassName().parameterizedBy(arguments) }
asTypeName { rawType, arguments -> rawType.asClassName().parameterizedBy(arguments) }
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
package se.ansman.dagger.auto.compiler

import com.tschuchort.compiletesting.KotlinCompilation
import com.tschuchort.compiletesting.SourceFile
import dagger.hilt.processor.internal.root.ComponentTreeDepsProcessor
import dagger.internal.codegen.ComponentProcessor
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.io.TempDir
import java.io.File
import java.io.OutputStream
import kotlin.test.assertEquals

@OptIn(ExperimentalCompilerApi::class)
class HiltRootValidationTest {
@TempDir
lateinit var tempDirectory: File

@Test
fun `generated AutoBind module with default constructor passes Hilt root module validation`() {
val result = KotlinCompilation()
.apply {
workingDir = tempDirectory
inheritClassPath = true
messageOutputStream = OutputStream.nullOutputStream()
sources = hiltRootSources() + generatedAutoBindModule()
annotationProcessors = listOf(ComponentTreeDepsProcessor(), ComponentProcessor())
kaptArgs = mutableMapOf("dagger.hilt.internal.useAggregatingRootProcessor" to "true")
}
.compile()

assertEquals(KotlinCompilation.ExitCode.OK, result.exitCode, result.messages)
}

private fun hiltRootSources(): List<SourceFile> =
listOf(
SourceFile.kotlin(
name = "Application.kt",
contents = """
package android.app

open class Application
"""
),
SourceFile.kotlin(
name = "HiltAndroidApp.kt",
contents = """
package dagger.hilt.android

import kotlin.reflect.KClass

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.RUNTIME)
annotation class HiltAndroidApp(val value: KClass<*> = Void::class)
"""
),
SourceFile.kotlin(
name = "AggregatedRoot.kt",
contents = """
package dagger.hilt.internal.aggregatedroot

import kotlin.reflect.KClass

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class AggregatedRoot(
val root: String,
val rootPackage: String,
val rootSimpleNames: Array<String>,
val originatingRoot: String,
val originatingRootPackage: String,
val originatingRootSimpleNames: Array<String>,
val rootAnnotation: KClass<*>,
val rootComponentPackage: String = "",
val rootComponentSimpleNames: Array<String> = [],
)
"""
),
SourceFile.kotlin(
name = "ComponentTreeDeps.kt",
contents = """
package dagger.hilt.internal.componenttreedeps

import kotlin.reflect.KClass

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.BINARY)
annotation class ComponentTreeDeps(
val rootDeps: Array<KClass<*>> = [],
val defineComponentDeps: Array<KClass<*>> = [],
val aliasOfDeps: Array<KClass<*>> = [],
val aggregatedDeps: Array<KClass<*>> = [],
val uninstallModulesDeps: Array<KClass<*>> = [],
val earlyEntryPointDeps: Array<KClass<*>> = [],
)
"""
),
SourceFile.kotlin(
name = "TestApplication.kt",
contents = """
package se.ansman

@dagger.hilt.android.HiltAndroidApp(Hilt_TestApplication::class)
class TestApplication : Hilt_TestApplication()

open class Hilt_TestApplication : android.app.Application()

interface RecordHandler<Result, Command>

class CreateRecord {
class Result
}

class CreateRecordHandler @javax.inject.Inject constructor() :
RecordHandler<CreateRecord.Result, CreateRecord>
"""
),
SourceFile.java(
name = "AggregatedRootMetadata.java",
contents = """
package dagger.hilt.internal.aggregatedroot;

@AggregatedRoot(
root = "se.ansman.TestApplication",
rootPackage = "se.ansman",
rootSimpleNames = "TestApplication",
originatingRoot = "se.ansman.TestApplication",
originatingRootPackage = "se.ansman",
originatingRootSimpleNames = "TestApplication",
rootAnnotation = dagger.hilt.android.HiltAndroidApp.class,
rootComponentPackage = "dagger.hilt.components",
rootComponentSimpleNames = "SingletonComponent"
)
public final class AggregatedRootMetadata {}
"""
),
SourceFile.java(
name = "AggregatedDepsMetadata.java",
contents = """
package hilt_aggregated_deps;

@dagger.hilt.processor.internal.aggregateddeps.AggregatedDeps(
components = "dagger.hilt.components.SingletonComponent",
modules = "se.ansman.AutoBindCreateRecordHandlerSingletonModule"
)
public final class AggregatedDepsMetadata {}
"""
),
SourceFile.java(
name = "TestApplication_ComponentTreeDeps.java",
contents = """
package se.ansman;

@dagger.hilt.internal.componenttreedeps.ComponentTreeDeps(
rootDeps = dagger.hilt.internal.aggregatedroot.AggregatedRootMetadata.class,
defineComponentDeps =
dagger.hilt.processor.internal.definecomponent.codegen._dagger_hilt_components_SingletonComponent.class,
aggregatedDeps = hilt_aggregated_deps.AggregatedDepsMetadata.class
)
public final class TestApplication_ComponentTreeDeps {}
"""
)
)

private fun generatedAutoBindModule(): SourceFile =
SourceFile.kotlin(
name = "AutoBindCreateRecordHandlerSingletonModule.kt",
contents = """
// Code generated by Auto Dagger. Do not edit.
package se.ansman

import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.codegen.OriginatingElement
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
import javax.annotation.processing.Generated

@Generated("se.ansman.dagger.auto.compiler.autobind.AutoBindProcessor")
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = CreateRecordHandler::class)
public abstract class AutoBindCreateRecordHandlerSingletonModule {
@Binds
@IntoMap
@ClassKey(CreateRecord::class)
public abstract fun bindCreateRecordHandlerAsRecordHandlerIntoMap(
createRecordHandler: CreateRecordHandler
): RecordHandler<CreateRecord.Result, CreateRecord>
}
"""
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import kotlin.String
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoBindRealRepositorySingletonModule private constructor() {
public abstract class AutoBindRealRepositorySingletonModule {
@Binds
public abstract fun bindRealRepositoryAsRepositoryOfString(realRepository: RealRepository): Repository<String>
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoBindRealRepositorySingletonModule private constructor() {
public abstract class AutoBindRealRepositorySingletonModule {
@Binds
public abstract fun bindRealRepositoryAsRepository(realRepository: RealRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(ActivityComponent::class)
@OriginatingElement(topLevelClass = ActivityRepository::class)
public abstract class AutoBindActivityRepositoryActivityModule private constructor() {
public abstract class AutoBindActivityRepositoryActivityModule {
@Binds
public abstract fun bindActivityRepositoryAsRepository(activityRepository: ActivityRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(FragmentComponent::class)
@OriginatingElement(topLevelClass = FragmentRepository::class)
public abstract class AutoBindFragmentRepositoryFragmentModule private constructor() {
public abstract class AutoBindFragmentRepositoryFragmentModule {
@Binds
public abstract fun bindFragmentRepositoryAsRepository(fragmentRepository: FragmentRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = GlobalRepository::class)
public abstract class AutoBindGlobalRepositorySingletonModule private constructor() {
public abstract class AutoBindGlobalRepositorySingletonModule {
@Binds
public abstract fun bindGlobalRepositoryAsRepository(globalRepository: GlobalRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(MyComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoBindRealRepositoryMyModule private constructor() {
public abstract class AutoBindRealRepositoryMyModule {
@Binds
public abstract fun bindRealRepositoryAsRepository(realRepository: RealRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(FragmentComponent::class)
@OriginatingElement(topLevelClass = RealFragmentHelper::class)
public abstract class AutoBindRealFragmentHelperFragmentModule private constructor() {
public abstract class AutoBindRealFragmentHelperFragmentModule {
@Binds
public abstract fun bindRealFragmentHelperAsFragmentHelper(realFragmentHelper: RealFragmentHelper): FragmentHelper
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoBindRealRepositorySingletonModule private constructor() {
public abstract class AutoBindRealRepositorySingletonModule {
@Binds
public abstract fun bindRealRepositoryAsRepository(realRepository: RealRepository): Repository
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import se.ansman.dagger.auto.Initializable
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoInitializeRealRepositoryModule private constructor() {
public abstract class AutoInitializeRealRepositoryModule {
@Binds
@IntoSet
public abstract fun bindRealRepositoryAsInitializable(realRepository: RealRepository): Initializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = RealRepository::class)
public abstract class AutoBindRealRepositorySingletonModule private constructor() {
public abstract class AutoBindRealRepositorySingletonModule {
@Binds
internal abstract fun bindRealRepositoryAsRepository(realRepository: RealRepository): Repository
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = Repository::class)
public abstract class AutoBindRepositorySingletonModule private constructor() {
public abstract class AutoBindRepositorySingletonModule {
@Binds
@IntoMap
@StringKey(`value` = "test")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = SomeResource::class)
public abstract class AutoBindSomeResourceSingletonModule private constructor() {
public abstract class AutoBindSomeResourceSingletonModule {
@Binds
@IntoMap
@StringKey(`value` = "test")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import kotlin.Boolean
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = BooleanProvider::class)
public abstract class AutoBindBooleanProviderSingletonModule private constructor() {
public abstract class AutoBindBooleanProviderSingletonModule {
@Binds
@IntoSet
public abstract fun bindBooleanProviderAsCallableOfBooleanIntoSet(booleanProvider: BooleanProvider): Callable<Boolean>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import kotlin.Int
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = IntProvider::class)
public abstract class AutoBindIntProviderSingletonModule private constructor() {
public abstract class AutoBindIntProviderSingletonModule {
@Binds
@IntoSet
public abstract fun bindIntProviderAsCallableOfIntIntoSet(intProvider: IntProvider): Callable<Int>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = StringProvider::class)
public abstract class AutoBindStringProviderSingletonModule private constructor() {
public abstract class AutoBindStringProviderSingletonModule {
@Binds
@IntoSet
public abstract fun bindStringProviderAsCallableOfStarIntoSet(stringProvider: StringProvider): Callable<*>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = Repository::class)
public abstract class AutoBindRepositorySingletonModule private constructor() {
public abstract class AutoBindRepositorySingletonModule {
@Binds
@IntoSet
public abstract fun bindRepositoryAsCloseableIntoSet(repository: Repository): Closeable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import javax.`annotation`.processing.Generated
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = SomeResource::class)
public abstract class AutoBindSomeResourceSingletonModule private constructor() {
public abstract class AutoBindSomeResourceSingletonModule {
@Binds
@IntoSet
public abstract fun bindSomeResourceAsResourceOfStarIntoSet(someResource: SomeResource): Resource<*>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import kotlin.Boolean
@Module
@InstallIn(SingletonComponent::class)
@OriginatingElement(topLevelClass = BooleanProvider::class)
public abstract class AutoBindBooleanProviderSingletonModule private constructor() {
public abstract class AutoBindBooleanProviderSingletonModule {
@Binds
@IntoSet
public abstract fun bindBooleanProviderAsCallableOfBooleanIntoSet(booleanProvider: BooleanProvider): Callable<Boolean>
Expand Down
Loading
Loading