diff options
6 files changed, 46 insertions, 21 deletions
diff --git a/annotations/src/main/kotlin/io/github/moulberry/notenoughupdates/autosubscribe/NEUAutoSymbolProcessor.kt b/annotations/src/main/kotlin/io/github/moulberry/notenoughupdates/autosubscribe/NEUAutoSymbolProcessor.kt index 3ab71912..157749d0 100644 --- a/annotations/src/main/kotlin/io/github/moulberry/notenoughupdates/autosubscribe/NEUAutoSymbolProcessor.kt +++ b/annotations/src/main/kotlin/io/github/moulberry/notenoughupdates/autosubscribe/NEUAutoSymbolProcessor.kt @@ -28,22 +28,29 @@ import com.google.devtools.ksp.processing.SymbolProcessor import com.google.devtools.ksp.symbol.ClassKind import com.google.devtools.ksp.symbol.KSAnnotated import com.google.devtools.ksp.symbol.KSClassDeclaration +import com.google.devtools.ksp.symbol.Modifier +import com.google.devtools.ksp.validate import com.squareup.kotlinpoet.FileSpec import com.squareup.kotlinpoet.FunSpec import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy import com.squareup.kotlinpoet.TypeSpec -import com.squareup.kotlinpoet.ksp.addOriginatingKSFile +import com.squareup.kotlinpoet.asTypeName import com.squareup.kotlinpoet.ksp.toClassName import com.squareup.kotlinpoet.ksp.writeTo import java.util.function.Consumer +import java.util.function.Supplier internal class NEUAutoSymbolProcessor(val codeGenerator: CodeGenerator, val logger: KSPLogger) : SymbolProcessor { - fun collectSubscribers(elements: Sequence<KSAnnotated>): List<NEUEventSubscriber> = buildList { + fun collectSubscribers(elements: List<KSAnnotated>): List<NEUEventSubscriber> = buildList { for (element in elements) { if (element !is KSClassDeclaration) { logger.error("@NEUAutoSubscribe is only valid on class or object declarations", element) continue } + if (element.typeParameters.isNotEmpty()) { + logger.error("@NEUAutoSubscribe is not valid on generic classes", element) + continue + } val name = element.qualifiedName if (name == null) { logger.error("@NEUAutoSubscribe could not find name", element) @@ -59,13 +66,25 @@ internal class NEUAutoSymbolProcessor(val codeGenerator: CodeGenerator, val logg } if (instanceGetter != null) { val returnType = instanceGetter.returnType - // TODO: typechecking + if (returnType == null || !element.asStarProjectedType().isAssignableFrom(returnType.resolve())) { + logger.error( + "getInstance() does not have the expected return type ${element.asStarProjectedType()}", + instanceGetter + ) + continue + } add(NEUEventSubscriber(InvocationKind.GET_INSTANCE, element)) } else if (instanceVariable != null) { - // TODO: typechecking + val variableType = instanceVariable.type + if (!element.asStarProjectedType().isAssignableFrom(variableType.resolve())) { + logger.error( + "INSTANCE does not have expected type ${element.asStarProjectedType()}", + instanceVariable + ) + continue + } add(NEUEventSubscriber(InvocationKind.ACCESS_INSTANCE, element)) } else { - // TODO: typechecking add(NEUEventSubscriber(InvocationKind.DEFAULT_CONSTRUCTOR, element)) } } @@ -88,46 +107,52 @@ internal class NEUAutoSymbolProcessor(val codeGenerator: CodeGenerator, val logg val subscribers = mutableListOf<NEUEventSubscriber>() override fun process(resolver: Resolver): List<KSAnnotated> { - val candidates = resolver.getSymbolsWithAnnotation(NEUAutoSubscribe::class.qualifiedName!!) - subscribers.addAll(collectSubscribers(candidates)) - return emptyList() + val candidates = resolver.getSymbolsWithAnnotation(NEUAutoSubscribe::class.qualifiedName!!).toList() + val valid = candidates.filter { it.validate() } + val invalid = candidates.filter { !it.validate() } + + subscribers.addAll(collectSubscribers(valid)) + return invalid } override fun finish() { if (subscribers.isEmpty()) return + val deps = subscribers.mapNotNull { it.declaration.containingFile } + logger.info("Dependencies: $deps") FileSpec.builder("io.github.moulberry.notenoughupdates.autosubscribe", "AutoLoad") .addFileComment("@generated by ${NEUAutoSymbolProcessor::class.simpleName}") .addType( TypeSpec.objectBuilder("AutoLoad") .addFunction( FunSpec.builder("provide") - .addParameter("consumer", Consumer::class.parameterizedBy(Any::class)) + .addParameter( + "consumer", + Consumer::class.asTypeName() + .parameterizedBy(Supplier::class.parameterizedBy(Any::class)) + ) .apply { subscribers.sortedBy { it.declaration.simpleName.asString() }.forEach { (invocationKind, declaration) -> when (invocationKind) { InvocationKind.GET_INSTANCE -> addStatement( - "consumer.accept(%T.getInstance())", + "consumer.accept { %T.getInstance() }", declaration.toClassName() ) InvocationKind.OBJECT_INSTANCE -> addStatement( - "consumer.accept(%T)", + "consumer.accept { %T }", declaration.toClassName() ) InvocationKind.DEFAULT_CONSTRUCTOR -> addStatement( - "consumer.accept(%T())", + "consumer.accept { %T() }", declaration.toClassName() ) InvocationKind.ACCESS_INSTANCE -> addStatement( - "consumer.accept(%T.INSTANCE)", + "consumer.accept { %T.INSTANCE }", declaration.toClassName() ) } - declaration.containingFile?.let { - addOriginatingKSFile(it) - } } } .build() @@ -135,6 +160,6 @@ internal class NEUAutoSymbolProcessor(val codeGenerator: CodeGenerator, val logg .build() ) .build() - .writeTo(codeGenerator, aggregating = true) + .writeTo(codeGenerator, aggregating = true, originatingKSFiles = deps) } } diff --git a/build.gradle.kts b/build.gradle.kts index e51d082c..86e03cd6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -131,7 +131,7 @@ dependencies { "runtimeOnly"(oneconfigQuarantineSourceSet.output) // Please keep this version in sync with KotlinLoadingTweaker - implementation(enforcedPlatform("org.jetbrains.kotlin:kotlin-bom:1.7.21")) + implementation(enforcedPlatform("org.jetbrains.kotlin:kotlin-bom:1.8.0")) kotlinDependencies(kotlin("stdlib")) ksp(shadowImplementation(project(":annotations"))!!) diff --git a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java index 555c73e3..a4643eb5 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/NotEnoughUpdates.java @@ -270,7 +270,7 @@ public class NotEnoughUpdates { MinecraftForge.EVENT_BUS.register(new RenderListener(this)); MinecraftForge.EVENT_BUS.register(navigation); MinecraftForge.EVENT_BUS.register(new WorldListener(this)); - AutoLoad.INSTANCE.provide(MinecraftForge.EVENT_BUS::register); + AutoLoad.INSTANCE.provide(supplier -> MinecraftForge.EVENT_BUS.register(supplier.get())); if (Minecraft.getMinecraft().getResourceManager() instanceof IReloadableResourceManager) { IReloadableResourceManager manager = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager(); diff --git a/src/main/java/io/github/moulberry/notenoughupdates/loader/KotlinLoadingTweaker.java b/src/main/java/io/github/moulberry/notenoughupdates/loader/KotlinLoadingTweaker.java index 0c63b17d..bf4e746f 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/loader/KotlinLoadingTweaker.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/loader/KotlinLoadingTweaker.java @@ -82,7 +82,7 @@ public class KotlinLoadingTweaker implements ITweaker { * Full version format: [1, 7, 20] (1.7.20) * RC version format: [1, 7, 20, 1] (1.7.20-rc1) */ - public static final int[] BUNDLED_KOTLIN_VERSION = new int[]{1, 7, 20}; + public static final int[] BUNDLED_KOTLIN_VERSION = new int[]{1, 8, 0}; @Override public void acceptOptions(List<String> args, File gameDir, File assetsDir, String profile) { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java index ab8ea0a6..047f3c99 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalOverlay.java @@ -48,6 +48,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; + @NEUAutoSubscribe public class CrystalOverlay { private enum CrystalType { diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java index babe752b..2cbd3125 100644 --- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java +++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/MiningStuff.java @@ -46,7 +46,6 @@ import net.minecraftforge.fml.common.eventhandler.SubscribeEvent; import java.util.Map; @NEUAutoSubscribe - public class MiningStuff { private static BlockPos overlayLoc = null; private static long titaniumNotifMillis = 0; |