fix: Isolate mixins in alternative source sets

This commit is contained in:
Linnea Gräf
2025-03-18 21:40:32 +01:00
parent 40ce4f8567
commit 4c5ddd2fdd
11 changed files with 205 additions and 29 deletions

View File

@@ -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")
}
}
}

View File

@@ -32,7 +32,7 @@ class SubscribeAnnotationProcessor(
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")
@@ -40,7 +40,7 @@ class SubscribeAnnotationProcessor(
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()
@@ -65,7 +65,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()
}