diff --git a/src/main/java/dev/su5ed/sinytra/connector/transformer/MixinPatchTransformer.java b/src/main/java/dev/su5ed/sinytra/connector/transformer/MixinPatchTransformer.java index 82871ce1..8f1b010a 100644 --- a/src/main/java/dev/su5ed/sinytra/connector/transformer/MixinPatchTransformer.java +++ b/src/main/java/dev/su5ed/sinytra/connector/transformer/MixinPatchTransformer.java @@ -8,11 +8,19 @@ import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.logging.LogUtils; +import dev.su5ed.sinytra.connector.ConnectorUtil; +import dev.su5ed.sinytra.connector.transformer.patch.EnvironmentStripperTransformer; +import net.minecraftforge.fart.api.Transformer; +import net.minecraftforge.forgespi.locating.IModFile; +import org.objectweb.asm.ClassReader; +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.tree.AnnotationNode; +import org.objectweb.asm.tree.ClassNode; import org.sinytra.adapter.patch.LVTOffsets; import org.sinytra.adapter.patch.api.ClassTransform; import org.sinytra.adapter.patch.api.MixinClassGenerator; +import org.sinytra.adapter.patch.api.MixinConstants; import org.sinytra.adapter.patch.api.Patch; -import org.sinytra.adapter.patch.api.PatchContext; import org.sinytra.adapter.patch.api.PatchEnvironment; import org.sinytra.adapter.patch.fixes.FieldTypePatchTransformer; import org.sinytra.adapter.patch.fixes.FieldTypeUsageTransformer; @@ -21,13 +29,6 @@ import org.sinytra.adapter.patch.transformer.dynamic.DynamicInjectorOrdinalPatch; import org.sinytra.adapter.patch.transformer.dynamic.DynamicLVTPatch; import org.sinytra.adapter.patch.transformer.dynamic.DynamicModifyVarAtReturnPatch; -import dev.su5ed.sinytra.connector.ConnectorUtil; -import dev.su5ed.sinytra.connector.transformer.patch.EnvironmentStripperTransformer; -import net.minecraftforge.fart.api.Transformer; -import net.minecraftforge.forgespi.locating.IModFile; -import org.objectweb.asm.ClassReader; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.tree.ClassNode; import org.slf4j.Logger; import java.io.IOException; @@ -71,12 +72,10 @@ public class MixinPatchTransformer implements Transformer { private static final Logger LOGGER = LogUtils.getLogger(); private static boolean completedSetup = false; - private final Set mixinPackages; private final PatchEnvironment environment; private final List patches; - public MixinPatchTransformer(LVTOffsets lvtOffsets, Set mixinPackages, PatchEnvironment environment, List adapterPatches) { - this.mixinPackages = mixinPackages; + public MixinPatchTransformer(LVTOffsets lvtOffsets, PatchEnvironment environment, List adapterPatches) { this.environment = environment; this.patches = ImmutableList.builder() .addAll(PRIORITY_PATCHES) @@ -180,15 +179,6 @@ private Map getMixinsInPackage(Strin return classes; } - private boolean isInMixinPackage(String className) { - for (String pkg : this.mixinPackages) { - if (className.startsWith(pkg)) { - return true; - } - } - return false; - } - public static void completeSetup(Iterable mods) { if (completedSetup) { return; @@ -219,25 +209,21 @@ public static void completeSetup(Iterable mods) { @Override public ClassEntry process(ClassEntry entry) { - String className = entry.getClassName(); Patch.Result patchResult = Patch.Result.PASS; ClassReader reader = new ClassReader(entry.getData()); ClassNode node = new ClassNode(); reader.accept(node, 0); - if (isInMixinPackage(className)) { + // Some mods generate their mixin configs at runtime, therefore we must scan all classes + // regardless of whether they're listed in present config files (see Andromeda) + if (isMixinClass(node)) { patchResult = patchResult.or(CLASS_PATCH.apply(node, this.environment)); for (Patch patch : this.patches) { patchResult = patchResult.or(patch.apply(node, this.environment)); } } - else { - for (ClassTransform transform : CLASS_TRANSFORMS) { - patchResult = patchResult.or(transform.apply(node, null, PatchContext.create(node, List.of(), this.environment))); - } - } // TODO if a mixin method is extracted, roll back the status from compute frames to apply, // Alternatively, change the order of patches so that extractmixin comes first @@ -265,4 +251,15 @@ public Collection getExtras() { }); return entries; } + + private static boolean isMixinClass(ClassNode classNode) { + if (classNode.invisibleAnnotations != null) { + for (AnnotationNode annotation : classNode.invisibleAnnotations) { + if (annotation.desc.equals(MixinConstants.MIXIN)) { + return true; + } + } + } + return false; + } } diff --git a/src/main/java/dev/su5ed/sinytra/connector/transformer/jar/JarTransformInstance.java b/src/main/java/dev/su5ed/sinytra/connector/transformer/jar/JarTransformInstance.java index 101d5004..877c80e6 100644 --- a/src/main/java/dev/su5ed/sinytra/connector/transformer/jar/JarTransformInstance.java +++ b/src/main/java/dev/su5ed/sinytra/connector/transformer/jar/JarTransformInstance.java @@ -126,7 +126,7 @@ public void transformJar(File input, Path output, FabricModFileMetadata metadata ConnectorRefmapHolder refmapHolder = new ConnectorRefmapHolder(refmap.merged(), refmap.files()); int fabricLVTCompatibility = FabricMixinBootstrap.MixinConfigDecorator.getMixinCompat(metadata.modMetadata()); PatchEnvironment environment = PatchEnvironment.create(refmapHolder, this.cleanClassLookup, this.bfu.unwrap(), fabricLVTCompatibility); - MixinPatchTransformer patchTransformer = new MixinPatchTransformer(this.lvtOffsetsData, metadata.mixinPackages(), environment, extraPatches); + MixinPatchTransformer patchTransformer = new MixinPatchTransformer(this.lvtOffsetsData, environment, extraPatches); RefmapRemapper refmapRemapper = new RefmapRemapper(metadata.visibleMixinConfigs(), refmap.files()); Renamer.Builder builder = Renamer.builder() .add(new JarSignatureStripper())