Skip to content

Commit

Permalink
Merge pull request #159 from mori-atsushi/performance
Browse files Browse the repository at this point in the history
[processor] Make it possible to measure processor processing time
  • Loading branch information
mori-atsushi authored Mar 13, 2023
2 parents 9001974 + 52e698f commit d7d95a5
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 19 deletions.
1 change: 1 addition & 0 deletions processor/app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,40 +1,62 @@
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
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<KSAnnotated> {
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)
Expand All @@ -49,7 +71,7 @@ internal class DIProcessor(
}

private fun generateContainer(resolver: Resolver) {
if (shouldGenerateContainer) {
if (options.shouldGenerateContainer) {
containerGenerator.generate(resolver)
}
step = Step.Completed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
)
}
}
Original file line number Diff line number Diff line change
@@ -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,
)
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
1 change: 1 addition & 0 deletions processor/lib/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}

0 comments on commit d7d95a5

Please sign in to comment.