aboutsummaryrefslogtreecommitdiff
path: root/symbols/src/main/kotlin/process/ConfigAnnotationProcessor.kt
blob: 028f38638ca44f1e21d1febb21719ab3af4787c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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"
			)
		}
	}
}