diff --git a/gradle.properties b/gradle.properties index edd5d3b1..e9e93d7b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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 diff --git a/src/main/java/dev/su5ed/sinytra/connector/transformer/OptimizedRenamingTransformer.java b/src/main/java/dev/su5ed/sinytra/connector/transformer/OptimizedRenamingTransformer.java index e01e3eac..3379b501 100644 --- a/src/main/java/dev/su5ed/sinytra/connector/transformer/OptimizedRenamingTransformer.java +++ b/src/main/java/dev/su5ed/sinytra/connector/transformer/OptimizedRenamingTransformer.java @@ -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; @@ -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("^(?L[\\\\\\w/$]+;)?(?\\w+)(?::(?\\[*[ZCBSIFJD]|\\[*L[a-zA-Z0-9/_$]+;))?$"); - public static Transformer create(ClassProvider classProvider, Consumer 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 @@ -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).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).getValue("remap").map(h -> !h.get()).orElse(false)) { postProcessRemapper.mapAnnotationValues(annotation.values); } } @@ -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) { @@ -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) { @@ -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> classCache = new ConcurrentHashMap<>(); - private IntermediaryClassProvider(ClassProvider upstream, IMappingFile forwardMapping, IMappingFile reverseMapping, Consumer log) { + public IntermediaryClassProvider(ClassProvider upstream, IMappingFile forwardMapping, IMappingFile reverseMapping, Consumer log) { this.upstream = upstream; this.forwardMapping = forwardMapping; this.remapper = new EnhancedRemapper(upstream, reverseMapping, log); @@ -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 log) { 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 fca33e41..ac2d089d 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 @@ -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; @@ -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; @@ -66,7 +66,7 @@ public class JarTransformInstance { private final List adapterPatches; private final LVTOffsets lvtOffsetsData; private final BytecodeFixerUpperFrontend bfu; - private final Transformer remappingTransformer; + private final EnhancedRemapper enhancedRemapper; private final ClassLookup cleanClassLookup; private final List libs; @@ -94,7 +94,9 @@ public JarTransformInstance(ClassProvider classProvider, Iterable 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; @@ -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)