aboutsummaryrefslogtreecommitdiff
path: root/symbols/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'symbols/src/main')
-rw-r--r--symbols/src/main/kotlin/process/CompatMetaProcessor.kt63
-rw-r--r--symbols/src/main/kotlin/process/SubscribeAnnotationProcessor.kt21
2 files changed, 73 insertions, 11 deletions
diff --git a/symbols/src/main/kotlin/process/CompatMetaProcessor.kt b/symbols/src/main/kotlin/process/CompatMetaProcessor.kt
new file mode 100644
index 0000000..0753e4c
--- /dev/null
+++ b/symbols/src/main/kotlin/process/CompatMetaProcessor.kt
@@ -0,0 +1,63 @@
+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.KSName
+
+class CompatMetaProcessor(val logger: KSPLogger, val codeGenerator: CodeGenerator, val sourceSetName: String) :
+ SymbolProcessor {
+ override fun process(resolver: Resolver): List<KSAnnotated> {
+ val files = resolver.getAllFiles().toList()
+ val packages = files.mapTo(mutableSetOf()) { it.packageName.asString() }
+ packages.add("moe.nea.firmament.annotations.generated.$sourceSetName")
+ val compatMeta = resolver.getSymbolsWithAnnotation("moe.nea.firmament.util.compatloader.CompatMeta")
+ .singleOrNull() as KSClassDeclaration? ?: return listOf()
+ val dependencies = Dependencies(aggregating = true, *files.toTypedArray())
+ val generatedFileName = "GeneratedCompat${sourceSetName.replaceFirstChar { it.uppercaseChar() }}"
+ val compatFile =
+ codeGenerator.createNewFile(dependencies, "moe.nea.firmament.annotations.generated.$sourceSetName", generatedFileName)
+ .bufferedWriter()
+ compatFile.appendLine("// This file is @generated by SubscribeAnnotationProcessor")
+ compatFile.appendLine("// Do not edit")
+ compatFile.appendLine("package moe.nea.firmament.annotations.generated.$sourceSetName")
+ compatFile.appendLine("class $generatedFileName : moe.nea.firmament.util.compatloader.ICompatMetaGen {")
+ compatFile.appendLine("""
+ override fun owns(className: String): Boolean {
+ return moe.nea.firmament.util.compatloader.CompatHelper.isOwnedByPackage(className, ${
+ packages.joinToString { "\"" + it + "\"" }
+ })
+ }
+
+ override val meta: moe.nea.firmament.util.compatloader.ICompatMeta
+ get() = ${compatMeta.qualifiedName!!.asString()}
+""")
+ compatFile.appendLine("}")
+ compatFile.close()
+ val metaInf = codeGenerator.createNewFileByPath(
+ dependencies,
+ "META-INF/services/moe.nea.firmament.util.compatloader.ICompatMetaGen", extensionName = "")
+ .bufferedWriter()
+ metaInf.append("moe.nea.firmament.annotations.generated.$sourceSetName.")
+ metaInf.appendLine(generatedFileName)
+ metaInf.close()
+ return listOf()
+ }
+
+
+ @AutoService(SymbolProcessorProvider::class)
+ class Provider : SymbolProcessorProvider {
+ override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
+ return CompatMetaProcessor(environment.logger,
+ environment.codeGenerator,
+ environment.options["firmament.sourceset"] ?: "main")
+ }
+ }
+}
diff --git a/symbols/src/main/kotlin/process/SubscribeAnnotationProcessor.kt b/symbols/src/main/kotlin/process/SubscribeAnnotationProcessor.kt
index d7aaf28..3eaf3d6 100644
--- a/symbols/src/main/kotlin/process/SubscribeAnnotationProcessor.kt
+++ b/symbols/src/main/kotlin/process/SubscribeAnnotationProcessor.kt
@@ -25,22 +25,19 @@ class SubscribeAnnotationProcessor(
override fun finish() {
subscriptions.sort()
if (subscriptions.isEmpty()) return
- val subscriptionSet = subscriptions.mapTo(mutableSetOf()) { it.parent.containingFile!! }
+ val subscriptionSet = subscriptions.mapTo(mutableSetOf()) { it.cf }
val dependencies = Dependencies(
aggregating = true,
*subscriptionSet.toTypedArray())
val generatedFileName = "AllSubscriptions${sourceSetName.replaceFirstChar { it.uppercaseChar() }}"
val subscriptionsFile =
codeGenerator
- .createNewFile(dependencies, "moe.nea.firmament.annotations.generated", generatedFileName)
+ .createNewFile(dependencies, "moe.nea.firmament.annotations.generated.$sourceSetName", generatedFileName)
.bufferedWriter()
subscriptionsFile.apply {
appendLine("// This file is @generated by SubscribeAnnotationProcessor")
appendLine("// Do not edit")
- for (file in subscriptionSet) {
- appendLine("// Dependency: ${file.filePath}")
- }
- appendLine("package moe.nea.firmament.annotations.generated")
+ appendLine("package moe.nea.firmament.annotations.generated.$sourceSetName")
appendLine()
appendLine("import moe.nea.firmament.events.subscription.*")
appendLine()
@@ -48,7 +45,7 @@ class SubscribeAnnotationProcessor(
appendLine("class $generatedFileName : SubscriptionList {")
appendLine(" override fun provideSubscriptions(addSubscription: (Subscription<*>) -> Unit) {")
for (subscription in subscriptions) {
- val owner = subscription.parent.qualifiedName!!.asString()
+ val owner = subscription.pQName.asString()
val method = subscription.child.simpleName.asString()
val type = subscription.type.declaration.qualifiedName!!.asString()
appendLine(" addSubscription(Subscription<$type>(")
@@ -65,7 +62,7 @@ class SubscribeAnnotationProcessor(
dependencies,
"META-INF/services/moe.nea.firmament.events.subscription.SubscriptionList", extensionName = "")
.bufferedWriter()
- metaInf.append("moe.nea.firmament.annotations.generated.")
+ metaInf.append("moe.nea.firmament.annotations.generated.$sourceSetName.")
metaInf.appendLine(generatedFileName)
metaInf.close()
}
@@ -75,13 +72,15 @@ class SubscribeAnnotationProcessor(
val child: KSFunctionDeclaration,
val type: KSType,
) : Comparable<Subscription> {
+ val cf = parent.containingFile!!
+ val pQName = parent.qualifiedName!!
+ val tName = type.declaration.qualifiedName!!
override fun compareTo(other: Subscription): Int {
- var compare = parent.qualifiedName!!.asString().compareTo(other.parent.qualifiedName!!.asString())
+ var compare = pQName.asString().compareTo(other.pQName.asString())
if (compare != 0) return compare
compare = other.child.simpleName.asString().compareTo(child.simpleName.asString())
if (compare != 0) return compare
- compare = other.type.declaration.qualifiedName!!.asString()
- .compareTo(type.declaration.qualifiedName!!.asString())
+ compare = other.tName.asString().compareTo(tName.asString())
if (compare != 0) return compare
return 0
}