TraceLog/compiler-plugin/src/main/kotlin/dev/msfjarvis/tracelog/compiler/plugin/TracingCommandLineProcessor.kt

63 lines
2.1 KiB
Kotlin

package dev.msfjarvis.tracelog.compiler.plugin
import com.google.auto.service.AutoService
import dev.msfjarvis.tracelog.ArtifactInfo
import org.jetbrains.kotlin.compiler.plugin.AbstractCliOption
import org.jetbrains.kotlin.compiler.plugin.CliOption
import org.jetbrains.kotlin.compiler.plugin.CommandLineProcessor
import org.jetbrains.kotlin.compiler.plugin.ExperimentalCompilerApi
import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.CompilerConfigurationKey
internal val ANNOTATION_NAME =
CompilerConfigurationKey<String>(
"Annotation that the compiler plugin looks up to determine which methods need to be transformed"
)
internal val LOGGER_FUNCTION =
CompilerConfigurationKey<String>(
"Logger function invoked to dump function metadata. Must have a single parameter of type `Any?`"
)
@OptIn(ExperimentalCompilerApi::class)
@AutoService(CommandLineProcessor::class)
public class TracingCommandLineProcessor : CommandLineProcessor {
internal companion object {
val OPTION_ANNOTATION_NAME =
CliOption(
optionName = "debugAnnotation",
valueDescription = ArtifactInfo.DEFAULT_TRACELOG_ANNOTATION,
description = ANNOTATION_NAME.toString(),
required = true,
allowMultipleOccurrences = false,
)
val OPTION_LOGGER_FUNCTION =
CliOption(
optionName = "loggerFunction",
valueDescription = "kotlin.io.println",
description = LOGGER_FUNCTION.toString(),
required = false,
allowMultipleOccurrences = false
)
}
override val pluginId: String = "dev.msfjarvis.tracelog"
override val pluginOptions: Collection<AbstractCliOption> =
listOf(
OPTION_ANNOTATION_NAME,
OPTION_LOGGER_FUNCTION,
)
override fun processOption(
option: AbstractCliOption,
value: String,
configuration: CompilerConfiguration,
) {
when (option.optionName) {
OPTION_LOGGER_FUNCTION.optionName -> configuration.put(LOGGER_FUNCTION, value)
OPTION_ANNOTATION_NAME.optionName -> configuration.put(ANNOTATION_NAME, value)
else -> super.processOption(option, value, configuration)
}
}
}