diff options
Diffstat (limited to 'symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt')
| -rw-r--r-- | symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt b/symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt new file mode 100644 index 0000000..028f386 --- /dev/null +++ b/symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt @@ -0,0 +1,73 @@ +package moe.nea.firmament.annotations.process + +import com.google.auto.service.AutoService +import com.google.devtools.ksp.processing.CodeGenerator +import com.google.devtools.ksp.processing.Dependencies +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.processing.SymbolProcessorEnvironment +import com.google.devtools.ksp.processing.SymbolProcessorProvider +import com.google.devtools.ksp.symbol.KSAnnotated +import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.KSFile +import com.google.devtools.ksp.symbol.KSName + +class ConfigAnnotationProcessor( + val logger: KSPLogger, val codeGenerator: CodeGenerator, val sourceSetName: String +) : SymbolProcessor { + val configs = mutableSetOf<Pair<KSName, KSFile>>() + override fun process(resolver: Resolver): List<KSAnnotated> { + resolver.getSymbolsWithAnnotation("moe.nea.firmament.util.data.Config") + .map { it as KSClassDeclaration } + .mapTo(configs) { + it.qualifiedName!! to it.containingFile!! + } + return listOf() + } + + override fun finish() { + val dependencies = Dependencies( + aggregating = true, + *configs.map { it.second }.toTypedArray() + ) + val generatedFileName = "ConfigProvider" + val compatFile = + codeGenerator.createNewFile( + dependencies, + "moe.nea.firmament.annotations.generated.$sourceSetName", + generatedFileName + ) + .bufferedWriter() + compatFile.appendLine("// This file is @generated by ConfigAnnotationProcessor") + compatFile.appendLine("// Do not edit") + compatFile.appendLine("package moe.nea.firmament.annotations.generated.$sourceSetName") + compatFile.appendLine("class $generatedFileName : moe.nea.firmament.util.data.IConfigProvider {") + compatFile.appendLine( + """ + override val configs: List<moe.nea.firmament.util.data.IDataHolder<*>> = listOf(${configs.joinToString { it.first.asString() }}) + """ + ) + compatFile.appendLine("}") + compatFile.close() + val metaInf = codeGenerator.createNewFileByPath( + dependencies, + "META-INF/services/moe.nea.firmament.util.data.IConfigProvider", extensionName = "" + ) + .bufferedWriter() + metaInf.append("moe.nea.firmament.annotations.generated.$sourceSetName.") + metaInf.appendLine(generatedFileName) + metaInf.close() + } + + @AutoService(SymbolProcessorProvider::class) + class Provider : SymbolProcessorProvider { + override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor { + return ConfigAnnotationProcessor( + environment.logger, + environment.codeGenerator, + environment.options["firmament.sourceset"] ?: "main" + ) + } + } +} |
