Skip to content

Commit

Permalink
Remap refmapless mixins
Browse files Browse the repository at this point in the history
Fixes #795
  • Loading branch information
Su5eD committed Mar 24, 2024
1 parent 1e3aa59 commit 5ad9bc9
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 29 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=true

# Versions
versionConnector=1.0.0-beta.40
versionConnector=1.0.0-beta.41
versionAdapter=1.11.32-1.20.1-20240314.234555
versionAdapterDefinition=1.11.34

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import dev.su5ed.sinytra.connector.transformer.jar.IntermediateMapping;
import net.minecraftforge.fart.api.ClassProvider;
import net.minecraftforge.fart.api.Transformer;
import net.minecraftforge.fart.internal.ClassProviderImpl;
import net.minecraftforge.fart.internal.EnhancedClassRemapper;
import net.minecraftforge.fart.internal.EnhancedRemapper;
Expand Down Expand Up @@ -37,20 +36,22 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public final class OptimizedRenamingTransformer extends RenamingTransformer {
private static final String CLASS_DESC_PATTERN = "^L[a-zA-Z0-9/$_]+;$";
private static final String FQN_CLASS_NAME_PATTERN = "^([a-zA-Z0-9$_]+\\.)*[a-zA-Z0-9$_]+$";
private static final String FQN_CLASS_NAME_PATTERN = "^(?:[a-zA-Z0-9$_]+\\.)*[a-zA-Z0-9$_]+$";
private static final String INTERNAL_CLASS_NAME_PATTERN = "^(?:[a-zA-Z0-9$_]+/)*[a-zA-Z0-9$_]+$";
private static final Pattern FIELD_QUALIFIER_PATTERN = Pattern.compile("^(?<owner>L[\\\\\\w/$]+;)?(?<name>\\w+)(?::(?<desc>\\[*[ZCBSIFJD]|\\[*L[a-zA-Z0-9/_$]+;))?$");

public static Transformer create(ClassProvider classProvider, Consumer<String> log, IMappingFile mappingFile, IntermediateMapping flatMappings) {
IntermediaryClassProvider reverseProvider = new IntermediaryClassProvider(classProvider, mappingFile, mappingFile.reverse(), log);
EnhancedRemapper enhancedRemapper = new MixinAwareEnhancedRemapper(reverseProvider, mappingFile, flatMappings, log);
return new OptimizedRenamingTransformer(enhancedRemapper, false);
}
private final boolean remapRefs;

public OptimizedRenamingTransformer(EnhancedRemapper remapper, boolean collectAbstractParams) {
public OptimizedRenamingTransformer(EnhancedRemapper remapper, boolean collectAbstractParams, boolean remapRefs) {
super(remapper, collectAbstractParams);

this.remapRefs = remapRefs;
}

@Override
Expand All @@ -66,11 +67,16 @@ protected void postProcess(ClassNode node) {
postProcessRemapper.mapAnnotationValues(annotation.values);
}
}
if (node.invisibleAnnotations != null) {
for (AnnotationNode annotation : node.invisibleAnnotations) {
postProcessRemapper.mapAnnotationValues(annotation.values);
}
}
for (MethodNode method : node.methods) {
if (method.visibleAnnotations != null) {
// If remap has been set to false during compilation, we must manually map the annotation values ourselves instead of relying on the provided refmap
if (method.visibleAnnotations.stream().anyMatch(ann -> new AnnotationHandle(ann).<Boolean>getValue("remap").map(h -> !h.get()).orElse(false))) {
for (AnnotationNode annotation : method.visibleAnnotations) {
for (AnnotationNode annotation : method.visibleAnnotations) {
// If remap has been set to false during compilation, we must manually map the annotation values ourselves instead of relying on the provided refmap
if (this.remapRefs || new AnnotationHandle(annotation).<Boolean>getValue("remap").map(h -> !h.get()).orElse(false)) {
postProcessRemapper.mapAnnotationValues(annotation.values);
}
}
Expand Down Expand Up @@ -117,17 +123,23 @@ else if (obj instanceof List list) {
public Object mapValue(Object value) {
if (value instanceof String str) {
if (str.matches(CLASS_DESC_PATTERN)) {
String mapped = flatMappings.map(str.substring(1, str.length() - 1));
String mapped = this.flatMappings.map(str.substring(1, str.length() - 1));
if (mapped != null) {
return 'L' + mapped + ';';
}
}
else if (str.matches(FQN_CLASS_NAME_PATTERN)) {
String mapped = flatMappings.map(str.replace('.', '/'));
String mapped = this.flatMappings.map(str.replace('.', '/'));
if (mapped != null) {
return mapped.replace('/', '.');
}
}
else if (str.matches(INTERNAL_CLASS_NAME_PATTERN)) {
String mapped = this.flatMappings.map(str);
if (mapped != null) {
return mapped;
}
}

MethodQualifier qualifier = MethodQualifier.create(str).orElse(null);
if (qualifier != null && qualifier.desc() != null) {
Expand All @@ -136,6 +148,21 @@ else if (str.matches(FQN_CLASS_NAME_PATTERN)) {
String desc = this.remapper.mapMethodDesc(qualifier.desc());
return owner + name + desc;
}
else {
Matcher fieldMatcher = FIELD_QUALIFIER_PATTERN.matcher(str);
if (fieldMatcher.matches()) {
String owner = fieldMatcher.group("owner");
String name = fieldMatcher.group("name");
String desc = fieldMatcher.group("desc");

if (owner != null || name != null && (name.startsWith("field_") || name.startsWith("comp_"))) {
String mappedOwner = owner != null ? this.remapper.mapDesc(owner) : "";
String mappedName = name != null ? this.flatMappings.mapField(name, desc != null ? desc : "") : "";

return mappedOwner + mappedName + (desc != null ? ":" + this.remapper.mapDesc(desc) : "");
}
}
}

String mapped = this.flatMappings.map(str);
if (mapped != null) {
Expand All @@ -146,14 +173,14 @@ else if (str.matches(FQN_CLASS_NAME_PATTERN)) {
}
}

private static final class IntermediaryClassProvider implements ClassProvider {
public static final class IntermediaryClassProvider implements ClassProvider {
private final ClassProvider upstream;
private final IMappingFile forwardMapping;
private final EnhancedRemapper remapper;

private final Map<String, Optional<IClassInfo>> classCache = new ConcurrentHashMap<>();

private IntermediaryClassProvider(ClassProvider upstream, IMappingFile forwardMapping, IMappingFile reverseMapping, Consumer<String> log) {
public IntermediaryClassProvider(ClassProvider upstream, IMappingFile forwardMapping, IMappingFile reverseMapping, Consumer<String> log) {
this.upstream = upstream;
this.forwardMapping = forwardMapping;
this.remapper = new EnhancedRemapper(upstream, reverseMapping, log);
Expand Down Expand Up @@ -191,7 +218,7 @@ public void close() throws IOException {
}
}

private static class MixinAwareEnhancedRemapper extends EnhancedRemapper {
public static class MixinAwareEnhancedRemapper extends EnhancedRemapper {
private final IntermediateMapping flatMappings;

public MixinAwareEnhancedRemapper(ClassProvider classProvider, IMappingFile map, IntermediateMapping flatMappings, Consumer<String> log) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,6 @@
import com.google.gson.JsonElement;
import com.mojang.logging.LogUtils;
import com.mojang.serialization.JsonOps;
import dev.su5ed.sinytra.connector.transformer.patch.ReflectionRenamingTransformer;
import org.sinytra.adapter.patch.LVTOffsets;
import org.sinytra.adapter.patch.api.GlobalReferenceMapper;
import org.sinytra.adapter.patch.api.Patch;
import org.sinytra.adapter.patch.api.PatchEnvironment;
import org.sinytra.adapter.patch.serialization.PatchSerialization;
import org.sinytra.adapter.patch.util.provider.ClassLookup;
import org.sinytra.adapter.patch.util.provider.ZipClassLookup;
import dev.su5ed.sinytra.connector.locator.EmbeddedDependencies;
import dev.su5ed.sinytra.connector.service.FabricMixinBootstrap;
import dev.su5ed.sinytra.connector.transformer.AccessWidenerTransformer;
Expand All @@ -27,17 +19,25 @@
import dev.su5ed.sinytra.connector.transformer.patch.ClassAnalysingTransformer;
import dev.su5ed.sinytra.connector.transformer.patch.ClassNodeTransformer;
import dev.su5ed.sinytra.connector.transformer.patch.ConnectorRefmapHolder;
import dev.su5ed.sinytra.connector.transformer.patch.ReflectionRenamingTransformer;
import net.fabricmc.loader.impl.FabricLoaderImpl;
import net.fabricmc.loader.impl.MappingResolverImpl;
import net.minecraftforge.coremod.api.ASMAPI;
import net.minecraftforge.fart.api.ClassProvider;
import net.minecraftforge.fart.api.Renamer;
import net.minecraftforge.fart.api.Transformer;
import net.minecraftforge.fart.internal.EnhancedRemapper;
import net.minecraftforge.fml.loading.FMLEnvironment;
import net.minecraftforge.fml.loading.FMLLoader;
import net.minecraftforge.fml.loading.targets.CommonLaunchHandler;
import net.minecraftforge.forgespi.locating.IModFile;
import net.minecraftforge.srgutils.IMappingFile;
import org.sinytra.adapter.patch.LVTOffsets;
import org.sinytra.adapter.patch.api.GlobalReferenceMapper;
import org.sinytra.adapter.patch.api.Patch;
import org.sinytra.adapter.patch.api.PatchEnvironment;
import org.sinytra.adapter.patch.serialization.PatchSerialization;
import org.sinytra.adapter.patch.util.provider.ClassLookup;
import org.sinytra.adapter.patch.util.provider.ZipClassLookup;
import org.slf4j.Logger;

import java.io.File;
Expand Down Expand Up @@ -66,7 +66,7 @@ public class JarTransformInstance {
private final List<? extends Patch> adapterPatches;
private final LVTOffsets lvtOffsetsData;
private final BytecodeFixerUpperFrontend bfu;
private final Transformer remappingTransformer;
private final EnhancedRemapper enhancedRemapper;
private final ClassLookup cleanClassLookup;
private final List<Path> libs;

Expand Down Expand Up @@ -94,7 +94,9 @@ public JarTransformInstance(ClassProvider classProvider, Iterable<IModFile> load
}

this.bfu = new BytecodeFixerUpperFrontend();
this.remappingTransformer = OptimizedRenamingTransformer.create(classProvider, s -> {}, FabricLoaderImpl.INSTANCE.getMappingResolver().getCurrentMap(SOURCE_NAMESPACE), IntermediateMapping.get(SOURCE_NAMESPACE));
IMappingFile mappingFile = FabricLoaderImpl.INSTANCE.getMappingResolver().getCurrentMap(SOURCE_NAMESPACE);
ClassProvider intermediaryClassProvider = new OptimizedRenamingTransformer.IntermediaryClassProvider(classProvider, mappingFile, mappingFile.reverse(), s -> {});
this.enhancedRemapper = new OptimizedRenamingTransformer.MixinAwareEnhancedRemapper(intermediaryClassProvider, mappingFile, IntermediateMapping.get(SOURCE_NAMESPACE), s -> {});
this.cleanClassLookup = createCleanClassLookup();
this.libs = libs;

Expand Down Expand Up @@ -137,7 +139,7 @@ public void transformJar(File input, Path output, FabricModFileMetadata metadata
accessorRedirectTransformer,
new ReflectionRenamingTransformer(intermediaryToSrg, IntermediateMapping.get(SOURCE_NAMESPACE))
))
.add(this.remappingTransformer)
.add(new OptimizedRenamingTransformer(this.enhancedRemapper, false, metadata.refmaps().isEmpty()))
.add(new ClassNodeTransformer(new ClassAnalysingTransformer()))
.add(patchTransformer)
.add(refmapRemapper)
Expand Down

0 comments on commit 5ad9bc9

Please sign in to comment.