Skip to content

Commit

Permalink
Apply mixin patches to all mixins regardless of config
Browse files Browse the repository at this point in the history
Fixes #794
  • Loading branch information
Su5eD committed Mar 12, 2024
1 parent b004f21 commit 896acb1
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 28 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -71,12 +72,10 @@ public class MixinPatchTransformer implements Transformer {
private static final Logger LOGGER = LogUtils.getLogger();
private static boolean completedSetup = false;

private final Set<String> mixinPackages;
private final PatchEnvironment environment;
private final List<? extends Patch> patches;

public MixinPatchTransformer(LVTOffsets lvtOffsets, Set<String> mixinPackages, PatchEnvironment environment, List<? extends Patch> adapterPatches) {
this.mixinPackages = mixinPackages;
public MixinPatchTransformer(LVTOffsets lvtOffsets, PatchEnvironment environment, List<? extends Patch> adapterPatches) {
this.environment = environment;
this.patches = ImmutableList.<Patch>builder()
.addAll(PRIORITY_PATCHES)
Expand Down Expand Up @@ -180,15 +179,6 @@ private Map<String, MixinClassGenerator.GeneratedClass> 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<IModFile> mods) {
if (completedSetup) {
return;
Expand Down Expand Up @@ -219,25 +209,21 @@ public static void completeSetup(Iterable<IModFile> 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
Expand Down Expand Up @@ -265,4 +251,15 @@ public Collection<? extends Entry> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down

0 comments on commit 896acb1

Please sign in to comment.