diff --git a/processor/app/build.gradle.kts b/processor/app/build.gradle.kts index 19787c0e..2accc7e0 100644 --- a/processor/app/build.gradle.kts +++ b/processor/app/build.gradle.kts @@ -10,6 +10,7 @@ kotlin { val jvmMain by getting { dependencies { implementation(libs.ksp.processor.api) + implementation(project(":koject-core")) implementation(project(":processor:common")) } kotlin.srcDir("src/main/kotlin") diff --git a/processor/app/src/main/kotlin/com/moriatsushi/koject/processor/AppProcessorProvider.kt b/processor/app/src/main/kotlin/com/moriatsushi/koject/processor/AppProcessorProvider.kt index c164c48a..a91916ed 100644 --- a/processor/app/src/main/kotlin/com/moriatsushi/koject/processor/AppProcessorProvider.kt +++ b/processor/app/src/main/kotlin/com/moriatsushi/koject/processor/AppProcessorProvider.kt @@ -3,7 +3,9 @@ package com.moriatsushi.koject.processor import com.google.devtools.ksp.processing.SymbolProcessor import com.google.devtools.ksp.processing.SymbolProcessorEnvironment import com.google.devtools.ksp.processing.SymbolProcessorProvider +import com.moriatsushi.koject.internal.InternalKojectApi +@OptIn(InternalKojectApi::class) class AppProcessorProvider : SymbolProcessorProvider { override fun create( environment: SymbolProcessorEnvironment, diff --git a/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessor.kt b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessor.kt index 2e4aac56..8bd17df4 100644 --- a/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessor.kt +++ b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessor.kt @@ -1,6 +1,7 @@ package com.moriatsushi.koject.processor import com.google.devtools.ksp.processing.CodeGenerator +import com.google.devtools.ksp.processing.KSPLogger import com.google.devtools.ksp.processing.Resolver import com.google.devtools.ksp.processing.SymbolProcessor import com.google.devtools.ksp.symbol.KSAnnotated @@ -8,33 +9,54 @@ import com.moriatsushi.koject.processor.component.ComponentExtrasHolderGenerator import com.moriatsushi.koject.processor.container.ContainerGenerator import com.moriatsushi.koject.processor.extras.ExtrasHolderGenerator import com.moriatsushi.koject.processor.factory.FactoryGenerator +import kotlin.time.ExperimentalTime +import kotlin.time.TimeSource.Monotonic.markNow +@OptIn(ExperimentalTime::class) internal class DIProcessor( - private val shouldGenerateContainer: Boolean, + private val options: DIProcessorOptions, private val factoryGenerator: FactoryGenerator, private val extrasHolderGenerator: ExtrasHolderGenerator, private val componentExtrasHolderGenerator: ComponentExtrasHolderGenerator, private val containerGenerator: ContainerGenerator, private val codeGenerator: CodeGenerator, + private val logger: KSPLogger, ) : SymbolProcessor { private var step: Step = Step.CollectDependencies override fun process(resolver: Resolver): List { - when (step) { - Step.CollectDependencies -> { - collectDependencies(resolver) - } - Step.GenerateContainer -> { - generateContainer(resolver) - } - Step.Completed -> { - // no op + measureTime(step.name) { + when (step) { + Step.CollectDependencies -> { + collectDependencies(resolver) + } + Step.GenerateContainer -> { + generateContainer(resolver) + } + Step.Completed -> { + // no op + } } } return emptyList() } + private inline fun measureTime( + label: String, + crossinline block: () -> Unit, + ) { + if (!options.measureDuration) { + block() + return + } + + val mark = markNow() + block() + val duration = mark.elapsedNow() + logger.info("$label: $duration") + } + private fun collectDependencies(resolver: Resolver) { factoryGenerator.generate(resolver) extrasHolderGenerator.generate(resolver) @@ -49,7 +71,7 @@ internal class DIProcessor( } private fun generateContainer(resolver: Resolver) { - if (shouldGenerateContainer) { + if (options.shouldGenerateContainer) { containerGenerator.generate(resolver) } step = Step.Completed diff --git a/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorFactory.kt b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorFactory.kt index 19fea627..2e9077f3 100644 --- a/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorFactory.kt +++ b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorFactory.kt @@ -98,15 +98,16 @@ class DIProcessorFactory( } fun create( - shouldGenerateContainer: Boolean = true, + options: DIProcessorOptions = DIProcessorOptions(), ): SymbolProcessor { return DIProcessor( - shouldGenerateContainer, + options, createFactoryGenerator(), createExtrasHolderGenerator(), createComponentExtrasHolderGenerator(), createContainerGenerator(), environment.codeGenerator, + environment.logger, ) } } diff --git a/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorOptions.kt b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorOptions.kt new file mode 100644 index 00000000..ea17b422 --- /dev/null +++ b/processor/common/src/main/kotlin/com/moriatsushi/koject/processor/DIProcessorOptions.kt @@ -0,0 +1,9 @@ +package com.moriatsushi.koject.processor + +import com.moriatsushi.koject.internal.InternalKojectApi + +@InternalKojectApi +class DIProcessorOptions( + val shouldGenerateContainer: Boolean = true, + val measureDuration: Boolean = false, +) diff --git a/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/DIProcessorLibraryTest.kt b/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/DIProcessorLibraryTest.kt index 542b8194..417394fe 100644 --- a/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/DIProcessorLibraryTest.kt +++ b/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/DIProcessorLibraryTest.kt @@ -13,10 +13,14 @@ class DIProcessorLibraryTest { @get:Rule val tempFolder: TemporaryFolder = TemporaryFolder() - private val compilationFactory = KotlinCompilationFactory( - listOf(TestProcessorProvider(shouldGenerateContainer = false)), + private val provider = TestProcessorProvider( + DIProcessorOptions( + shouldGenerateContainer = false, + ), ) + private val compilationFactory = KotlinCompilationFactory(listOf(provider)) + @Test fun compile() { val folder = tempFolder.newFolder() diff --git a/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/TestProcessorProvider.kt b/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/TestProcessorProvider.kt index aa1525b1..5bcd18ac 100644 --- a/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/TestProcessorProvider.kt +++ b/processor/common/src/test/kotlin/com/moriatsushi/koject/processor/TestProcessorProvider.kt @@ -5,11 +5,11 @@ import com.google.devtools.ksp.processing.SymbolProcessorEnvironment import com.google.devtools.ksp.processing.SymbolProcessorProvider class TestProcessorProvider( - private val shouldGenerateContainer: Boolean = true, + private val options: DIProcessorOptions = DIProcessorOptions(), ) : SymbolProcessorProvider { override fun create( environment: SymbolProcessorEnvironment, ): SymbolProcessor { - return DIProcessorFactory(environment).create(shouldGenerateContainer) + return DIProcessorFactory(environment).create(options) } } diff --git a/processor/lib/build.gradle.kts b/processor/lib/build.gradle.kts index 19787c0e..2accc7e0 100644 --- a/processor/lib/build.gradle.kts +++ b/processor/lib/build.gradle.kts @@ -10,6 +10,7 @@ kotlin { val jvmMain by getting { dependencies { implementation(libs.ksp.processor.api) + implementation(project(":koject-core")) implementation(project(":processor:common")) } kotlin.srcDir("src/main/kotlin") diff --git a/processor/lib/src/main/kotlin/com/moriatsushi/koject/processor/LibProcessorProvider.kt b/processor/lib/src/main/kotlin/com/moriatsushi/koject/processor/LibProcessorProvider.kt index bc3e5b07..7a3ef420 100644 --- a/processor/lib/src/main/kotlin/com/moriatsushi/koject/processor/LibProcessorProvider.kt +++ b/processor/lib/src/main/kotlin/com/moriatsushi/koject/processor/LibProcessorProvider.kt @@ -3,13 +3,17 @@ package com.moriatsushi.koject.processor import com.google.devtools.ksp.processing.SymbolProcessor import com.google.devtools.ksp.processing.SymbolProcessorEnvironment import com.google.devtools.ksp.processing.SymbolProcessorProvider +import com.moriatsushi.koject.internal.InternalKojectApi +@OptIn(InternalKojectApi::class) class LibProcessorProvider : SymbolProcessorProvider { override fun create( environment: SymbolProcessorEnvironment, ): SymbolProcessor { // Don't generate a container class in the library module. - return DIProcessorFactory(environment) - .create(shouldGenerateContainer = false) + val options = DIProcessorOptions( + shouldGenerateContainer = false, + ) + return DIProcessorFactory(environment).create(options) } }