From d328058775bd59ed48b23a4d16ab99b9f9494333 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Wed, 26 Feb 2025 23:17:40 +0100 Subject: [PATCH 01/15] Some internal clean up and api relocation --- .../modremapperapi/ClassTransformer.java | 75 ++++---------- .../modremapperapi/ModRemappingAPI.java | 10 +- .../modremapperapi/api/IClassTransformer.java | 11 ++- .../remapping/MapEntryType.java | 29 ------ .../modremapperapi/remapping/RemapUtil.java | 24 +++-- .../modremapperapi/utils/Constants.java | 27 ++--- .../modremapperapi/utils/MappingsUtils.java | 16 +-- .../modremapperapi/utils/RefmapJson.java | 2 +- .../modremappingapi/api/MappingUtils.java | 60 ++++++++---- .../api/v1/ClassTransformer.java | 17 ++++ .../modremappingapi/api/v1/MappingUtils.java | 98 +++++++++++++++++++ .../impl/MappingsUtilsImpl.java | 3 +- .../modremappingapi/impl/ModDiscoverer.java | 7 +- .../impl/TransformerRegistry.java | 71 ++++++++++++++ .../MappingTreeHelper.java | 2 +- .../impl/remapper/asm}/MRAClassVisitor.java | 4 +- .../impl/remapper/asm}/MRAMethodVisitor.java | 2 +- .../remapper/resource}/RefmapRemapper.java | 3 +- .../remapper/visitor}/MRAApplyVisitor.java | 3 +- .../visitor}/MixinPostApplyVisitor.java | 4 +- .../impl/utils/CacheUtils.java | 29 ++++++ .../impl/{ => utils}/VersionHelper.java | 5 +- src/main/resources/fabric.mod.json | 2 +- 23 files changed, 338 insertions(+), 166 deletions(-) delete mode 100644 src/main/java/fr/catcore/modremapperapi/remapping/MapEntryType.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ClassTransformer.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/TransformerRegistry.java rename src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/{utils => mappings}/MappingTreeHelper.java (99%) rename src/main/java/{fr/catcore/modremapperapi/remapping => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm}/MRAClassVisitor.java (89%) rename src/main/java/{fr/catcore/modremapperapi/remapping => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm}/MRAMethodVisitor.java (98%) rename src/main/java/{fr/catcore/modremapperapi/remapping => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource}/RefmapRemapper.java (98%) rename src/main/java/{fr/catcore/modremapperapi/remapping => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor}/MRAApplyVisitor.java (78%) rename src/main/java/{fr/catcore/modremapperapi/remapping => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor}/MixinPostApplyVisitor.java (93%) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java rename src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/{ => utils}/VersionHelper.java (68%) diff --git a/src/main/java/fr/catcore/modremapperapi/ClassTransformer.java b/src/main/java/fr/catcore/modremapperapi/ClassTransformer.java index cf9371d..43b92c2 100644 --- a/src/main/java/fr/catcore/modremapperapi/ClassTransformer.java +++ b/src/main/java/fr/catcore/modremapperapi/ClassTransformer.java @@ -1,71 +1,34 @@ package fr.catcore.modremapperapi; -import com.google.common.collect.ImmutableSet; import fr.catcore.modremapperapi.api.IClassTransformer; -import net.mine_diver.spasm.api.transform.RawClassTransformer; -import net.mine_diver.spasm.api.transform.TransformationPhase; -import net.mine_diver.spasm.impl.SpASM; -import org.jetbrains.annotations.NotNull; - -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; - -public class ClassTransformer implements RawClassTransformer { - private static final Set PRE_TRANSFORMERS = new HashSet<>(); - private static final Set POST_TRANSFORMERS = new HashSet<>(); - - public static byte[] transform(String name, String transformedName, byte[] basicClass) { - Set transformers = new HashSet<>(); - - Set transformerPool = PRE_TRANSFORMERS; - - if (SpASM.getCurrentPhase() == TransformationPhase.AFTER_MIXINS) { - transformerPool = POST_TRANSFORMERS; - } - - for (IClassTransformer transformer : transformerPool) { - if (transformer.handlesClass(name, transformedName)) { - transformers.add(transformer); - } - } - - byte[] modifiedClass = basicClass; - - for (IClassTransformer transformer : transformers) { - modifiedClass = transformer.transformClass(name, transformedName, modifiedClass); - } - - return modifiedClass; - } +/** + * @deprecated Use utility methods on {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer} instead. + */ +@Deprecated +public class ClassTransformer { + /** + * @deprecated Deprecated in favor of {@link ClassTransformer#registerPreTransformer(IClassTransformer)}. + * @param transformer + */ @Deprecated public static void registerTransformer(IClassTransformer transformer) { registerPreTransformer(transformer); } + /** + * @deprecated Use {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer#registerPreTransformer(io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer)} instead. + */ + @Deprecated public static void registerPreTransformer(IClassTransformer transformer) { - PRE_TRANSFORMERS.add(transformer); + io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer.registerPreTransformer(transformer); } + /** + * @deprecated Use {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer#registerPostTransformer(io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer)} instead. + */ + @Deprecated public static void registerPostTransformer(IClassTransformer transformer) { - POST_TRANSFORMERS.add(transformer); - } - - @Override - public @NotNull Optional transform(@NotNull ClassLoader classLoader, @NotNull String className, byte @NotNull [] bytes) { - byte[] modifiedBytes = bytes; - modifiedBytes = transform(className, className, modifiedBytes); - - if (modifiedBytes != null) { - return Optional.of(modifiedBytes); - } - - return Optional.empty(); - } - - @Override - public @NotNull ImmutableSet getPhases() { - return ALL_PHASES; + io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer.registerPostTransformer(transformer); } } diff --git a/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java b/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java index a13ec7e..7b01569 100644 --- a/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java +++ b/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java @@ -1,15 +1,7 @@ package fr.catcore.modremapperapi; -import fr.catcore.modremapperapi.api.ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; -import net.fabricmc.loader.api.FabricLoader; - -import java.io.File; -import java.util.ArrayList; -import java.util.List; public class ModRemappingAPI { - - public static final boolean BABRIC = FabricLoader.getInstance().getModContainer("fabricloader") - .get().getMetadata().getVersion().getFriendlyString().contains("babric"); + public static final boolean BABRIC = ModRemappingAPIImpl.BABRIC; } diff --git a/src/main/java/fr/catcore/modremapperapi/api/IClassTransformer.java b/src/main/java/fr/catcore/modremapperapi/api/IClassTransformer.java index 73b14f7..499422f 100644 --- a/src/main/java/fr/catcore/modremapperapi/api/IClassTransformer.java +++ b/src/main/java/fr/catcore/modremapperapi/api/IClassTransformer.java @@ -1,7 +1,10 @@ package fr.catcore.modremapperapi.api; -// Original author is gudenau. -public interface IClassTransformer { - boolean handlesClass(String name, String transformedName); - byte[] transformClass(String name, String transformedName, byte[] original); +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer; + +/** + * @deprecated Use {@link ClassTransformer} instead. + */ +@Deprecated +public interface IClassTransformer extends ClassTransformer { } diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/MapEntryType.java b/src/main/java/fr/catcore/modremapperapi/remapping/MapEntryType.java deleted file mode 100644 index a44dbbf..0000000 --- a/src/main/java/fr/catcore/modremapperapi/remapping/MapEntryType.java +++ /dev/null @@ -1,29 +0,0 @@ -package fr.catcore.modremapperapi.remapping; - -public enum MapEntryType { - CLASS("CLASS", 0, 'C'), - METHOD("METHOD", 2, 'M'), - FIELD("FIELD", 2, 'F'); - - private static final MapEntryType[] VALUES = MapEntryType.values(); - - final String name; - final char firstChar; - final int offset; - - MapEntryType(String name, int offset, char firstChar) { - this.name = name; - this.offset = offset; - this.firstChar = firstChar; - } - - public static MapEntryType getType(String name) { - char c = name.charAt(0); - for (MapEntryType type : VALUES) { - if (type.firstChar == c) { - return type; - } - } - return null; - } -} diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index c2cb569..a10eaa5 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -9,6 +9,10 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; @@ -91,7 +95,7 @@ private static void downloadRemappingLibs() { remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); for (RemapLibrary library : libraries) { - File libPath = new File(Constants.LIB_FOLDER, library.fileName); + File libPath = CacheUtils.getLibraryPath(library.fileName).toFile(); if (!libPath.exists() && !library.url.isEmpty()) { Constants.MAIN_LOGGER.info("Downloading remapping library '" + library.fileName + "' from url '" + library.url + "'"); @@ -346,11 +350,11 @@ private static void preloadClasses() { "fr.catcore.modremapperapi.remapping.MappingBuilder", "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", "fr.catcore.modremapperapi.remapping.MappingBuilder$Type", - "fr.catcore.modremapperapi.remapping.MixinPostApplyVisitor", - "fr.catcore.modremapperapi.remapping.MRAClassVisitor", - "fr.catcore.modremapperapi.remapping.MRAMethodVisitor", - "fr.catcore.modremapperapi.remapping.MRAApplyVisitor", - "fr.catcore.modremapperapi.remapping.RefmapRemapper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAMethodVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper", "fr.catcore.modremapperapi.remapping.RemapUtil", "fr.catcore.modremapperapi.remapping.RemapUtil$MappingList", "fr.catcore.modremapperapi.remapping.VisitorInfos", @@ -560,12 +564,12 @@ private static TinyRemapper makeRemapper(MappingTree... trees) { modRemapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); for (RemapLibrary library : libraries) { - File libPath = new File(Constants.LIB_FOLDER, library.fileName); + Path libPath = CacheUtils.getLibraryPath(library.fileName); - if (libPath.exists()) { - remapper.readClassPathAsync(libPath.toPath()); + if (Files.exists(libPath)) { + remapper.readClassPathAsync(libPath); } else { - Constants.MAIN_LOGGER.info("Library " + libPath.toPath() + " does not exist."); + Constants.MAIN_LOGGER.info("Library " + libPath + " does not exist."); } } } diff --git a/src/main/java/fr/catcore/modremapperapi/utils/Constants.java b/src/main/java/fr/catcore/modremapperapi/utils/Constants.java index 5bc7e8e..e92f42e 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/Constants.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/Constants.java @@ -1,28 +1,19 @@ package fr.catcore.modremapperapi.utils; -import net.fabricmc.loader.api.FabricLoader; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import net.legacyfabric.fabric.api.logger.v1.Logger; import java.io.File; public class Constants { - public static final File MAIN_FOLDER = new File(FabricLoader.getInstance().getGameDir().toFile(), "mod-remapping-api"); - public static final File VERSIONED_FOLDER = new File( - new File(MAIN_FOLDER, - FabricLoader.getInstance().getModContainer("minecraft").get().getMetadata().getVersion().getFriendlyString() - ), FabricLoader.getInstance().getModContainer("mod-remapping-api").get().getMetadata().getVersion().getFriendlyString() - ); - public static final File EXTRA_MAPPINGS_FILE = new File(VERSIONED_FOLDER, "extra_mappings.tiny"); - public static final File REMAPPED_MAPPINGS_FILE = new File(VERSIONED_FOLDER, "remapped_mappings.tiny"); - public static final File MC_MAPPINGS_FILE = new File(VERSIONED_FOLDER, "mc_mappings.tiny"); - public static final File FULL_MAPPINGS_FILE = new File(VERSIONED_FOLDER, "full_mappings.tiny"); + public static final File MAIN_FOLDER = CacheUtils.BASE_FOLDER.toFile(); + public static final File VERSIONED_FOLDER = CacheUtils.MAIN_FOLDER.toFile(); + public static final File LIB_FOLDER = CacheUtils.LIBRARY_FOLDER.toFile(); - public static final File LIB_FOLDER = new File(VERSIONED_FOLDER, "libs"); - public static final Logger MAIN_LOGGER = Logger.get("ModRemappingAPI"); + public static final File EXTRA_MAPPINGS_FILE = CacheUtils.getCachePath("extra_mappings.tiny").toFile(); + public static final File REMAPPED_MAPPINGS_FILE = CacheUtils.getCachePath("remapped_mappings.tiny").toFile(); + public static final File MC_MAPPINGS_FILE = CacheUtils.getCachePath("mc_mappings.tiny").toFile(); + public static final File FULL_MAPPINGS_FILE = CacheUtils.getCachePath("full_mappings.tiny").toFile(); - static { - MAIN_FOLDER.mkdirs(); - VERSIONED_FOLDER.mkdirs(); - LIB_FOLDER.mkdirs(); - } + public static final Logger MAIN_LOGGER = Logger.get("ModRemappingAPI"); } diff --git a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java index f030d01..5cac3ba 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java @@ -4,6 +4,7 @@ import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.*; import net.fabricmc.mappingio.MappingReader; @@ -14,6 +15,7 @@ import org.jetbrains.annotations.ApiStatus; import java.io.*; +import java.nio.file.Files; import java.nio.file.Path; import java.util.*; @@ -65,14 +67,14 @@ private static Path[] getMinecraftJar(List sourcePaths, String src, String Map paths = new HashMap<>(); - for (Path path : - originalClassPath) { + for (Path path : originalClassPath) { Constants.MAIN_LOGGER.debug(path.toString()); - paths.put(path, new File( - new File(Constants.LIB_FOLDER, target), - path.toFile().getName()).toPath() - ); - paths.get(path).toFile().delete(); + + Path computedPath = CacheUtils.getLibraryPath(target) + .resolve(path.toFile().getName()); + + paths.put(path, computedPath); + Files.delete(computedPath); } TinyRemapper.Builder builder = TinyRemapper diff --git a/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java b/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java index c29503e..168bf6f 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java @@ -1,6 +1,6 @@ package fr.catcore.modremapperapi.utils; -import fr.catcore.modremapperapi.remapping.RefmapRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; import net.fabricmc.tinyremapper.TinyRemapper; import java.util.HashMap; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java index 3fe9635..d10b203 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java @@ -4,95 +4,119 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils} + */ +@Deprecated public interface MappingUtils { /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapClass(String)} * @param className original class name * @return remapped class name */ + @Deprecated static String mapClass(String className) { - return MappingsUtilsImpl.mapClass(className); + return io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils.mapClass(className); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#unmapClass(String)} * @param className remapped class name * @return original class name */ + @Deprecated static String unmapClass(String className) { - return MappingsUtilsImpl.unmapClass(className); + return io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils.unmapClass(className); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapField(String, String, String)} * @param className original class name * @param fieldName * @param fieldDesc * @return */ + @Deprecated static MappingUtils.ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { return MappingsUtilsImpl.mapField(className, fieldName, fieldDesc); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapFieldFromRemappedClass(String, String, String)} * @param className remapped class name * @param fieldName * @param fieldDesc * @return */ + @Deprecated static MappingUtils.ClassMember mapFieldFromRemappedClass(String className, String fieldName, @Nullable String fieldDesc) { return MappingsUtilsImpl.mapFieldFromRemappedClass(className, fieldName, fieldDesc); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapMethod(String, String, String)} * @param className original class name * @param methodName * @param methodDesc * @return */ + @Deprecated static MappingUtils.ClassMember mapMethod(String className, String methodName, String methodDesc) { return MappingsUtilsImpl.mapMethod(className, methodName, methodDesc); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapMethodFromRemappedClass(String, String, String)} * @param className remapped class name * @param methodName * @param methodDesc * @return */ + @Deprecated static MappingUtils.ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { return MappingsUtilsImpl.mapMethodFromRemappedClass(className, methodName, methodDesc); } + /** + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapField(Class, String)} + * @param owner + * @param fieldName + * @return + */ + @Deprecated static MappingUtils.ClassMember mapField(Class owner, String fieldName) { return MappingsUtilsImpl.mapField(owner, fieldName); } + /** + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapMethod(Class, String, Class[])} + * @param owner + * @param methodName + * @param parameterTypes + * @return + */ + @Deprecated static MappingUtils.ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { return MappingsUtilsImpl.mapMethod(owner, methodName, parameterTypes); } /** - * + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils#mapDescriptor(String)} * @param desc original descriptor * @return remapped descriptor */ + @Deprecated static String mapDescriptor(String desc) { - return MappingsUtilsImpl.mapDescriptor(desc); + return io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils.mapDescriptor(desc); } - class ClassMember { - public final @NotNull String name; - public final @Nullable String desc; - + /** + * @deprecated Deprecated in favor of {@link io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils.ClassMember} + */ + @Deprecated + class ClassMember extends io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils.ClassMember { public ClassMember(@NotNull String name, @Nullable String desc) { - assert name != null; - - this.name = name; - this.desc = desc; + super(name, desc); } } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ClassTransformer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ClassTransformer.java new file mode 100644 index 0000000..c1bc5af --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ClassTransformer.java @@ -0,0 +1,17 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.api.v1; + +import io.github.fabriccompatibiltylayers.modremappingapi.impl.TransformerRegistry; + +// Original author is gudenau. +public interface ClassTransformer { + boolean handlesClass(String name, String transformedName); + byte[] transformClass(String name, String transformedName, byte[] original); + + static void registerPreTransformer(ClassTransformer transformer) { + TransformerRegistry.registerPreTransformer(transformer); + } + + static void registerPostTransformer(ClassTransformer transformer) { + TransformerRegistry.registerPostTransformer(transformer); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java new file mode 100644 index 0000000..7becc3a --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java @@ -0,0 +1,98 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.api.v1; + +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface MappingUtils { + /** + * + * @param className original class name + * @return remapped class name + */ + static String mapClass(String className) { + return MappingsUtilsImpl.mapClass(className); + } + + /** + * + * @param className remapped class name + * @return original class name + */ + static String unmapClass(String className) { + return MappingsUtilsImpl.unmapClass(className); + } + + /** + * + * @param className original class name + * @param fieldName + * @param fieldDesc + * @return + */ + static ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { + return MappingsUtilsImpl.mapField(className, fieldName, fieldDesc); + } + + /** + * + * @param className remapped class name + * @param fieldName + * @param fieldDesc + * @return + */ + static ClassMember mapFieldFromRemappedClass(String className, String fieldName, @Nullable String fieldDesc) { + return MappingsUtilsImpl.mapFieldFromRemappedClass(className, fieldName, fieldDesc); + } + + /** + * + * @param className original class name + * @param methodName + * @param methodDesc + * @return + */ + static ClassMember mapMethod(String className, String methodName, String methodDesc) { + return MappingsUtilsImpl.mapMethod(className, methodName, methodDesc); + } + + /** + * + * @param className remapped class name + * @param methodName + * @param methodDesc + * @return + */ + static ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { + return MappingsUtilsImpl.mapMethodFromRemappedClass(className, methodName, methodDesc); + } + + static ClassMember mapField(Class owner, String fieldName) { + return MappingsUtilsImpl.mapField(owner, fieldName); + } + + static ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { + return MappingsUtilsImpl.mapMethod(owner, methodName, parameterTypes); + } + + /** + * + * @param desc original descriptor + * @return remapped descriptor + */ + static String mapDescriptor(String desc) { + return MappingsUtilsImpl.mapDescriptor(desc); + } + + class ClassMember { + public final @NotNull String name; + public final @Nullable String desc; + + public ClassMember(@NotNull String name, @Nullable String desc) { + assert name != null; + + this.name = name; + this.desc = desc; + } + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java index 58922be..b60cbc9 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java @@ -4,7 +4,8 @@ import fr.catcore.modremapperapi.utils.MappingsUtils; import fr.catcore.wfvaio.WhichFabricVariantAmIOn; import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.VersionHelper; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.launch.MappingConfiguration; import net.fabricmc.loader.impl.util.log.Log; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index 25032e8..d6c485f 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -5,6 +5,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.launch.FabricLauncherBase; import org.spongepowered.include.com.google.common.collect.ImmutableList; @@ -40,7 +41,7 @@ protected static void init(List modRemappers, boolean remapClassEdi for (ModRemapper remapper : modRemappers) { for (String jarFolder : remapper.getJarFolders()) { File mcSubFolder = new File(FabricLoader.getInstance().getGameDir().toFile(), jarFolder); - File cacheFolder = new File(Constants.VERSIONED_FOLDER, jarFolder); + File cacheFolder = CacheUtils.getCachePath(jarFolder).toFile(); if (!mcSubFolder.exists()) mcSubFolder.mkdirs(); if (!cacheFolder.exists()) cacheFolder.mkdirs(); @@ -51,7 +52,7 @@ protected static void init(List modRemappers, boolean remapClassEdi } } - File mainTempDir = new File(Constants.VERSIONED_FOLDER, "temp"); + File mainTempDir = CacheUtils.getCachePath("temp").toFile(); if (mainTempDir.exists()) { emptyDir(mainTempDir); } @@ -147,7 +148,7 @@ private static Map excludeClassEdits(Map modPaths) { Map map = new HashMap<>(); Map convertMap = new HashMap<>(); - File mainTempDir = new File(Constants.VERSIONED_FOLDER, "temp"); + File mainTempDir = CacheUtils.getCachePath("temp").toFile(); mainTempDir.mkdirs(); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/TransformerRegistry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/TransformerRegistry.java new file mode 100644 index 0000000..cd4b458 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/TransformerRegistry.java @@ -0,0 +1,71 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl; + +import com.google.common.collect.ImmutableSet; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ClassTransformer; +import net.mine_diver.spasm.api.transform.RawClassTransformer; +import net.mine_diver.spasm.api.transform.TransformationPhase; +import net.mine_diver.spasm.impl.SpASM; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +@ApiStatus.Internal +public class TransformerRegistry implements RawClassTransformer { + private static final Set PRE_TRANSFORMERS = new HashSet<>(); + private static final Set POST_TRANSFORMERS = new HashSet<>(); + + @ApiStatus.Internal + public static byte[] transform(String name, String transformedName, byte[] basicClass) { + Set transformers = new HashSet<>(); + + Set transformerPool = PRE_TRANSFORMERS; + + if (SpASM.getCurrentPhase() == TransformationPhase.AFTER_MIXINS) { + transformerPool = POST_TRANSFORMERS; + } + + for (ClassTransformer transformer : transformerPool) { + if (transformer.handlesClass(name, transformedName)) { + transformers.add(transformer); + } + } + + byte[] modifiedClass = basicClass; + + for (ClassTransformer transformer : transformers) { + modifiedClass = transformer.transformClass(name, transformedName, modifiedClass); + } + + return modifiedClass; + } + + @ApiStatus.Internal + public static void registerPreTransformer(ClassTransformer transformer) { + PRE_TRANSFORMERS.add(transformer); + } + + @ApiStatus.Internal + public static void registerPostTransformer(ClassTransformer transformer) { + POST_TRANSFORMERS.add(transformer); + } + + @Override + public @NotNull Optional transform(@NotNull ClassLoader classLoader, @NotNull String className, byte @NotNull [] bytes) { + byte[] modifiedBytes = bytes; + modifiedBytes = transform(className, className, modifiedBytes); + + if (modifiedBytes != null) { + return Optional.of(modifiedBytes); + } + + return Optional.empty(); + } + + @Override + public @NotNull ImmutableSet getPhases() { + return ALL_PHASES; + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/MappingTreeHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java similarity index 99% rename from src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/MappingTreeHelper.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java index becc080..e30fedf 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/MappingTreeHelper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java @@ -1,4 +1,4 @@ -package io.github.fabriccompatibiltylayers.modremappingapi.impl.utils; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.adapter.MappingDstNsReorder; diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/MRAClassVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAClassVisitor.java similarity index 89% rename from src/main/java/fr/catcore/modremapperapi/remapping/MRAClassVisitor.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAClassVisitor.java index 0f2588c..d955387 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/MRAClassVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAClassVisitor.java @@ -1,4 +1,4 @@ -package fr.catcore.modremapperapi.remapping; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; import org.objectweb.asm.*; @@ -7,7 +7,7 @@ public class MRAClassVisitor extends ClassVisitor { private final VisitorInfosImpl infos; private final String className; - protected MRAClassVisitor(ClassVisitor classVisitor, VisitorInfosImpl infos, String className) { + public MRAClassVisitor(ClassVisitor classVisitor, VisitorInfosImpl infos, String className) { super(Opcodes.ASM9, classVisitor); this.infos = infos; this.className = className; diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/MRAMethodVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAMethodVisitor.java similarity index 98% rename from src/main/java/fr/catcore/modremapperapi/remapping/MRAMethodVisitor.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAMethodVisitor.java index dc826b6..1a9600a 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/MRAMethodVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/asm/MRAMethodVisitor.java @@ -1,4 +1,4 @@ -package fr.catcore.modremapperapi.remapping; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.VisitorInfos; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RefmapRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java similarity index 98% rename from src/main/java/fr/catcore/modremapperapi/remapping/RefmapRemapper.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java index 75cc69d..b8c6b43 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RefmapRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java @@ -1,6 +1,7 @@ -package fr.catcore.modremapperapi.remapping; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource; import com.google.gson.Gson; +import fr.catcore.modremapperapi.remapping.RemapUtil; import fr.catcore.modremapperapi.utils.RefmapJson; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/MRAApplyVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java similarity index 78% rename from src/main/java/fr/catcore/modremapperapi/remapping/MRAApplyVisitor.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java index dd60eba..8272855 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/MRAApplyVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java @@ -1,6 +1,7 @@ -package fr.catcore.modremapperapi.remapping; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.api.TrClass; import org.objectweb.asm.ClassVisitor; diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/MixinPostApplyVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java similarity index 93% rename from src/main/java/fr/catcore/modremapperapi/remapping/MixinPostApplyVisitor.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java index 5d934b4..429be58 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/MixinPostApplyVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java @@ -1,7 +1,7 @@ -package fr.catcore.modremapperapi.remapping; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor; +import fr.catcore.modremapperapi.remapping.RemapUtil; import fr.catcore.modremapperapi.utils.Constants; -import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.api.TrClass; import org.objectweb.asm.ClassReader; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java new file mode 100644 index 0000000..fbe59ab --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java @@ -0,0 +1,29 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.utils; + +import net.fabricmc.loader.api.FabricLoader; +import org.jetbrains.annotations.ApiStatus; + +import java.nio.file.Path; + +@ApiStatus.Internal +public class CacheUtils { + public static final Path BASE_FOLDER = FabricLoader.getInstance().getGameDir().resolve("mod-remapping-api"); + public static final Path MAIN_FOLDER = BASE_FOLDER + .resolve(VersionHelper.MINECRAFT_VERSION) + .resolve(VersionHelper.MOD_VERSION); + public static final Path LIBRARY_FOLDER = BASE_FOLDER.resolve("libs"); + + public static Path getCachePath(String pathName) { + return MAIN_FOLDER.resolve(pathName); + } + + public static Path getLibraryPath(String pathName) { + return LIBRARY_FOLDER.resolve(pathName); + } + + static { + BASE_FOLDER.toFile().mkdirs(); + MAIN_FOLDER.toFile().mkdirs(); + LIBRARY_FOLDER.toFile().mkdirs(); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/VersionHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/VersionHelper.java similarity index 68% rename from src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/VersionHelper.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/VersionHelper.java index f2a80c0..9017f89 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/VersionHelper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/VersionHelper.java @@ -1,4 +1,4 @@ -package io.github.fabriccompatibiltylayers.modremappingapi.impl; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.utils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.Version; @@ -11,6 +11,9 @@ public class VersionHelper { private static final Version MC_VERSION = FabricLoader.getInstance().getModContainer("minecraft") .get().getMetadata().getVersion(); + public static final String MINECRAFT_VERSION = MC_VERSION.getFriendlyString(); + public static final String MOD_VERSION = FabricLoader.getInstance().getModContainer("mod-remapping-api").get().getMetadata().getVersion().getFriendlyString(); + public static Boolean predicate(String predicate) { try { return VersionPredicate.parse(predicate).test(MC_VERSION); diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 0c8c05b..f44c180 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -26,7 +26,7 @@ "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModRemapper" ], "spasm:raw_transformer": [ - "fr.catcore.modremapperapi.ClassTransformer" + "io.github.fabriccompatibiltylayers.modremappingapi.impl.TransformerRegistry" ] }, "depends": { From 2980fd2859509f9365850aafd37da8c9da607766 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Tue, 11 Mar 2025 22:12:38 +0100 Subject: [PATCH 02/15] Cache remapped mc jars + more refactoring --- .../modremapperapi/remapping/RemapUtil.java | 15 +- .../modremapperapi/utils/MappingsUtils.java | 131 +----------------- .../impl/MappingsUtilsImpl.java | 19 ++- .../remapper/minecraft/MinecraftRemapper.java | 118 ++++++++++++++++ 4 files changed, 145 insertions(+), 138 deletions(-) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index a10eaa5..2df7fb4 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -2,13 +2,13 @@ import fr.catcore.modremapperapi.utils.Constants; import fr.catcore.modremapperapi.utils.FileUtils; -import fr.catcore.modremapperapi.utils.MappingsUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft.MinecraftRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; @@ -39,7 +39,8 @@ public class RemapUtil { private static MappingTree MINECRAFT_TREE; private static MemoryMappingTree MODS_TREE; - protected static final Map> MIXINED = new HashMap<>(); + @ApiStatus.Internal + public static final Map> MIXINED = new HashMap<>(); private static String defaultPackage = ""; @@ -526,7 +527,7 @@ private static TinyRemapper makeRemapper(MappingTree... trees) { } for (MappingTree tree : trees) { - builder.withMappings(MappingsUtilsImpl.createProvider(tree, MappingsUtilsImpl.getSourceNamespace(), MappingsUtils.getTargetNamespace())); + builder.withMappings(MappingsUtilsImpl.createProvider(tree, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace())); } MRAApplyVisitor preApplyVisitor = new MRAApplyVisitor(); @@ -553,7 +554,7 @@ private static TinyRemapper makeRemapper(MappingTree... trees) { TinyRemapper remapper = builder.build(); try { - MappingsUtils.addMinecraftJar(remapper); + MinecraftRemapper.addMinecraftJar(remapper); } catch (IOException e) { throw new RuntimeException(e); } @@ -588,7 +589,7 @@ private static void remapFiles(TinyRemapper remapper, Map paths) { List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); resourceRemappers.add(new RefmapRemapper()); - applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, MappingsUtilsImpl.getSourceNamespace(), MappingsUtils.getTargetNamespace()); + applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace()); } @ApiStatus.Internal @@ -662,6 +663,6 @@ public static EnvType getEnvironment() { @Deprecated public static String getNativeNamespace() { - return MappingsUtils.getNativeNamespace(); + return MappingsUtilsImpl.getNativeNamespace(); } } diff --git a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java index 5cac3ba..7d30040 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java @@ -1,57 +1,21 @@ package fr.catcore.modremapperapi.utils; -import fr.catcore.modremapperapi.ModRemappingAPI; -import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; -import net.fabricmc.api.EnvType; -import net.fabricmc.loader.api.*; -import net.fabricmc.mappingio.MappingReader; -import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.tree.MappingTree; -import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.tinyremapper.*; -import org.jetbrains.annotations.ApiStatus; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.*; - -import static io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils.getRemapClasspath; +@Deprecated public class MappingsUtils { @Deprecated public static String getNativeNamespace() { - if (ModRemappingAPI.BABRIC) { - return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT ? "client" : "server"; - } - - return "official"; + return MappingsUtilsImpl.getNativeNamespace(); } + @Deprecated public static String getTargetNamespace() { - return FabricLoader.getInstance().getMappingResolver().getCurrentRuntimeNamespace(); + return MappingsUtilsImpl.getTargetNamespace(); } - public static MappingTree loadMappings(Reader reader) { - MemoryMappingTree tree = new MemoryMappingTree(); - try { - loadMappings(reader, tree); - } catch (IOException e) { - e.printStackTrace(); - } - return tree; - } - - public static void loadMappings(Reader reader, MappingVisitor tree) throws IOException { - MappingReader.read(reader, tree); - } - - /** - * @deprecated Use {@link MappingsUtilsImpl#getVanillaMappings()} instead for the same behavior. - */ @Deprecated public static MappingTree getMinecraftMappings() { return MappingsUtilsImpl.getVanillaMappings(); @@ -61,91 +25,4 @@ public static MappingTree getMinecraftMappings() { public static IMappingProvider createProvider(MappingTree mappings) { return MappingsUtilsImpl.createProvider(mappings, getNativeNamespace(), getTargetNamespace()); } - - private static Path[] getMinecraftJar(List sourcePaths, String src, String target) throws IOException { - Path[] originalClassPath = sourcePaths.toArray(new Path[0]); - - Map paths = new HashMap<>(); - - for (Path path : originalClassPath) { - Constants.MAIN_LOGGER.debug(path.toString()); - - Path computedPath = CacheUtils.getLibraryPath(target) - .resolve(path.toFile().getName()); - - paths.put(path, computedPath); - Files.delete(computedPath); - } - - TinyRemapper.Builder builder = TinyRemapper - .newRemapper() - .renameInvalidLocals(true) - .ignoreFieldDesc(false) - .propagatePrivate(true) - .ignoreConflicts(true) - .fixPackageAccess(true) - .withMappings( - MappingsUtilsImpl.createProvider(MappingsUtilsImpl.getMinecraftMappings(), src, target) - ); - - TinyRemapper remapper = builder.build(); - - Constants.MAIN_LOGGER.info("Remapping minecraft jar from " + src + " to " + target + "!"); - - List outputConsumerPaths = new ArrayList<>(); - - List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); - - RemapUtil.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, src, target); - - Constants.MAIN_LOGGER.info("MC jar remapped successfully!"); - - return paths.values().toArray(new Path[0]); - } - - @ApiStatus.Internal - public static void addMinecraftJar(TinyRemapper remapper) throws IOException { - if (FabricLoader.getInstance().isDevelopmentEnvironment()) { - try { - Path[] classPath = getMinecraftJar( - Arrays.asList( - getMinecraftJar( - getRemapClasspath(), - getTargetNamespace(), - "intermediary" - ) - ), - "intermediary", - "official" - ); - - if (!MappingsUtilsImpl.isSourceNamespaceObf()) { - classPath = getMinecraftJar( - Arrays.asList( - classPath - ), - "official", - MappingsUtilsImpl.getSourceNamespace() - ); - } - - remapper.readClassPathAsync(classPath); - } catch (IOException e) { - throw new RuntimeException("Failed to populate default remap classpath", e); - } - } else { - List list = RemapUtils.getClassPathFromObjectShare(); - - Path[] classPath = list.toArray(new Path[0]); - - if (!MappingsUtilsImpl.isSourceNamespaceObf()) { - classPath = getMinecraftJar(list, "official", MappingsUtilsImpl.getSourceNamespace()); - } - - for (Path path : classPath) { - Constants.MAIN_LOGGER.debug("Appending '%s' to remapper classpath", path); - remapper.readClassPathAsync(path); - } - } - } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java index b60cbc9..cd5278d 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java @@ -1,11 +1,12 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; +import fr.catcore.modremapperapi.ModRemappingAPI; import fr.catcore.modremapperapi.utils.Constants; -import fr.catcore.modremapperapi.utils.MappingsUtils; import fr.catcore.wfvaio.WhichFabricVariantAmIOn; import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.VersionHelper; +import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.launch.MappingConfiguration; import net.fabricmc.loader.impl.util.log.Log; @@ -41,8 +42,6 @@ import java.util.stream.Collectors; import java.util.zip.ZipError; -import static fr.catcore.modremapperapi.utils.MappingsUtils.getTargetNamespace; - @ApiStatus.Internal public class MappingsUtilsImpl { private static boolean initialized = false; @@ -91,6 +90,18 @@ public static boolean isSourceNamespaceObf() { return Objects.equals(sourceNamespace, "official"); } + public static String getTargetNamespace() { + return FabricLoader.getInstance().getMappingResolver().getCurrentRuntimeNamespace(); + } + + public static String getNativeNamespace() { + if (ModRemappingAPI.BABRIC) { + return FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT ? "client" : "server"; + } + + return "official"; + } + @ApiStatus.Internal public static MemoryMappingTree loadMappings(InputStream stream) throws IOException { try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { @@ -226,7 +237,7 @@ public static IMappingProvider createProvider(MappingTree mappings, String from, @ApiStatus.Internal public static void initializeMappingTree(MappingVisitor mappingVisitor) throws IOException { - initializeMappingTree(mappingVisitor, getSourceNamespace(), MappingsUtils.getTargetNamespace()); + initializeMappingTree(mappingVisitor, getSourceNamespace(), getTargetNamespace()); } @ApiStatus.Internal diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java new file mode 100644 index 0000000..686c949 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java @@ -0,0 +1,118 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft; + +import fr.catcore.modremapperapi.remapping.RemapUtil; +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.tinyremapper.NonClassCopyMode; +import net.fabricmc.tinyremapper.OutputConsumerPath; +import net.fabricmc.tinyremapper.TinyRemapper; +import org.jetbrains.annotations.ApiStatus; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; + +@ApiStatus.Internal +public class MinecraftRemapper { + private static Collection getMinecraftJar(Collection sourcePaths, String src, String target) throws IOException { + Path targetFolder = CacheUtils.getLibraryPath(target); + + if (!Files.exists(targetFolder)) { + Files.createDirectories(targetFolder); + } + + Map paths = computeLibraryPaths(sourcePaths, target); + + if (exist(paths.values())) return paths.values(); + + delete(paths.values()); + + TinyRemapper.Builder builder = TinyRemapper + .newRemapper() + .renameInvalidLocals(true) + .ignoreFieldDesc(false) + .propagatePrivate(true) + .ignoreConflicts(true) + .fixPackageAccess(true) + .withMappings( + MappingsUtilsImpl.createProvider(MappingsUtilsImpl.getMinecraftMappings(), src, target) + ); + + TinyRemapper remapper = builder.build(); + + Constants.MAIN_LOGGER.info("Remapping minecraft jar from " + src + " to " + target + "!"); + + List outputConsumerPaths = new ArrayList<>(); + + List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); + + RemapUtil.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, src, target); + + Constants.MAIN_LOGGER.info("MC jar remapped successfully!"); + + return paths.values(); + } + + @ApiStatus.Internal + public static Map computeLibraryPaths(Collection sourcePaths, String target) { + return sourcePaths.stream().collect(Collectors.toMap(p -> p, + p -> CacheUtils.getLibraryPath(target).resolve(p.toFile().getName()))); + } + + @ApiStatus.Internal + public static boolean exist(Collection paths) { + for (Path path : paths) { + if (!Files.exists(path)) return false; + } + + return true; + } + + @ApiStatus.Internal + public static void delete(Collection paths) { + for (Path path : paths) { + try { + Files.deleteIfExists(path); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @ApiStatus.Internal + public static void addMinecraftJar(TinyRemapper remapper) throws IOException { + Collection classPath; + + if (FabricLoader.getInstance().isDevelopmentEnvironment()) { + try { + classPath = getMinecraftJar( + getMinecraftJar(RemapUtils.getRemapClasspath(), MappingsUtilsImpl.getTargetNamespace(), "intermediary"), + "intermediary", + "official" + ); + + if (!MappingsUtilsImpl.isSourceNamespaceObf()) { + classPath = getMinecraftJar(classPath, "official", MappingsUtilsImpl.getSourceNamespace()); + } + } catch (IOException e) { + throw new RuntimeException("Failed to populate default remap classpath", e); + } + } else { + classPath = RemapUtils.getClassPathFromObjectShare(); + + if (!MappingsUtilsImpl.isSourceNamespaceObf()) { + classPath = getMinecraftJar(classPath, "official", MappingsUtilsImpl.getSourceNamespace()); + } + } + + for (Path path : classPath) { + Constants.MAIN_LOGGER.debug("Appending '%s' to remapper classpath", path); + remapper.readClassPathAsync(path); + } + } +} From d28a3b0507273ccf51627aa758f70c88e22e391e Mon Sep 17 00:00:00 2001 From: Cat Core Date: Tue, 11 Mar 2025 22:54:52 +0100 Subject: [PATCH 03/15] Some more refactoring --- .../modremapperapi/remapping/RemapUtil.java | 54 +++++------ .../modremapperapi/utils/FileUtils.java | 31 +------ .../remapper/minecraft/MinecraftRemapper.java | 34 +------ .../impl/remapper/resource}/RefmapJson.java | 3 +- .../remapper/resource/RefmapRemapper.java | 1 - .../impl/utils/CacheUtils.java | 23 +++++ .../modremappingapi/impl/utils/FileUtils.java | 92 +++++++++++++++++++ 7 files changed, 147 insertions(+), 91 deletions(-) rename src/main/java/{fr/catcore/modremapperapi/utils => io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource}/RefmapJson.java (84%) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 2df7fb4..e7d3a3c 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -25,7 +25,6 @@ import org.jetbrains.annotations.ApiStatus; import java.io.*; -import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; @@ -49,8 +48,6 @@ public class RemapUtil { public static void init(List modRemappers) { remappers = modRemappers; - downloadRemappingLibs(); - for (ModRemapper remapper : remappers) { Optional pkg = remapper.getDefaultPackage(); @@ -65,6 +62,18 @@ public static void init(List MappingsUtilsImpl.loadExtraMappings(inputStreamSupplier.get())); } + Path sourceLibraryPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()); + + if (!Files.exists(sourceLibraryPath)) { + try { + Files.createDirectories(sourceLibraryPath); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + downloadRemappingLibs(); + MINECRAFT_TREE = MappingsUtilsImpl.getMinecraftMappings(); writeMcMappings(); @@ -95,37 +104,20 @@ private static void downloadRemappingLibs() { remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); - for (RemapLibrary library : libraries) { - File libPath = CacheUtils.getLibraryPath(library.fileName).toFile(); + Map libraryPaths = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); + + for (Map.Entry entry : libraryPaths.entrySet()) { + RemapLibrary library = entry.getKey(); + Path path = entry.getValue(); - if (!libPath.exists() && !library.url.isEmpty()) { + if (!library.url.isEmpty()) { Constants.MAIN_LOGGER.info("Downloading remapping library '" + library.fileName + "' from url '" + library.url + "'"); - try (BufferedInputStream inputStream = new BufferedInputStream(new URL(library.url).openStream())) { - try (BufferedOutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(libPath.toPath()))) { - byte[] buffer = new byte[2048]; - - // Increments file size - int length; - int downloaded = 0; - - // Looping until server finishes - while ((length = inputStream.read(buffer)) != -1) { - // Writing data - outputStream.write(buffer, 0, length); - downloaded += length; -// Constants.MAIN_LOGGER.debug("Download Status: " + (downloaded * 100) / (contentLength * 1.0) + "%"); - } - - outputStream.close(); - inputStream.close(); - } - } - - FileUtils.excludeFromZipFile(libPath, library.toExclude); + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.downloadFile(library.url, path); + FileUtils.excludeFromZipFile(path.toFile(), library.toExclude); Constants.MAIN_LOGGER.info("Remapping library ready for use."); - } else if (!libPath.exists() && library.path != null) { + } else if (library.path != null) { Constants.MAIN_LOGGER.info("Extracting remapping library '" + library.fileName + "' from mod jar."); - FileUtils.copyFile(library.path, libPath.toPath()); + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.copyZipFile(library.path, path); Constants.MAIN_LOGGER.info("Remapping library ready for use."); } } @@ -346,7 +338,7 @@ private static void preloadClasses() { "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer", "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", - "fr.catcore.modremapperapi.utils.RefmapJson", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", "fr.catcore.modremapperapi.remapping.MapEntryType", "fr.catcore.modremapperapi.remapping.MappingBuilder", "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", diff --git a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java index 2a213e0..d6e90a8 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java @@ -13,7 +13,7 @@ import java.util.zip.ZipOutputStream; public class FileUtils { - + @Deprecated public static void writeTextFile(Collection lines, File file) { file.getParentFile().mkdirs(); try { @@ -30,6 +30,7 @@ public static void writeTextFile(Collection lines, File file) { } } + @Deprecated public static List readTextSource(String path) { List result = new ArrayList<>(); try { @@ -90,32 +91,8 @@ public static void excludeFromZipFile(File file, List excluded) throws I tempFile.delete(); } + @Deprecated public static void copyFile(Path original, Path copy) throws IOException { - copy.toFile().delete(); - - ZipInputStream zin = new ZipInputStream(Files.newInputStream(original)); - ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(copy)); - - ZipEntry entry = zin.getNextEntry(); - byte[] buf = new byte[1024]; - - while (entry != null) { - String zipEntryName = entry.getName(); - - zout.putNextEntry(new ZipEntry(zipEntryName)); - // Transfer bytes from the ZIP file to the output file - int len; - while ((len = zin.read(buf)) > 0) { - zout.write(buf, 0, len); - } - - entry = zin.getNextEntry(); - } - - // Close the streams - zin.close(); - // Compress the files - // Complete the ZIP file - zout.close(); + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.copyZipFile(original, copy); } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java index 686c949..db0797c 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java @@ -5,6 +5,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.tinyremapper.NonClassCopyMode; import net.fabricmc.tinyremapper.OutputConsumerPath; @@ -15,7 +16,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.*; -import java.util.stream.Collectors; @ApiStatus.Internal public class MinecraftRemapper { @@ -26,11 +26,11 @@ private static Collection getMinecraftJar(Collection sourcePaths, St Files.createDirectories(targetFolder); } - Map paths = computeLibraryPaths(sourcePaths, target); + Map paths = CacheUtils.computeLibraryPaths(sourcePaths, target); - if (exist(paths.values())) return paths.values(); + if (FileUtils.exist(paths.values())) return paths.values(); - delete(paths.values()); + FileUtils.delete(paths.values()); TinyRemapper.Builder builder = TinyRemapper .newRemapper() @@ -58,32 +58,6 @@ private static Collection getMinecraftJar(Collection sourcePaths, St return paths.values(); } - @ApiStatus.Internal - public static Map computeLibraryPaths(Collection sourcePaths, String target) { - return sourcePaths.stream().collect(Collectors.toMap(p -> p, - p -> CacheUtils.getLibraryPath(target).resolve(p.toFile().getName()))); - } - - @ApiStatus.Internal - public static boolean exist(Collection paths) { - for (Path path : paths) { - if (!Files.exists(path)) return false; - } - - return true; - } - - @ApiStatus.Internal - public static void delete(Collection paths) { - for (Path path : paths) { - try { - Files.deleteIfExists(path); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - @ApiStatus.Internal public static void addMinecraftJar(TinyRemapper remapper) throws IOException { Collection classPath; diff --git a/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapJson.java similarity index 84% rename from src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapJson.java index 168bf6f..b09f442 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/RefmapJson.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapJson.java @@ -1,6 +1,5 @@ -package fr.catcore.modremapperapi.utils; +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; import net.fabricmc.tinyremapper.TinyRemapper; import java.util.HashMap; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java index b8c6b43..8b6cd75 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java @@ -2,7 +2,6 @@ import com.google.gson.Gson; import fr.catcore.modremapperapi.remapping.RemapUtil; -import fr.catcore.modremapperapi.utils.RefmapJson; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.api.TrRemapper; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java index fbe59ab..07f66a2 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java @@ -1,9 +1,15 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.utils; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; import net.fabricmc.loader.api.FabricLoader; import org.jetbrains.annotations.ApiStatus; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; +import java.util.Collection; +import java.util.Map; +import java.util.stream.Collectors; @ApiStatus.Internal public class CacheUtils { @@ -21,6 +27,23 @@ public static Path getLibraryPath(String pathName) { return LIBRARY_FOLDER.resolve(pathName); } + @ApiStatus.Internal + public static Map computeLibraryPaths(Collection sourcePaths, String target) { + return sourcePaths.stream().collect(Collectors.toMap(p -> p, + p -> CacheUtils.getLibraryPath(target).resolve(p.toFile().getName()))); + } + + @ApiStatus.Internal + public static Map computeExtraLibraryPaths(Collection sourcePaths, String target) { + return sourcePaths.stream() + .collect(Collectors.toMap(p -> p, + p -> CacheUtils.getLibraryPath(target).resolve(p.fileName))) + .entrySet() + .stream() + .filter(entry -> !Files.exists(entry.getValue())) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + static { BASE_FOLDER.toFile().mkdirs(); MAIN_FOLDER.toFile().mkdirs(); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java new file mode 100644 index 0000000..0c99029 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java @@ -0,0 +1,92 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.utils; + +import org.jetbrains.annotations.ApiStatus; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; +import java.util.zip.ZipOutputStream; + +@ApiStatus.Internal +public class FileUtils { + + @ApiStatus.Internal + public static boolean exist(Collection paths) { + for (Path path : paths) { + if (!Files.exists(path)) return false; + } + + return true; + } + + @ApiStatus.Internal + public static void delete(Collection paths) { + for (Path path : paths) { + try { + Files.deleteIfExists(path); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @ApiStatus.Internal + public static void downloadFile(String url, Path target) throws IOException { + try (BufferedInputStream inputStream = new BufferedInputStream(new URL(url).openStream())) { + try (BufferedOutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(target))) { + byte[] buffer = new byte[2048]; + + // Increments file size + int length; + int downloaded = 0; + + // Looping until server finishes + while ((length = inputStream.read(buffer)) != -1) { + // Writing data + outputStream.write(buffer, 0, length); + downloaded += length; +// Constants.MAIN_LOGGER.debug("Download Status: " + (downloaded * 100) / (contentLength * 1.0) + "%"); + } + + outputStream.close(); + inputStream.close(); + } + } + } + + @ApiStatus.Internal + public static void copyZipFile(Path original, Path target) throws IOException { + target.toFile().delete(); + + ZipInputStream zin = new ZipInputStream(Files.newInputStream(original)); + ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(target)); + + ZipEntry entry = zin.getNextEntry(); + byte[] buf = new byte[1024]; + + while (entry != null) { + String zipEntryName = entry.getName(); + + zout.putNextEntry(new ZipEntry(zipEntryName)); + // Transfer bytes from the ZIP file to the output file + int len; + while ((len = zin.read(buf)) > 0) { + zout.write(buf, 0, len); + } + + entry = zin.getNextEntry(); + } + + // Close the streams + zin.close(); + // Compress the files + // Complete the ZIP file + zout.close(); + } +} From 32f01ffa49f279b28c5587c4e66db53680ab95d5 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Tue, 11 Mar 2025 23:00:22 +0100 Subject: [PATCH 04/15] Unshallow CI git clone to improve Sonar support --- .github/workflows/build_and_publish.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build_and_publish.yml b/.github/workflows/build_and_publish.yml index c1884d1..e18c984 100644 --- a/.github/workflows/build_and_publish.yml +++ b/.github/workflows/build_and_publish.yml @@ -5,6 +5,8 @@ runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + fetch-depth: '0' - name: Validate Gradle Wrapper uses: gradle/wrapper-validation-action@v3 - name: Set up JDK 17 From 79b5286fb331e161cec300e25d700002a94c2247 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Wed, 12 Mar 2025 21:37:39 +0100 Subject: [PATCH 05/15] Improve CI --- .github/workflows/build_and_publish.yml | 5 +++-- .github/workflows/pull_request.yml | 29 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/pull_request.yml diff --git a/.github/workflows/build_and_publish.yml b/.github/workflows/build_and_publish.yml index e18c984..30cac39 100644 --- a/.github/workflows/build_and_publish.yml +++ b/.github/workflows/build_and_publish.yml @@ -1,5 +1,5 @@ name: Build and Publish - on: [push, pull_request, workflow_dispatch] + on: push jobs: build: runs-on: ubuntu-latest @@ -21,7 +21,8 @@ - name: Test run: ./gradlew test check - - name: Sonar + - if: github.repository == 'FabricCompatibilityLayers/Mod-Remapping-API' + name: Sonar run: ./gradlew jacocoTestCoverageVerification jacocoTestReport sonar env: SONAR_URL: ${{ secrets.SONAR_URL }} diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..aa0172c --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,29 @@ + name: Build and Publish + on: [pull_request] + jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: temurin + + - name: Build + run: ./gradlew build -x test + + - name: Test + run: ./gradlew test check + + - name: Store reports if any + if: failure() + uses: actions/upload-artifact@v4 + with: + name: reports + path: | + **/build/reports/ + **/build/test-results/ \ No newline at end of file From 01752fe6907a78cd06792c1cecb2c30c1ad5966d Mon Sep 17 00:00:00 2001 From: Cat Core Date: Wed, 12 Mar 2025 22:31:23 +0100 Subject: [PATCH 06/15] Continue switching File Handling to nio apis. --- .../modremapperapi/remapping/RemapUtil.java | 58 ++----- .../modremapperapi/utils/FileUtils.java | 46 +----- .../modremappingapi/impl/ModDiscoverer.java | 123 ++------------ .../modremappingapi/impl/utils/FileUtils.java | 155 +++++++++++++++++- 4 files changed, 188 insertions(+), 194 deletions(-) diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index e7d3a3c..17b51b2 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -1,7 +1,6 @@ package fr.catcore.modremapperapi.remapping; import fr.catcore.modremapperapi.utils.Constants; -import fr.catcore.modremapperapi.utils.FileUtils; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; @@ -13,6 +12,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; @@ -25,12 +25,11 @@ import org.jetbrains.annotations.ApiStatus; import java.io.*; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; import java.util.function.Supplier; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; public class RemapUtil { private static List remappers; @@ -43,8 +42,10 @@ public class RemapUtil { private static String defaultPackage = ""; + @ApiStatus.Internal public static final List MC_CLASS_NAMES = new ArrayList<>(); + @ApiStatus.Internal public static void init(List modRemappers) { remappers = modRemappers; @@ -85,7 +86,7 @@ public static void init(List pathMap) { Constants.MAIN_LOGGER.debug("Starting jar remapping!"); preloadClasses(); @@ -138,32 +140,19 @@ public static void remapMods(Map pathMap) { MappingsUtilsImpl.writeFullMappings(); } + @ApiStatus.Internal public static List makeModMappings(Path modPath) { File path = modPath.toFile(); List files = new ArrayList<>(); + if (path.isFile()) { try { - FileInputStream fileinputstream = new FileInputStream(path); - ZipInputStream zipinputstream = new ZipInputStream(fileinputstream); - - while (true) { - ZipEntry zipentry = zipinputstream.getNextEntry(); - if (zipentry == null) { - zipinputstream.close(); - fileinputstream.close(); - break; - } - - String s1 = zipentry.getName(); - if (!zipentry.isDirectory()) { - files.add(s1.replace("\\", "/")); - } - } + files.addAll(FileUtils.listZipContent(modPath)); } catch (IOException e) { throw new RuntimeException(e); } } else if (path.isDirectory()) { - files.addAll(generateFolderMappings(path.listFiles())); + files.addAll(FileUtils.listDirectoryContent(path.listFiles())); } List classes = new ArrayList<>(); @@ -182,6 +171,7 @@ public static List makeModMappings(Path modPath) { return files; } + @ApiStatus.Internal public static void generateModMappings() { try { MODS_TREE.visitEnd(); @@ -195,6 +185,7 @@ public static void generateModMappings() { MappingsUtilsImpl.addMappingsToContext(MODS_TREE); } + @ApiStatus.Internal public static void writeMcMappings() { try { MappingWriter writer = MappingWriter.create(Constants.MC_MAPPINGS_FILE.toPath(), MappingFormat.TINY_2_FILE); @@ -204,23 +195,6 @@ public static void writeMcMappings() { } } - private static List generateFolderMappings(File[] files) { - List list = new ArrayList<>(); - - for (File file : files) { - if (file.isFile()) list.add(file.getName()); - else if (file.isDirectory()) { - String name = file.getName(); - - for (String fileName : generateFolderMappings(file.listFiles())) { - list.add(name + "/" + fileName); - } - } - } - - return list; - } - @Deprecated public static class MappingList extends ArrayList { public MappingList() { diff --git a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java index d6e90a8..8ea59be 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java @@ -3,14 +3,11 @@ import net.fabricmc.loader.impl.launch.FabricLauncherBase; import java.io.*; -import java.nio.file.Files; +import java.net.URISyntaxException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; public class FileUtils { @Deprecated @@ -51,44 +48,13 @@ public static List readTextSource(String path) { return result; } + @Deprecated public static void excludeFromZipFile(File file, List excluded) throws IOException { - File tempFile = new File(file.getAbsolutePath() + ".tmp"); - tempFile.delete(); - tempFile.deleteOnExit(); - - boolean renameOk = file.renameTo(tempFile); - if (!renameOk) { - throw new RuntimeException("could not rename the file " + file.getAbsolutePath() + " to " + tempFile.getAbsolutePath()); - } - - ZipInputStream zin = new ZipInputStream(Files.newInputStream(tempFile.toPath())); - ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(file.toPath())); - - ZipEntry entry = zin.getNextEntry(); - byte[] buf = new byte[1024]; - - while (entry != null) { - String zipEntryName = entry.getName(); - boolean toBeDeleted = excluded.contains(zipEntryName); - - if (!toBeDeleted) { - zout.putNextEntry(new ZipEntry(zipEntryName)); - // Transfer bytes from the ZIP file to the output file - int len; - while ((len = zin.read(buf)) > 0) { - zout.write(buf, 0, len); - } - } - - entry = zin.getNextEntry(); + try { + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.removeEntriesFromZip(file.toPath(), excluded); + } catch (URISyntaxException e) { + throw new RuntimeException(e); } - - // Close the streams - zin.close(); - // Compress the files - // Complete the ZIP file - zout.close(); - tempFile.delete(); } @Deprecated diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index d6c485f..d372d16 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -1,28 +1,24 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; import fr.catcore.modremapperapi.utils.Constants; -import fr.catcore.modremapperapi.utils.FileUtils; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.launch.FabricLauncherBase; import org.spongepowered.include.com.google.common.collect.ImmutableList; import java.io.File; import java.io.FileInputStream; -import java.io.FileOutputStream; import java.io.IOException; -import java.net.URI; import java.net.URISyntaxException; import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; -import java.util.zip.ZipOutputStream; public class ModDiscoverer { private static final Map> EXCLUDED = new HashMap<>(); @@ -40,21 +36,24 @@ protected static void init(List modRemappers, boolean remapClassEdi for (ModRemapper remapper : modRemappers) { for (String jarFolder : remapper.getJarFolders()) { - File mcSubFolder = new File(FabricLoader.getInstance().getGameDir().toFile(), jarFolder); - File cacheFolder = CacheUtils.getCachePath(jarFolder).toFile(); + Path mcSubFolder = FabricLoader.getInstance().getGameDir().resolve(jarFolder); + Path cacheFolder = CacheUtils.getCachePath(jarFolder); - if (!mcSubFolder.exists()) mcSubFolder.mkdirs(); - if (!cacheFolder.exists()) cacheFolder.mkdirs(); + try { + if (!Files.exists(mcSubFolder)) Files.createDirectories(mcSubFolder); + if (!Files.exists(cacheFolder)) Files.createDirectories(cacheFolder); + else io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.emptyDir(cacheFolder); - emptyDir(cacheFolder); - - mods.addAll(discoverModsInFolder(mcSubFolder, cacheFolder)); + mods.addAll(discoverModsInFolder(mcSubFolder.toFile(), cacheFolder.toFile())); + } catch (IOException e) { + e.printStackTrace(); + } } } File mainTempDir = CacheUtils.getCachePath("temp").toFile(); if (mainTempDir.exists()) { - emptyDir(mainTempDir); + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.emptyDir(mainTempDir.toPath()); } Map modPaths = mods.stream() @@ -76,74 +75,6 @@ protected static void init(List modRemappers, boolean remapClassEdi modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath); } - private static void emptyDir(File mainTempDir) { - try { - Files.walkFileTree(mainTempDir.toPath(), new FileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult visitFileFailed(Path file, IOException exc) { - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut, boolean root) throws IOException { - if (fileToZip.isHidden()) { - return; - } - - if (fileToZip.isDirectory()) { - if (!root) { - if (fileName.endsWith("/")) { - zipOut.putNextEntry(new ZipEntry(fileName)); - zipOut.closeEntry(); - } else { - zipOut.putNextEntry(new ZipEntry(fileName + "/")); - zipOut.closeEntry(); - } - } - - File[] children = fileToZip.listFiles(); - - for (File childFile : children) { - zipFile(childFile, (root ? "" : fileName + "/") + childFile.getName(), zipOut, false); - } - - return; - } - - FileInputStream fis = new FileInputStream(fileToZip); - ZipEntry zipEntry = new ZipEntry(fileName); - zipOut.putNextEntry(zipEntry); - byte[] bytes = new byte[1024]; - int length; - - while ((length = fis.read(bytes)) >= 0) { - zipOut.write(bytes, 0, length); - } - - zipOut.closeEntry(); - } - private static Map excludeClassEdits(Map modPaths) { Map map = new HashMap<>(); Map convertMap = new HashMap<>(); @@ -165,33 +96,13 @@ private static Map excludeClassEdits(Map modPaths) { for (Map.Entry entry : convertMap.entrySet()) { try { - if (entry.getKey().toFile().isDirectory()) { - FileOutputStream fos = new FileOutputStream(entry.getValue().toFile()); - ZipOutputStream zipOut = new ZipOutputStream(fos); - - File fileToZip = entry.getKey().toFile(); - zipFile(fileToZip, fileToZip.getName(), zipOut, true); - zipOut.close(); + if (Files.isDirectory(entry.getKey())) { + io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.zipFolder(entry.getKey(), entry.getValue()); } else { Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING); } - /* Define ZIP File System Properies in HashMap */ - Map zip_properties = new HashMap<>(); - /* We want to read an existing ZIP File, so we set this to False */ - zip_properties.put("create", "false"); - /* Specify the encoding as UTF -8 */ - zip_properties.put("encoding", "UTF-8"); - - try (FileSystem zipfs = FileSystems.newFileSystem(new URI("jar:" + entry.getValue().toUri()), zip_properties)) { - for (String clName : RemapUtil.MC_CLASS_NAMES) { - Path classPath = zipfs.getPath("/" + clName + ".class"); - - if (Files.exists(classPath)) { - Files.delete(classPath); - } - } - } + FileUtils.removeEntriesFromZip(entry.getValue(), RemapUtil.MC_CLASS_NAMES); } catch (IOException | URISyntaxException e) { e.printStackTrace(); errored.add(entry.getValue()); @@ -285,10 +196,10 @@ private static List discoverModsInFolder(File folder, File destination if (!modName.isEmpty()) { if (EXCLUDED.containsKey(modName.get(0).modName)) { - FileUtils.excludeFromZipFile(file, EXCLUDED.get(modName.get(0).modName)); + FileUtils.removeEntriesFromZip(file.toPath(), EXCLUDED.get(modName.get(0).modName)); } } - } catch (IOException e) { + } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java index 0c99029..7f63730 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java @@ -2,13 +2,13 @@ import org.jetbrains.annotations.ApiStatus; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.IOException; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; import java.net.URL; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collection; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; import java.util.zip.ZipOutputStream; @@ -89,4 +89,147 @@ public static void copyZipFile(Path original, Path target) throws IOException { // Complete the ZIP file zout.close(); } + + @ApiStatus.Internal + public static List listZipContent(Path path) throws IOException { + List files = new ArrayList<>(); + + try (ZipInputStream zin = new ZipInputStream(Files.newInputStream(path))) { + while (true) { + ZipEntry entry = zin.getNextEntry(); + if (entry == null) { + break; + } + + String name = entry.getName(); + if (!entry.isDirectory()) { + files.add(name.replace("\\", "/")); + } + } + } + + return files; + } + + @ApiStatus.Internal + public static List listDirectoryContent(File[] files) { + List list = new ArrayList<>(); + + for (File file : files) { + if (file.isDirectory()) { + String name = file.getName(); + + for (String fileName : listDirectoryContent(file.listFiles())) { + list.add(name + "/" + fileName); + } + } else if (file.isFile()) { + list.add(file.getName()); + } + } + + return list; + } + + @ApiStatus.Internal + public static void emptyDir(Path dir) { + try { + Files.walkFileTree(dir, new FileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path file, IOException exc) { + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @ApiStatus.Internal + public static void zipFolder(Path input, Path output) throws IOException { + try (ZipOutputStream zout = new ZipOutputStream(Files.newOutputStream(output))) { + File fileToZip = input.toFile(); + + zipFile(fileToZip, fileToZip.getName(), zout, true); + } + } + + private static void zipFile(File fileToZip, String fileName, ZipOutputStream zipOut, boolean root) throws IOException { + if (fileToZip.isHidden()) { + return; + } + + if (fileToZip.isDirectory()) { + if (!root) { + if (fileName.endsWith("/")) { + zipOut.putNextEntry(new ZipEntry(fileName)); + zipOut.closeEntry(); + } else { + zipOut.putNextEntry(new ZipEntry(fileName + "/")); + zipOut.closeEntry(); + } + } + + File[] children = fileToZip.listFiles(); + + for (File childFile : children) { + zipFile(childFile, (root ? "" : fileName + "/") + childFile.getName(), zipOut, false); + } + + return; + } + + ZipEntry zipEntry = new ZipEntry(fileName); + zipOut.putNextEntry(zipEntry); + + try (FileInputStream fis = new FileInputStream(fileToZip)) { + byte[] bytes = new byte[1024]; + int length; + + while ((length = fis.read(bytes)) >= 0) { + zipOut.write(bytes, 0, length); + } + } + + zipOut.closeEntry(); + } + + /* Define ZIP File System Properies in HashMap */ + private static final Map ZIP_PROPERTIES = new HashMap<>(); + + static { + /* We want to read an existing ZIP File, so we set this to False */ + ZIP_PROPERTIES.put("create", "false"); + /* Specify the encoding as UTF-8 */ + ZIP_PROPERTIES.put("encoding", "UTF-8"); + } + + @ApiStatus.Internal + public static void removeEntriesFromZip(Path zipPath, List entries) throws IOException, URISyntaxException { + try (FileSystem zipfs = FileSystems.newFileSystem(new URI("jar:" + zipPath.toUri()), ZIP_PROPERTIES)) { + for (String entryName : entries) { + Path entryPath = zipfs.getPath(entryName); + + if (Files.exists(entryPath)) { + Files.delete(entryPath); + } + } + } + } } From f38ae248d872d67c14c790144b3e9f362df29346 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Wed, 12 Mar 2025 23:17:03 +0100 Subject: [PATCH 07/15] More refactoring --- .../modremappingapi/impl/ModDiscoverer.java | 160 +++++++++--------- 1 file changed, 76 insertions(+), 84 deletions(-) diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index d372d16..c55ee20 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -8,17 +8,16 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.launch.FabricLauncherBase; +import org.jetbrains.annotations.NotNull; import org.spongepowered.include.com.google.common.collect.ImmutableList; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; import java.util.*; import java.util.stream.Collectors; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; public class ModDiscoverer { private static final Map> EXCLUDED = new HashMap<>(); @@ -44,8 +43,8 @@ protected static void init(List modRemappers, boolean remapClassEdi if (!Files.exists(cacheFolder)) Files.createDirectories(cacheFolder); else io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.emptyDir(cacheFolder); - mods.addAll(discoverModsInFolder(mcSubFolder.toFile(), cacheFolder.toFile())); - } catch (IOException e) { + mods.addAll(discoverModsInFolder(mcSubFolder, cacheFolder)); + } catch (IOException | URISyntaxException e) { e.printStackTrace(); } } @@ -97,7 +96,7 @@ private static Map excludeClassEdits(Map modPaths) { for (Map.Entry entry : convertMap.entrySet()) { try { if (Files.isDirectory(entry.getKey())) { - io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.zipFolder(entry.getKey(), entry.getValue()); + FileUtils.zipFolder(entry.getKey(), entry.getValue()); } else { Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING); } @@ -114,97 +113,90 @@ private static Map excludeClassEdits(Map modPaths) { return map; } - private static List discoverModsInFolder(File folder, File destination) { - List mods = new ArrayList<>(); + private static Optional discoverFolderMod(Path folder, Path destinationFolder) throws IOException { + String name = folder.getFileName().toString().replace(" ", "_"); + Path destination = destinationFolder.resolve(name + ".zip"); - File[] folderFiles = folder.listFiles(); - if (!folder.isDirectory() || folderFiles == null) return ImmutableList.of(); + final boolean[] hasClasses = {false}; - for (File file : folderFiles) { - String name = file.getName().replace(" ", "_"); - if (file.isDirectory() || (file.isFile() && (name.endsWith(".jar") || name.endsWith(".zip")))) { - File remappedFile = new File(destination, name); + Files.walkFileTree(folder, new SimpleFileVisitor() { + @Override + public @NotNull FileVisitResult visitFile(Path file, @NotNull BasicFileAttributes attrs) throws IOException { + if (file.toString().endsWith(".class")) { + hasClasses[0] = true; + return FileVisitResult.TERMINATE; + } - List modName = new ArrayList<>(); + return super.visitFile(file, attrs); + } + }); + + if (hasClasses[0]) { + return Optional.of( + new DefaultModEntry( + name, + folder.toFile(), + destination.toFile() + ) + ); + } - boolean hasClass = false; - boolean fabric = false; + return Optional.empty(); + } - File[] fileFiles = file.listFiles(); + private static Optional discoverFileMod(Path file, Path destinationFolder) throws IOException { + String fileName = file.getFileName().toString().replace(" ", "_"); + String modName = fileName.replace(".jar", "").replace(".zip", ""); - if (file.isDirectory() && fileFiles != null) { - remappedFile = new File(destination, name + ".zip"); - for (File subFile : fileFiles) { - String subName = subFile.getName(); - if (subFile.isFile()) { - if (subName.endsWith(".class")) { - hasClass = true; - } - } - } + List entries = FileUtils.listZipContent(file); - if (/* modName.isEmpty() && */ hasClass) { - modName.add(new DefaultModEntry( - name.replace(".zip", "").replace(".jar", ""), - remappedFile, - file - )); - } + for (String entry : entries) { + if (Objects.equals(entry, "/fabric.mod.json")) break; - if (!modName.isEmpty() && EXCLUDED.containsKey(modName.get(0).modName)) { - for (String excluded : - EXCLUDED.get(modName.get(0).modName)) { - File excludedFile = new File(file, excluded); - if (excludedFile.delete()) { - Constants.MAIN_LOGGER.debug("File deleted: " + excludedFile.getName()); - } - } - } - } else { - try { - FileInputStream fileinputstream = new FileInputStream(file); - ZipInputStream zipinputstream = new ZipInputStream(fileinputstream); - while (true) { - ZipEntry zipentry = zipinputstream.getNextEntry(); - if (zipentry == null) { - zipinputstream.close(); - fileinputstream.close(); - break; - } - - String s1 = zipentry.getName(); - String[] ss = s1.split("/"); - String s2 = ss[ss.length - 1]; - if (!zipentry.isDirectory()) { - if (s2.equals("fabric.mod.json")) { -// modName.clear(); - fabric = true; - break; - } else if (s2.endsWith(".class")) { - hasClass = true; - } - } - } + if (entry.endsWith(".class")) { + return Optional.of( + new DefaultModEntry( + modName, + file.toFile(), + destinationFolder.resolve(fileName).toFile() + ) + ); + } + } - if (/* modName.isEmpty() && */ hasClass && !fabric) { - modName.add(new DefaultModEntry( - name.replace(".zip", "").replace(".jar", ""), - remappedFile, - file - )); - } + return Optional.empty(); + } + + private static List discoverModsInFolder(Path folder, Path destination) throws IOException, URISyntaxException { + List mods = new ArrayList<>(); + + if (!Files.isDirectory(folder)) return ImmutableList.of(); + + try (DirectoryStream stream = Files.newDirectoryStream(folder)) { + for (Path path : stream) { + String name = path.getFileName().toString(); - if (!modName.isEmpty()) { - if (EXCLUDED.containsKey(modName.get(0).modName)) { - FileUtils.removeEntriesFromZip(file.toPath(), EXCLUDED.get(modName.get(0).modName)); - } + if (Files.isDirectory(path)) { + discoverFolderMod(path, destination) + .ifPresent(mods::add); + } else if (Files.exists(path) && (name.endsWith(".jar") || name.endsWith(".zip"))) { + discoverFileMod(path, destination) + .ifPresent(mods::add); + } + } + } + + for (ModEntry modEntry : mods) { + if (EXCLUDED.containsKey(modEntry.modId)) { + if (Files.isDirectory(modEntry.file.toPath())) { + for (String excluded : EXCLUDED.get(modEntry.modId)) { + if (Files.deleteIfExists(modEntry.file.toPath().resolve(excluded))) { + Constants.MAIN_LOGGER.debug("File deleted: " + modEntry.file.toPath().resolve(excluded)); } - } catch (IOException | URISyntaxException e) { - throw new RuntimeException(e); } + } else { + FileUtils.removeEntriesFromZip(modEntry.file.toPath(), EXCLUDED.get(modEntry.modId)); } - - mods.addAll(modName); } } From cd8a8771afeef92cda856115984dccb0adf284f9 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Thu, 13 Mar 2025 22:59:52 +0100 Subject: [PATCH 08/15] More files related changes --- .../modremapperapi/utils/FileUtils.java | 1 + .../modremappingapi/impl/DefaultModEntry.java | 4 +- .../modremappingapi/impl/ModDiscoverer.java | 62 +++++++++++-------- .../modremappingapi/impl/ModEntry.java | 8 +-- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java index 8ea59be..23d958e 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/FileUtils.java @@ -9,6 +9,7 @@ import java.util.Collection; import java.util.List; +@Deprecated public class FileUtils { @Deprecated public static void writeTextFile(Collection lines, File file) { diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java index d72b631..21e539a 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java @@ -1,9 +1,9 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; -import java.io.File; +import java.nio.file.Path; public class DefaultModEntry extends ModEntry { - protected DefaultModEntry(String modName, File file, File original) { + protected DefaultModEntry(String modName, Path file, Path original) { super(modName, modName, file, original); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index c55ee20..dffa1d2 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -11,7 +11,6 @@ import org.jetbrains.annotations.NotNull; import org.spongepowered.include.com.google.common.collect.ImmutableList; -import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.file.*; @@ -41,7 +40,7 @@ protected static void init(List modRemappers, boolean remapClassEdi try { if (!Files.exists(mcSubFolder)) Files.createDirectories(mcSubFolder); if (!Files.exists(cacheFolder)) Files.createDirectories(cacheFolder); - else io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.emptyDir(cacheFolder); + else FileUtils.emptyDir(cacheFolder); mods.addAll(discoverModsInFolder(mcSubFolder, cacheFolder)); } catch (IOException | URISyntaxException e) { @@ -50,17 +49,24 @@ protected static void init(List modRemappers, boolean remapClassEdi } } - File mainTempDir = CacheUtils.getCachePath("temp").toFile(); - if (mainTempDir.exists()) { - io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils.emptyDir(mainTempDir.toPath()); + Path mainTempDir = CacheUtils.getCachePath("temp"); + + if (Files.exists(mainTempDir)) { + FileUtils.emptyDir(mainTempDir); + } else { + try { + Files.createDirectory(mainTempDir); + } catch (IOException e) { + throw new RuntimeException(e); + } } Map modPaths = mods.stream() - .filter(entry -> entry.original != null) - .collect(Collectors.toMap(entry -> entry.original.toPath(), entry -> entry.file.toPath())); + .filter(entry -> Files.exists(entry.original)) + .collect(Collectors.toMap(entry -> entry.original, entry -> entry.file)); if (!remapClassEdits) { - modPaths = excludeClassEdits(modPaths); + modPaths = excludeClassEdits(modPaths, mainTempDir); } for (Path path : modPaths.keySet()) { @@ -74,21 +80,25 @@ protected static void init(List modRemappers, boolean remapClassEdi modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath); } - private static Map excludeClassEdits(Map modPaths) { + private static Map excludeClassEdits(Map modPaths, Path tempFolder) { Map map = new HashMap<>(); Map convertMap = new HashMap<>(); - File mainTempDir = CacheUtils.getCachePath("temp").toFile(); - mainTempDir.mkdirs(); - - for (Map.Entry entry : modPaths.entrySet()) { - File tempDir = new File(mainTempDir, entry.getValue().toFile().getParentFile().getName()); - if (!tempDir.exists()) tempDir.mkdir(); + Path tempDir = tempFolder.resolve(entry.getValue().getParent().getFileName().toString()); + + if (!Files.exists(tempDir)) { + try { + Files.createDirectory(tempDir); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } - File tempFile = new File(tempDir, entry.getValue().toFile().getName()); - map.put(tempFile.toPath(), entry.getValue()); - convertMap.put(entry.getKey(), tempFile.toPath()); + Path tempFile = tempDir.resolve(entry.getValue().getFileName().toString()); + map.put(tempFile, entry.getValue()); + convertMap.put(entry.getKey(), tempFile); } List errored = new ArrayList<>(); @@ -135,8 +145,8 @@ private static Optional discoverFolderMod(Path folder, Path destinatio return Optional.of( new DefaultModEntry( name, - folder.toFile(), - destination.toFile() + folder, + destination ) ); } @@ -157,8 +167,8 @@ private static Optional discoverFileMod(Path file, Path destinationFol return Optional.of( new DefaultModEntry( modName, - file.toFile(), - destinationFolder.resolve(fileName).toFile() + file, + destinationFolder.resolve(fileName) ) ); } @@ -188,14 +198,14 @@ private static List discoverModsInFolder(Path folder, Path destination for (ModEntry modEntry : mods) { if (EXCLUDED.containsKey(modEntry.modId)) { - if (Files.isDirectory(modEntry.file.toPath())) { + if (Files.isDirectory(modEntry.file)) { for (String excluded : EXCLUDED.get(modEntry.modId)) { - if (Files.deleteIfExists(modEntry.file.toPath().resolve(excluded))) { - Constants.MAIN_LOGGER.debug("File deleted: " + modEntry.file.toPath().resolve(excluded)); + if (Files.deleteIfExists(modEntry.file.resolve(excluded))) { + Constants.MAIN_LOGGER.debug("File deleted: " + modEntry.file.resolve(excluded)); } } } else { - FileUtils.removeEntriesFromZip(modEntry.file.toPath(), EXCLUDED.get(modEntry.modId)); + FileUtils.removeEntriesFromZip(modEntry.file, EXCLUDED.get(modEntry.modId)); } } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java index 68899bf..90644c8 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java @@ -1,15 +1,15 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; -import java.io.File; +import java.nio.file.Path; public abstract class ModEntry { public final String modName; public final String modId; - public final File file; - public final File original; + public final Path file; + public final Path original; - protected ModEntry(String modName, String modId, File file, File original) { + protected ModEntry(String modName, String modId, Path file, Path original) { this.modName = modName; this.modId = modId; this.file = file; From 96dcb66dbb6a523fd45cd4e3c5e4572b1fb2e4a2 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Thu, 13 Mar 2025 23:00:06 +0100 Subject: [PATCH 09/15] Some mappings related refactoring --- .../modremapperapi/remapping/RemapUtil.java | 16 ++-- .../modremapperapi/utils/MappingsUtils.java | 3 +- .../impl/MappingsUtilsImpl.java | 61 +------------ .../impl/compatibility/V0ModRemapper.java | 8 +- .../impl/mappings/MappingTreeHelper.java | 90 +++++++++++++++++-- .../impl/mappings/MappingsRegistry.java | 7 ++ .../remapper/minecraft/MinecraftRemapper.java | 3 +- 7 files changed, 110 insertions(+), 78 deletions(-) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 17b51b2..36ea5da 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -7,6 +7,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft.MinecraftRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; @@ -91,8 +92,7 @@ public static void init(List namespaces = new ArrayList<>(); - namespaces.add(target); - - mappingVisitor.visitNamespaces(src, namespaces); - } - @ApiStatus.Internal public static void addMappingsToContext(MappingTree mappingTreeView) { try { @@ -385,8 +333,7 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr public static void writeFullMappings() { try { - MappingWriter writer = MappingWriter.create(Constants.FULL_MAPPINGS_FILE.toPath(), MappingFormat.TINY_2_FILE); - FULL_MAPPINGS.accept(writer); + MappingTreeHelper.exportMappings(FULL_MAPPINGS, Constants.FULL_MAPPINGS_FILE.toPath()); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/compatibility/V0ModRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/compatibility/V0ModRemapper.java index d778bc3..f980d5d 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/compatibility/V0ModRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/compatibility/V0ModRemapper.java @@ -7,7 +7,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.VisitorInfos; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import net.fabricmc.api.EnvType; import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; @@ -107,13 +107,13 @@ public void afterRemap() { * @return */ private MemoryMappingTree convertMappingList(RemapUtil.MappingList mappingList) { - MemoryMappingTree mappingTree = new MemoryMappingTree(); + MemoryMappingTree mappingTree; try { if (BABRIC) { - MappingsUtilsImpl.initializeMappingTree(mappingTree, "intermediary", "official"); + mappingTree = MappingTreeHelper.createMappingTree("intermediary", "official"); } else { - MappingsUtilsImpl.initializeMappingTree(mappingTree); + mappingTree = MappingTreeHelper.createMappingTree(); } mappingList.accept(mappingTree); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java index e30fedf..0d346b1 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java @@ -1,21 +1,38 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import net.fabricmc.loader.impl.util.log.Log; +import net.fabricmc.loader.impl.util.log.LogCategory; +import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingVisitor; +import net.fabricmc.mappingio.MappingWriter; import net.fabricmc.mappingio.adapter.MappingDstNsReorder; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; -import net.fabricmc.mappingio.tree.MappingTree; -import net.fabricmc.mappingio.tree.MemoryMappingTree; -import net.fabricmc.mappingio.tree.VisitOrder; -import net.fabricmc.mappingio.tree.VisitableMappingTree; - +import net.fabricmc.mappingio.format.MappingFormat; +import net.fabricmc.mappingio.format.tiny.Tiny1FileReader; +import net.fabricmc.mappingio.format.tiny.Tiny2FileReader; +import net.fabricmc.mappingio.tree.*; +import net.fabricmc.tinyremapper.IMappingProvider; +import net.fabricmc.tinyremapper.TinyUtils; +import org.jetbrains.annotations.ApiStatus; + +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.Objects; +@ApiStatus.Internal public class MappingTreeHelper { + + @ApiStatus.Internal public static void mergeIntoNew(VisitableMappingTree result, MappingTree left, MappingTree right) throws IOException { - assert Objects.equals(left.getSrcNamespace(), right.getSrcNamespace()); + if (!Objects.equals(left.getSrcNamespace(), right.getSrcNamespace())) { + throw new RuntimeException("Source namespace mismatch!"); + } result.visitHeader(); @@ -39,6 +56,7 @@ public static void mergeIntoNew(VisitableMappingTree result, MappingTree left, M reorderedRight.accept(result, VisitOrder.createByName()); } + @ApiStatus.Internal public static void merge(VisitableMappingTree main, MappingTree additional) throws IOException { if (!Objects.equals(additional.getSrcNamespace(), main.getSrcNamespace())) { MemoryMappingTree reorder = new MemoryMappingTree(); @@ -63,4 +81,64 @@ public static void merge(VisitableMappingTree main, MappingTree additional) thro reordered.accept(main, VisitOrder.createByInputOrder()); } + + @ApiStatus.Internal + public static MemoryMappingTree readMappings(InputStream stream) throws IOException { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) { + long time = System.currentTimeMillis(); + MemoryMappingTree mappingTree = new MemoryMappingTree(); + + // We will only ever need to read tiny here + // so to strip the other formats from the included copy of mapping IO, don't use MappingReader.read() + reader.mark(4096); + final MappingFormat format = MappingReader.detectFormat(reader); + reader.reset(); + + switch (format) { + case TINY_FILE: + Tiny1FileReader.read(reader, mappingTree); + break; + case TINY_2_FILE: + Tiny2FileReader.read(reader, mappingTree); + break; + default: + throw new UnsupportedOperationException("Unsupported mapping format: " + format); + } + + Log.debug(LogCategory.MAPPINGS, "Loading mappings took %d ms", System.currentTimeMillis() - time); + + return mappingTree; + } + } + + @ApiStatus.Internal + public static IMappingProvider createMappingProvider(MappingTree mappings, String from, String to) { + return TinyUtils.createMappingProvider(mappings, from, to); + } + + @ApiStatus.Internal + public static MemoryMappingTree createMappingTree() throws IOException { + return createMappingTree(MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace()); + } + + @ApiStatus.Internal + public static MemoryMappingTree createMappingTree(String src, String target) throws IOException { + MemoryMappingTree mappingTree = new MemoryMappingTree(); + + mappingTree.visitHeader(); + + List namespaces = new ArrayList<>(); + namespaces.add(target); + + mappingTree.visitNamespaces(src, namespaces); + + return mappingTree; + } + + @ApiStatus.Internal + public static void exportMappings(MappingTreeView mappingTreeView, Path outputPath) throws IOException { + try (MappingWriter writer = MappingWriter.create(outputPath, MappingFormat.TINY_2_FILE)) { + mappingTreeView.accept(writer); + } + } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java new file mode 100644 index 0000000..e107b3e --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java @@ -0,0 +1,7 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class MappingsRegistry { +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java index db0797c..297b38e 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java @@ -4,6 +4,7 @@ import fr.catcore.modremapperapi.utils.Constants; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; @@ -40,7 +41,7 @@ private static Collection getMinecraftJar(Collection sourcePaths, St .ignoreConflicts(true) .fixPackageAccess(true) .withMappings( - MappingsUtilsImpl.createProvider(MappingsUtilsImpl.getMinecraftMappings(), src, target) + MappingTreeHelper.createMappingProvider(MappingsUtilsImpl.getMinecraftMappings(), src, target) ); TinyRemapper remapper = builder.build(); From efa3f79118a33d2e6f59d633739be35994d4a8dd Mon Sep 17 00:00:00 2001 From: Cat Core Date: Fri, 14 Mar 2025 00:18:15 +0100 Subject: [PATCH 10/15] Fix various bugs do to refactoring --- .../modremapperapi/ModRemappingAPI.java | 2 + .../modremapperapi/remapping/RemapUtil.java | 3 +- .../modremappingapi/impl/ModDiscoverer.java | 42 +++++++++++-------- .../impl/utils/CacheUtils.java | 2 +- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java b/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java index 7b01569..6f36cff 100644 --- a/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java +++ b/src/main/java/fr/catcore/modremapperapi/ModRemappingAPI.java @@ -2,6 +2,8 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; +@Deprecated public class ModRemappingAPI { + @Deprecated public static final boolean BABRIC = ModRemappingAPIImpl.BABRIC; } diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 36ea5da..2d58fef 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -311,7 +311,6 @@ private static void preloadClasses() { "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", - "fr.catcore.modremapperapi.remapping.MapEntryType", "fr.catcore.modremapperapi.remapping.MappingBuilder", "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", "fr.catcore.modremapperapi.remapping.MappingBuilder$Type", @@ -529,7 +528,7 @@ private static TinyRemapper makeRemapper(MappingTree... trees) { modRemapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); for (RemapLibrary library : libraries) { - Path libPath = CacheUtils.getLibraryPath(library.fileName); + Path libPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()).resolve(library.fileName); if (Files.exists(libPath)) { remapper.readClassPathAsync(libPath); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index dffa1d2..f51a5da 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -53,17 +53,19 @@ protected static void init(List modRemappers, boolean remapClassEdi if (Files.exists(mainTempDir)) { FileUtils.emptyDir(mainTempDir); - } else { - try { - Files.createDirectory(mainTempDir); - } catch (IOException e) { - throw new RuntimeException(e); - } + } + + try { + Files.createDirectory(mainTempDir); + } catch (IOException e) { + throw new RuntimeException(e); } Map modPaths = mods.stream() .filter(entry -> Files.exists(entry.original)) - .collect(Collectors.toMap(entry -> entry.original, entry -> entry.file)); + .collect(Collectors.groupingBy(entry -> entry.modId)) + .entrySet().stream() + .collect(Collectors.toMap(entry -> entry.getValue().get(0).original, entry -> entry.getValue().get(0).file)); if (!remapClassEdits) { modPaths = excludeClassEdits(modPaths, mainTempDir); @@ -145,8 +147,8 @@ private static Optional discoverFolderMod(Path folder, Path destinatio return Optional.of( new DefaultModEntry( name, - folder, - destination + destination, + folder ) ); } @@ -160,20 +162,26 @@ private static Optional discoverFileMod(Path file, Path destinationFol List entries = FileUtils.listZipContent(file); + boolean found = false; + for (String entry : entries) { - if (Objects.equals(entry, "/fabric.mod.json")) break; + if (entry.contains("fabric.mod.json")) return Optional.empty(); if (entry.endsWith(".class")) { - return Optional.of( - new DefaultModEntry( - modName, - file, - destinationFolder.resolve(fileName) - ) - ); + found = true; } } + if (found) { + return Optional.of( + new DefaultModEntry( + modName, + destinationFolder.resolve(fileName), + file + ) + ); + } + return Optional.empty(); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java index 07f66a2..876a010 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java @@ -17,7 +17,7 @@ public class CacheUtils { public static final Path MAIN_FOLDER = BASE_FOLDER .resolve(VersionHelper.MINECRAFT_VERSION) .resolve(VersionHelper.MOD_VERSION); - public static final Path LIBRARY_FOLDER = BASE_FOLDER.resolve("libs"); + public static final Path LIBRARY_FOLDER = MAIN_FOLDER.resolve("libs"); public static Path getCachePath(String pathName) { return MAIN_FOLDER.resolve(pathName); From 0fc5da21ae0a6f00bdfa65942c98a1ff3604f4fe Mon Sep 17 00:00:00 2001 From: Cat Core Date: Fri, 14 Mar 2025 22:44:30 +0100 Subject: [PATCH 11/15] MappingsRegistry refactoring --- .../modremapperapi/remapping/RemapUtil.java | 320 ++---------------- .../modremapperapi/utils/MappingsUtils.java | 3 +- .../impl/MappingsUtilsImpl.java | 256 +++----------- .../modremappingapi/impl/ModDiscoverer.java | 5 +- .../impl/mappings/MappingTreeHelper.java | 26 ++ .../impl/mappings/MappingsRegistry.java | 128 +++++++ .../impl/remapper/SoftLockFixer.java | 238 +++++++++++++ .../remapper/minecraft/MinecraftRemapper.java | 3 +- .../impl/utils/CacheUtils.java | 1 - .../modremappingapi/impl/utils/FileUtils.java | 13 + 10 files changed, 488 insertions(+), 505 deletions(-) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 2d58fef..5673ec3 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -8,6 +8,8 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.SoftLockFixer; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft.MinecraftRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; @@ -17,8 +19,6 @@ import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; -import net.fabricmc.mappingio.MappingWriter; -import net.fabricmc.mappingio.format.MappingFormat; import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.tinyremapper.*; @@ -35,13 +35,12 @@ public class RemapUtil { private static List remappers; private static MappingTree LOADER_TREE; - private static MappingTree MINECRAFT_TREE; - private static MemoryMappingTree MODS_TREE; @ApiStatus.Internal public static final Map> MIXINED = new HashMap<>(); - private static String defaultPackage = ""; + @ApiStatus.Internal + public static String defaultPackage = ""; @ApiStatus.Internal public static final List MC_CLASS_NAMES = new ArrayList<>(); @@ -61,7 +60,21 @@ public static void init(List> mappings = remapper.getExtraMapping(); - mappings.ifPresent(inputStreamSupplier -> MappingsUtilsImpl.loadExtraMappings(inputStreamSupplier.get())); + mappings.ifPresent(inputStreamSupplier -> { + try { + MappingsRegistry.generateFormattedMappings(inputStreamSupplier.get()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + if (!MappingsRegistry.generated) { + try { + MappingsRegistry.generateFormattedMappings(null); + } catch (IOException e) { + throw new RuntimeException(e); + } } Path sourceLibraryPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()); @@ -76,26 +89,18 @@ public static void init(List pathMap) { Constants.MAIN_LOGGER.debug("Starting jar remapping!"); - preloadClasses(); - TinyRemapper remapper = makeRemapper(MINECRAFT_TREE, LOADER_TREE, MODS_TREE); + SoftLockFixer.preloadClasses(); + TinyRemapper remapper = makeRemapper(MappingsRegistry.FORMATTED, LOADER_TREE, MappingsRegistry.MODS); Constants.MAIN_LOGGER.debug("Remapper created!"); remapFiles(remapper, pathMap); Constants.MAIN_LOGGER.debug("Jar remapping done!"); @@ -140,54 +145,10 @@ public static void remapMods(Map pathMap) { MappingsUtilsImpl.writeFullMappings(); } - @ApiStatus.Internal - public static List makeModMappings(Path modPath) { - File path = modPath.toFile(); - List files = new ArrayList<>(); - - if (path.isFile()) { - try { - files.addAll(FileUtils.listZipContent(modPath)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } else if (path.isDirectory()) { - files.addAll(FileUtils.listDirectoryContent(path.listFiles())); - } - - List classes = new ArrayList<>(); - - for (String file : files) { - if (file.endsWith(".class")) { - String clName = file.replace(".class", ""); - classes.add(clName); - } - } - - io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder mappingBuilder = new MappingBuilderImpl(MODS_TREE); - - classes.forEach(cl -> mappingBuilder.addMapping(cl, (cl.contains("/") ? "" : defaultPackage) + cl)); - - return files; - } - - @ApiStatus.Internal - public static void generateModMappings() { - try { - MODS_TREE.visitEnd(); - - MappingTreeHelper.exportMappings(MODS_TREE, Constants.REMAPPED_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException("Error while generating mods mappings", e); - } - - MappingsUtilsImpl.addMappingsToContext(MODS_TREE); - } - @ApiStatus.Internal public static void writeMcMappings() { try { - MappingTreeHelper.exportMappings(MINECRAFT_TREE, Constants.MC_MAPPINGS_FILE.toPath()); + MappingTreeHelper.exportMappings(MappingsRegistry.FORMATTED, Constants.MC_MAPPINGS_FILE.toPath()); } catch (IOException e) { throw new RuntimeException(e); } @@ -233,8 +194,7 @@ private static MappingTree generateMappings() { mappingTree.visitEnd(); - MappingWriter mappingWriter = MappingWriter.create(Constants.EXTRA_MAPPINGS_FILE.toPath(), MappingFormat.TINY_2_FILE); - mappingTree.accept(mappingWriter); + MappingTreeHelper.exportMappings(mappingTree, Constants.EXTRA_MAPPINGS_FILE.toPath()); } catch (IOException e) { throw new RuntimeException("Error while generating remappers mappings", e); } @@ -242,238 +202,6 @@ private static MappingTree generateMappings() { return mappingTree; } - private static String getLibClassName(String lib, String string) { - if (FabricLoader.getInstance().isDevelopmentEnvironment()) { - return "net.fabricmc." + lib + "." + string; - } - - return "fr.catcore.modremapperapi.impl.lib." + lib + "." + string; - } - - private static void preloadClasses() { - for (String clazz : new String[]{ - "java.io.IOException", - "java.net.URI", - "java.net.URISyntaxException", - "java.nio.file.FileSystem", - "java.nio.file.FileVisitResult", - "java.nio.file.Files", - "java.nio.file.Path", - "java.nio.file.SimpleFileVisitor", - "java.nio.file.attribute.BasicFileAttributes", - "java.util.ArrayDeque", - "java.util.ArrayList", - "java.util.Collection", - "java.util.Collections", - "java.util.HashMap", - "java.util.HashSet", - "java.util.IdentityHashMap", - "java.util.List", - "java.util.Map", - "java.util.Objects", - "java.util.Optional", - "java.util.Queue", - "java.util.Set", - "java.util.concurrent.CompletableFuture", - "java.util.concurrent.ConcurrentHashMap", - "java.util.concurrent.ExecutionException", - "java.util.concurrent.ExecutorService", - "java.util.concurrent.Executors", - "java.util.concurrent.Future", - "java.util.concurrent.TimeUnit", - "java.util.concurrent.atomic.AtomicReference", - "java.util.function.BiConsumer", - "java.util.function.Supplier", - "java.util.regex.Pattern", - "java.util.stream.Collectors", - "java.util.zip.ZipError", - - "org.objectweb.asm.ClassReader", - "org.objectweb.asm.ClassVisitor", - "org.objectweb.asm.ClassWriter", - "org.objectweb.asm.FieldVisitor", - "org.objectweb.asm.MethodVisitor", - "org.objectweb.asm.Opcodes", - "org.objectweb.asm.commons.Remapper", - "org.objectweb.asm.util.CheckClassAdapter", - - "fr.catcore.modremapperapi.api.RemapLibrary", - "fr.catcore.modremapperapi.api.ModRemapper", - "fr.catcore.modremapperapi.utils.BArrayList", - "fr.catcore.modremapperapi.utils.CollectionUtils", - "fr.catcore.modremapperapi.utils.Constants", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModEntry", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModRemapper", - "fr.catcore.modremapperapi.utils.FileUtils", - "fr.catcore.modremapperapi.utils.MappingsUtils", - "fr.catcore.modremapperapi.utils.MixinUtils", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", - "fr.catcore.modremapperapi.remapping.MappingBuilder", - "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", - "fr.catcore.modremapperapi.remapping.MappingBuilder$Type", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAMethodVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper", - "fr.catcore.modremapperapi.remapping.RemapUtil", - "fr.catcore.modremapperapi.remapping.RemapUtil$MappingList", - "fr.catcore.modremapperapi.remapping.VisitorInfos", - "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodNamed", - "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodValue", - "fr.catcore.modremapperapi.remapping.VisitorInfos$Type", - "net.fabricmc.loader.impl.launch.FabricLauncher", - "net.fabricmc.loader.impl.launch.FabricLauncherBase", - "net.fabricmc.loader.api.ObjectShare", - - getLibClassName("tinyremapper", "AsmClassRemapper"), - getLibClassName("tinyremapper", "AsmClassRemapper$AsmAnnotationRemapper"), - getLibClassName("tinyremapper", "AsmClassRemapper$AsmAnnotationRemapper$AsmArrayAttributeAnnotationRemapper"), - getLibClassName("tinyremapper", "AsmClassRemapper$AsmFieldRemapper"), - getLibClassName("tinyremapper", "AsmClassRemapper$AsmMethodRemapper"), - getLibClassName("tinyremapper", "AsmClassRemapper$AsmRecordComponentRemapper"), - getLibClassName("tinyremapper", "AsmRemapper"), - getLibClassName("tinyremapper", "BridgeHandler"), - getLibClassName("tinyremapper", "ClassInstance"), - getLibClassName("tinyremapper", "FileSystemReference"), - getLibClassName("tinyremapper", "IMappingProvider"), - getLibClassName("tinyremapper", "IMappingProvider$MappingAcceptor"), - getLibClassName("tinyremapper", "IMappingProvider$Member"), - getLibClassName("tinyremapper", "InputTag"), - getLibClassName("tinyremapper", "MemberInstance"), - getLibClassName("tinyremapper", "MetaInfFixer"), - getLibClassName("tinyremapper", "MetaInfRemover"), - getLibClassName("tinyremapper", "NonClassCopyMode"), - getLibClassName("tinyremapper", "OutputConsumerPath"), - getLibClassName("tinyremapper", "OutputConsumerPath$1"), - getLibClassName("tinyremapper", "OutputConsumerPath$Builder"), - getLibClassName("tinyremapper", "OutputConsumerPath$ResourceRemapper"), - getLibClassName("tinyremapper", "PackageAccessChecker"), - getLibClassName("tinyremapper", "Propagator"), - getLibClassName("tinyremapper", "TinyRemapper"), - getLibClassName("tinyremapper", "TinyRemapper$1"), - getLibClassName("tinyremapper", "TinyRemapper$1$1"), - getLibClassName("tinyremapper", "TinyRemapper$2"), - getLibClassName("tinyremapper", "TinyRemapper$3"), - getLibClassName("tinyremapper", "TinyRemapper$4"), - getLibClassName("tinyremapper", "TinyRemapper$5"), - getLibClassName("tinyremapper", "TinyRemapper$AnalyzeVisitorProvider"), - getLibClassName("tinyremapper", "TinyRemapper$ApplyVisitorProvider"), - getLibClassName("tinyremapper", "TinyRemapper$Builder"), - getLibClassName("tinyremapper", "TinyRemapper$CLIExtensionProvider"), - getLibClassName("tinyremapper", "TinyRemapper$Direction"), - getLibClassName("tinyremapper", "TinyRemapper$Extension"), - getLibClassName("tinyremapper", "TinyRemapper$LinkedMethodPropagation"), - getLibClassName("tinyremapper", "TinyRemapper$MrjState"), - getLibClassName("tinyremapper", "TinyRemapper$Propagation"), - getLibClassName("tinyremapper", "TinyRemapper$StateProcessor"), - getLibClassName("tinyremapper", "TinyUtils"), - getLibClassName("tinyremapper", "TinyUtils$MappingAdapter"), - getLibClassName("tinyremapper", "VisitTrackingClassRemapper"), - getLibClassName("tinyremapper", "VisitTrackingClassRemapper$VisitKind"), - getLibClassName("tinyremapper", "extension.mixin.common.IMappable"), - getLibClassName("tinyremapper", "extension.mixin.common.MapUtility"), - getLibClassName("tinyremapper", "extension.mixin.common.ResolveUtility"), - getLibClassName("tinyremapper", "extension.mixin.common.StringUtility"), - getLibClassName("tinyremapper", "extension.mixin.common.data.Annotation"), - getLibClassName("tinyremapper", "extension.mixin.common.data.AnnotationElement"), - getLibClassName("tinyremapper", "extension.mixin.common.data.CommonData"), - getLibClassName("tinyremapper", "extension.mixin.common.data.Constant"), - getLibClassName("tinyremapper", "extension.mixin.common.data.Message"), - getLibClassName("tinyremapper", "extension.mixin.common.data.MxClass"), - getLibClassName("tinyremapper", "extension.mixin.common.data.MxMember"), - getLibClassName("tinyremapper", "extension.mixin.common.data.Pair"), - getLibClassName("tinyremapper", "extension.mixin.soft.SoftTargetMixinClassVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.SoftTargetMixinMethodVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.AccessorAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.InvokerAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.MixinAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtConstructorMappable"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtSecondPassAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtSecondPassAnnotationVisitor$1"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.CommonInjectionAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.CommonInjectionAnnotationVisitor$InjectMethodMappable"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionAnnotationVisitor$MemberRemappingVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionsAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionsAnnotationVisitor$DefinitionRemappingVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DescAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.InjectAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyArgAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyArgsAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyConstantAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyExpressionValueAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyReceiverAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyReturnValueAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyVariableAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.RedirectAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.SliceAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapMethodAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapOperationAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapWithConditionAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapWithConditionV2AnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.soft.data.MemberInfo"), - getLibClassName("tinyremapper", "extension.mixin.soft.util.NamedMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinClassVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinFieldVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinMethodVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$1"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$InterfaceAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$SoftImplementsMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor$1"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor$2"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.OverwriteAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.OverwriteAnnotationVisitor$OverwriteMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ShadowAnnotationVisitor"), - getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ShadowAnnotationVisitor$ShadowPrefixMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.data.SoftInterface"), - getLibClassName("tinyremapper", "extension.mixin.hard.data.SoftInterface$Remap"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.CamelPrefixString"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.ConvertibleMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.HardTargetMappable"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.IConvertibleString"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.IdentityString"), - getLibClassName("tinyremapper", "extension.mixin.hard.util.PrefixString"), - getLibClassName("tinyremapper", "extension.mixin.MixinExtension"), - getLibClassName("tinyremapper", "extension.mixin.MixinExtension$AnalyzeVisitorProvider"), - getLibClassName("tinyremapper", "extension.mixin.MixinExtension$AnnotationTarget"), - getLibClassName("tinyremapper", "extension.mixin.MixinExtension$CLIProvider"), - getLibClassName("tinyremapper", "extension.mixin.MixinExtension$PreApplyVisitorProvider"), - getLibClassName("tinyremapper", "api.TrClass"), - getLibClassName("tinyremapper", "api.TrEnvironment"), - getLibClassName("tinyremapper", "api.TrField"), - getLibClassName("tinyremapper", "api.TrLogger"), - getLibClassName("tinyremapper", "api.TrLogger$Level"), - getLibClassName("tinyremapper", "api.TrMember"), - getLibClassName("tinyremapper", "api.TrMember$MemberType"), - getLibClassName("tinyremapper", "api.TrMethod"), - getLibClassName("tinyremapper", "api.TrRemapper"), - - getLibClassName("mappingio", "MappingReader"), - getLibClassName("mappingio", "MappingReader$1"), - getLibClassName("mappingio", "FlatMappingVisitor"), - getLibClassName("mappingio", "MappedElementKind"), - getLibClassName("mappingio", "MappingFlag"), - getLibClassName("mappingio", "MappingUtil"), - getLibClassName("mappingio", "MappingVisitor"), - getLibClassName("mappingio", "MappingWriter"), - getLibClassName("mappingio", "MappingWriter$1") - }) { - try { - Constants.MAIN_LOGGER.debug("Preloading class: " + clazz); - Class.forName(clazz); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } - } - } - /** * Will create remapper with specified trees. */ diff --git a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java index 00f601b..d30feb8 100644 --- a/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java +++ b/src/main/java/fr/catcore/modremapperapi/utils/MappingsUtils.java @@ -2,6 +2,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.tinyremapper.*; @@ -19,7 +20,7 @@ public static String getTargetNamespace() { @Deprecated public static MappingTree getMinecraftMappings() { - return MappingsUtilsImpl.getVanillaMappings(); + return MappingsRegistry.VANILLA; } @Deprecated diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java index 37abf82..2425b96 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java @@ -1,28 +1,13 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; import fr.catcore.modremapperapi.utils.Constants; -import fr.catcore.wfvaio.WhichFabricVariantAmIOn; import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.VersionHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.loader.impl.launch.MappingConfiguration; -import net.fabricmc.loader.impl.util.log.Log; -import net.fabricmc.loader.impl.util.log.LogCategory; import net.fabricmc.mappingio.MappedElementKind; -import net.fabricmc.mappingio.MappingReader; -import net.fabricmc.mappingio.MappingVisitor; -import net.fabricmc.mappingio.MappingWriter; -import net.fabricmc.mappingio.adapter.MappingDstNsReorder; -import net.fabricmc.mappingio.adapter.MappingNsRenamer; -import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; -import net.fabricmc.mappingio.format.MappingFormat; -import net.fabricmc.mappingio.format.tiny.Tiny1FileReader; -import net.fabricmc.mappingio.format.tiny.Tiny2FileReader; import net.fabricmc.mappingio.tree.*; -import net.fabricmc.tinyremapper.IMappingProvider; -import net.fabricmc.tinyremapper.TinyUtils; import net.fabricmc.tinyremapper.api.TrClass; import net.fabricmc.tinyremapper.api.TrEnvironment; import net.fabricmc.tinyremapper.api.TrMethod; @@ -32,38 +17,13 @@ import org.objectweb.asm.Type; import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.net.URLConnection; import java.util.*; import java.util.stream.Collectors; -import java.util.zip.ZipError; @ApiStatus.Internal public class MappingsUtilsImpl { - private static boolean initialized = false; - private static MappingTree VANILLA_MAPPINGS; - private static VisitableMappingTree MINECRAFT_MAPPINGS; - private static VisitableMappingTree FULL_MAPPINGS = new MemoryMappingTree(); - private static String sourceNamespace = "official"; - private static MappingTree EXTRA_MAPPINGS; - - @ApiStatus.Internal - public static MappingTree getVanillaMappings() { - loadMappings(); - - return VANILLA_MAPPINGS; - } - - @ApiStatus.Internal - public static MappingTree getMinecraftMappings() { - loadMappings(); - - return MINECRAFT_MAPPINGS; - } - @ApiStatus.Internal public static String getSourceNamespace() { return sourceNamespace; @@ -74,15 +34,6 @@ public static void setSourceNamespace(String sourceNamespace) { MappingsUtilsImpl.sourceNamespace = sourceNamespace; } - @ApiStatus.Internal - public static void loadExtraMappings(InputStream stream) { - try { - EXTRA_MAPPINGS = MappingTreeHelper.readMappings(stream); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - public static boolean isSourceNamespaceObf() { return Objects.equals(sourceNamespace, "official"); } @@ -99,121 +50,22 @@ public static String getNativeNamespace() { return "official"; } - private static void loadMappings() { - if (initialized) return; - - URL url = MappingConfiguration.class.getClassLoader().getResource("mappings/mappings.tiny"); - - if (url != null) { - try { - URLConnection connection = url.openConnection(); - - VANILLA_MAPPINGS = MappingTreeHelper.readMappings(connection.getInputStream()); - } catch (IOException | ZipError e) { - throw new RuntimeException("Error reading "+url, e); - } - } - - adaptVanillaMappings(); - - if (VANILLA_MAPPINGS == null) { - Log.info(LogCategory.MAPPINGS, "Mappings not present!"); - VANILLA_MAPPINGS = new MemoryMappingTree(); - } - - try { - MINECRAFT_MAPPINGS.accept(FULL_MAPPINGS); - } catch (IOException e) { - e.printStackTrace(); - } - - initialized = true; - } - - private static void adaptVanillaMappings() { - MINECRAFT_MAPPINGS = new MemoryMappingTree(); - - if (VANILLA_MAPPINGS == null) { - return; - } - - Map renames = new HashMap<>(); - boolean switchNamespace = false; - - switch (WhichFabricVariantAmIOn.getVariant()) { - case BABRIC: - renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH), "official"); - switchNamespace = true; - break; - case ORNITHE_V2: - Boolean merged = VersionHelper.predicate(">=1.3"); - if (merged != null && !merged) { - renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH) + "Official", "official"); - switchNamespace = true; - } - break; - case BABRIC_NEW_FORMAT: - renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH) + "Official", "official"); - switchNamespace = true; - break; - default: - break; - } - - MemoryMappingTree tempTree = new MemoryMappingTree(); - MappingVisitor visitor = getMappingVisitor(tempTree, switchNamespace, renames); - - try { - VANILLA_MAPPINGS.accept(visitor); - - if (EXTRA_MAPPINGS == null) { - tempTree.accept(MINECRAFT_MAPPINGS); - } else { - MappingTreeHelper.mergeIntoNew(MINECRAFT_MAPPINGS, tempTree, EXTRA_MAPPINGS); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static @NotNull MappingVisitor getMappingVisitor(MemoryMappingTree tempTree, boolean switchNamespace, Map renames) { - List targetNamespace = new ArrayList<>(); - targetNamespace.add("intermediary"); - - if (VANILLA_MAPPINGS.getDstNamespaces().contains("named")) targetNamespace.add("named"); - - MappingVisitor visitor = tempTree; - - if (switchNamespace) { - visitor = new MappingSourceNsSwitch( - new MappingDstNsReorder( - visitor, - targetNamespace - ), - "official" - ); - } - - visitor = new MappingNsRenamer(visitor, renames); - return visitor; - } - @ApiStatus.Internal public static void addMappingsToContext(MappingTree mappingTreeView) { try { - MappingTreeHelper.merge(FULL_MAPPINGS, mappingTreeView); + MappingTreeHelper.merge(MappingsRegistry.FULL, mappingTreeView); } catch (IOException e) { e.printStackTrace(); } } public static void completeMappingsFromTr(TrEnvironment trEnvironment, String src) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(src); - int trueSrcNamespace = FULL_MAPPINGS.getNamespaceId(FULL_MAPPINGS.getSrcNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(src); + int trueSrcNamespace = MappingsRegistry.FULL.getNamespaceId(MappingsRegistry.FULL.getSrcNamespace()); Map> classMembers = new HashMap<>(); - for (MappingTree.ClassMapping classMapping : FULL_MAPPINGS.getClasses()) { + for (MappingTree.ClassMapping classMapping : MappingsRegistry.FULL.getClasses()) { String className = classMapping.getName(srcNamespace); TrClass trClass = trEnvironment.getClass(className); @@ -243,9 +95,9 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr int propagated = 0; try { - FULL_MAPPINGS.visitHeader(); - FULL_MAPPINGS.visitNamespaces(FULL_MAPPINGS.getSrcNamespace(), FULL_MAPPINGS.getDstNamespaces()); - FULL_MAPPINGS.visitContent(); + MappingsRegistry.FULL.visitHeader(); + MappingsRegistry.FULL.visitNamespaces(MappingsRegistry.FULL.getSrcNamespace(), MappingsRegistry.FULL.getDstNamespaces()); + MappingsRegistry.FULL.visitContent(); } catch (IOException e) { throw new RuntimeException(e); } @@ -258,17 +110,13 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr TrClass trClass = trEnvironment.getClass(child); if (trClass == null) continue; - try { - if (srcNamespace == trueSrcNamespace) { - FULL_MAPPINGS.visitClass(child); - } else { - FULL_MAPPINGS.visitClass(FULL_MAPPINGS.mapClassName(child, srcNamespace, trueSrcNamespace)); - } - } catch (IOException e) { - e.printStackTrace(); + if (srcNamespace == trueSrcNamespace) { + MappingsRegistry.FULL.visitClass(child); + } else { + MappingsRegistry.FULL.visitClass(MappingsRegistry.FULL.mapClassName(child, srcNamespace, trueSrcNamespace)); } - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(child, srcNamespace); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(child, srcNamespace); if (classMapping == null) continue; @@ -277,26 +125,26 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr try { if (srcNamespace == trueSrcNamespace) { - FULL_MAPPINGS.visitMethod(member.name, member.desc); + MappingsRegistry.FULL.visitMethod(member.name, member.desc); } else { - MappingTree.MemberMapping memberMapping = FULL_MAPPINGS.getMethod(member.owner, member.name, member.desc, srcNamespace); + MappingTree.MemberMapping memberMapping = MappingsRegistry.FULL.getMethod(member.owner, member.name, member.desc, srcNamespace); if (memberMapping == null) continue; - FULL_MAPPINGS.visitMethod(memberMapping.getSrcName(), memberMapping.getSrcDesc()); + MappingsRegistry.FULL.visitMethod(memberMapping.getSrcName(), memberMapping.getSrcDesc()); - FULL_MAPPINGS.visitDstName(MappedElementKind.METHOD, srcNamespace, member.name); - FULL_MAPPINGS.visitDstDesc(MappedElementKind.METHOD, srcNamespace, member.desc); + MappingsRegistry.FULL.visitDstName(MappedElementKind.METHOD, srcNamespace, member.name); + MappingsRegistry.FULL.visitDstDesc(MappedElementKind.METHOD, srcNamespace, member.desc); } - MappingTree.MethodMapping methodMapping = FULL_MAPPINGS.getMethod(member.owner, member.name, member.desc, srcNamespace); + MappingTree.MethodMapping methodMapping = MappingsRegistry.FULL.getMethod(member.owner, member.name, member.desc, srcNamespace); if (methodMapping == null) continue; MappingTree.MethodMapping newMethodMapping = classMapping.getMethod(member.name, member.desc, srcNamespace); boolean actualPropagated = false; - for (String namespace : FULL_MAPPINGS.getDstNamespaces()) { - int targetNamespace = FULL_MAPPINGS.getNamespaceId(namespace); + for (String namespace : MappingsRegistry.FULL.getDstNamespaces()) { + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(namespace); if (targetNamespace == srcNamespace) continue; @@ -304,7 +152,7 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr String targetName = methodMapping.getName(targetNamespace); if (targetName != null) { - FULL_MAPPINGS.visitDstName(MappedElementKind.METHOD, targetNamespace, targetName); + MappingsRegistry.FULL.visitDstName(MappedElementKind.METHOD, targetNamespace, targetName); actualPropagated = true; } } @@ -313,7 +161,7 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr String targetDesc = methodMapping.getDesc(targetNamespace); if (targetDesc != null) { - FULL_MAPPINGS.visitDstDesc(MappedElementKind.METHOD, targetNamespace, targetDesc); + MappingsRegistry.FULL.visitDstDesc(MappedElementKind.METHOD, targetNamespace, targetDesc); actualPropagated = true; } } @@ -333,7 +181,7 @@ public static void completeMappingsFromTr(TrEnvironment trEnvironment, String sr public static void writeFullMappings() { try { - MappingTreeHelper.exportMappings(FULL_MAPPINGS, Constants.FULL_MAPPINGS_FILE.toPath()); + MappingTreeHelper.exportMappings(MappingsRegistry.FULL, Constants.FULL_MAPPINGS_FILE.toPath()); } catch (IOException e) { throw new RuntimeException(e); } @@ -368,33 +216,33 @@ public ExtendedClassMember(String name, @Nullable String desc, String owner) { } public static String mapClass(String className) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - return FULL_MAPPINGS.mapClassName(className, srcNamespace, targetNamespace); + return MappingsRegistry.FULL.mapClassName(className, srcNamespace, targetNamespace); } public static String unmapClass(String className) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - return FULL_MAPPINGS.mapClassName(className, srcNamespace, targetNamespace); + return MappingsRegistry.FULL.mapClassName(className, srcNamespace, targetNamespace); } public static MappingUtils.ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.FieldMapping fieldMapping = FULL_MAPPINGS.getField(className, fieldName, fieldDesc, srcNamespace); + MappingTree.FieldMapping fieldMapping = MappingsRegistry.FULL.getField(className, fieldName, fieldDesc, srcNamespace); return mapMember(fieldName, fieldDesc, targetNamespace, fieldMapping); } public static MappingUtils.ClassMember mapFieldFromRemappedClass(String className, String fieldName, @Nullable String fieldDesc) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(className, targetNamespace); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, targetNamespace); if (classMapping == null) return new MappingUtils.ClassMember(fieldName, fieldDesc); MappingTree.FieldMapping fieldMapping = classMapping.getField(fieldName, fieldDesc, srcNamespace); @@ -402,13 +250,13 @@ public static MappingUtils.ClassMember mapFieldFromRemappedClass(String classNam } public static MappingUtils.ClassMember mapMethod(String className, String methodName, String methodDesc) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.MethodMapping methodMapping = FULL_MAPPINGS.getMethod(className, methodName, methodDesc, srcNamespace); + MappingTree.MethodMapping methodMapping = MappingsRegistry.FULL.getMethod(className, methodName, methodDesc, srcNamespace); if (methodMapping == null) { - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(className, srcNamespace); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, srcNamespace); if (classMapping != null) methodMapping = mapMethodWithPartialDesc(classMapping, methodName, methodDesc, srcNamespace); } @@ -416,10 +264,10 @@ public static MappingUtils.ClassMember mapMethod(String className, String method } public static MappingUtils.ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(className, targetNamespace); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, targetNamespace); if (classMapping == null) return new MappingUtils.ClassMember(methodName, methodDesc); MappingTree.MethodMapping methodMapping = classMapping.getMethod(methodName, methodDesc, srcNamespace); @@ -456,9 +304,9 @@ private static MappingUtils.ClassMember mapMember(String memberName, @Nullable S } public static MappingUtils.ClassMember mapField(Class owner, String fieldName) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(owner.getName().replace(".", "/"), targetNamespace); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(owner.getName().replace(".", "/"), targetNamespace); if (classMapping != null) { MappingTree.FieldMapping fieldMapping = classMapping.getField(fieldName, null, srcNamespace); @@ -478,9 +326,9 @@ public static MappingUtils.ClassMember mapField(Class owner, String fieldName public static MappingUtils.ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { String argDesc = classTypeToDescriptor(parameterTypes); - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = FULL_MAPPINGS.getClass(owner.getName().replace(".", "/"), targetNamespace); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(owner.getName().replace(".", "/"), targetNamespace); if (classMapping != null) { for (MappingTree.MethodMapping methodDef : classMapping.getMethods()) { @@ -517,9 +365,9 @@ private static String classTypeToDescriptor(Class[] classTypes) { } public static String mapDescriptor(String desc) { - int srcNamespace = FULL_MAPPINGS.getNamespaceId(getSourceNamespace()); - int targetNamespace = FULL_MAPPINGS.getNamespaceId(getTargetNamespace()); + int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - return FULL_MAPPINGS.mapDesc(desc, srcNamespace, targetNamespace); + return MappingsRegistry.FULL.mapDesc(desc, srcNamespace, targetNamespace); } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index f51a5da..499def3 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -4,6 +4,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; @@ -72,10 +73,10 @@ protected static void init(List modRemappers, boolean remapClassEdi } for (Path path : modPaths.keySet()) { - RemapUtil.makeModMappings(path); + MappingsRegistry.addModMappings(path); } - RemapUtil.generateModMappings(); + MappingsRegistry.generateModMappings(); RemapUtil.remapMods(modPaths); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java index 0d346b1..0bba6a3 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingTreeHelper.java @@ -1,12 +1,14 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.util.log.Log; import net.fabricmc.loader.impl.util.log.LogCategory; import net.fabricmc.mappingio.MappingReader; import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.MappingWriter; import net.fabricmc.mappingio.adapter.MappingDstNsReorder; +import net.fabricmc.mappingio.adapter.MappingNsRenamer; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; import net.fabricmc.mappingio.format.MappingFormat; import net.fabricmc.mappingio.format.tiny.Tiny1FileReader; @@ -15,6 +17,7 @@ import net.fabricmc.tinyremapper.IMappingProvider; import net.fabricmc.tinyremapper.TinyUtils; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; import java.io.BufferedReader; import java.io.IOException; @@ -23,6 +26,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; @ApiStatus.Internal @@ -141,4 +145,26 @@ public static void exportMappings(MappingTreeView mappingTreeView, Path outputPa mappingTreeView.accept(writer); } } + + public static @NotNull MappingVisitor getNsReorderingVisitor(MemoryMappingTree tempTree, boolean switchNamespace, Map renames) { + List targetNamespace = new ArrayList<>(); + targetNamespace.add("intermediary"); + + if (FabricLoader.getInstance().getMappingResolver().getNamespaces().contains("named")) targetNamespace.add("named"); + + MappingVisitor visitor = tempTree; + + if (switchNamespace) { + visitor = new MappingSourceNsSwitch( + new MappingDstNsReorder( + visitor, + targetNamespace + ), + "official" + ); + } + + visitor = new MappingNsRenamer(visitor, renames); + return visitor; + } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java index e107b3e..71119f5 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java @@ -1,7 +1,135 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; +import fr.catcore.modremapperapi.utils.Constants; +import fr.catcore.wfvaio.WhichFabricVariantAmIOn; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.VersionHelper; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.impl.launch.MappingConfiguration; +import net.fabricmc.mappingio.MappingVisitor; +import net.fabricmc.mappingio.tree.MappingTree; +import net.fabricmc.mappingio.tree.MemoryMappingTree; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.zip.ZipError; + +import static fr.catcore.modremapperapi.remapping.RemapUtil.defaultPackage; @ApiStatus.Internal public class MappingsRegistry { + public static final MemoryMappingTree VANILLA; + public static MemoryMappingTree FORMATTED = new MemoryMappingTree(); + public static boolean generated = false; + + public static MemoryMappingTree MODS; + + static { + try { + MODS = MappingTreeHelper.createMappingTree(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static MemoryMappingTree FULL = new MemoryMappingTree(); + + static { + URL url = MappingConfiguration.class.getClassLoader().getResource("mappings/mappings.tiny"); + + if (url != null) { + try { + URLConnection connection = url.openConnection(); + + VANILLA = MappingTreeHelper.readMappings(connection.getInputStream()); + } catch (IOException | ZipError e) { + throw new RuntimeException("Error reading "+url, e); + } + } else { + VANILLA = null; + } + } + + public static void generateFormattedMappings(@Nullable InputStream extraStream) throws IOException { + generated = true; + + Map renames = new HashMap<>(); + boolean switchNamespace = false; + + switch (WhichFabricVariantAmIOn.getVariant()) { + case BABRIC: + renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH), "official"); + switchNamespace = true; + break; + case ORNITHE_V2: + Boolean merged = VersionHelper.predicate(">=1.3"); + if (merged != null && !merged) { + renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH) + "Official", "official"); + switchNamespace = true; + } + break; + case BABRIC_NEW_FORMAT: + renames.put(FabricLoader.getInstance().getEnvironmentType().name().toLowerCase(Locale.ENGLISH) + "Official", "official"); + switchNamespace = true; + break; + default: + break; + } + + MemoryMappingTree tempTree = new MemoryMappingTree(); + MappingVisitor visitor = MappingTreeHelper.getNsReorderingVisitor(tempTree, switchNamespace, renames); + + VANILLA.accept(visitor); + + if (extraStream == null) { + tempTree.accept(FORMATTED); + } else { + MappingTree extra = MappingTreeHelper.readMappings(extraStream); + + MappingTreeHelper.mergeIntoNew( + FORMATTED, + tempTree, + extra + ); + } + + FORMATTED.accept(FULL); + } + + public static void addModMappings(Path path) { + MappingBuilder mappingBuilder = new MappingBuilderImpl(MODS); + + try { + FileUtils.listPathContent(path) + .stream() + .filter(file -> file.endsWith(".class")) + .map(file -> file.replace(".class", "")) + .forEach(cl -> mappingBuilder.addMapping(cl, (cl.contains("/") ? "" : defaultPackage) + cl)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + public static void generateModMappings() { + try { + MODS.visitEnd(); + + MappingTreeHelper.exportMappings(MODS, Constants.REMAPPED_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException("Error while generating mods mappings", e); + } + + MappingsUtilsImpl.addMappingsToContext(MODS); + } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java new file mode 100644 index 0000000..e607428 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java @@ -0,0 +1,238 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; + +import fr.catcore.modremapperapi.utils.Constants; +import net.fabricmc.loader.api.FabricLoader; + +public class SoftLockFixer { + public static void preloadClasses() { + for (String clazz : new String[]{ + "java.io.IOException", + "java.net.URI", + "java.net.URISyntaxException", + "java.nio.file.FileSystem", + "java.nio.file.FileVisitResult", + "java.nio.file.Files", + "java.nio.file.Path", + "java.nio.file.SimpleFileVisitor", + "java.nio.file.attribute.BasicFileAttributes", + "java.util.ArrayDeque", + "java.util.ArrayList", + "java.util.Collection", + "java.util.Collections", + "java.util.HashMap", + "java.util.HashSet", + "java.util.IdentityHashMap", + "java.util.List", + "java.util.Map", + "java.util.Objects", + "java.util.Optional", + "java.util.Queue", + "java.util.Set", + "java.util.concurrent.CompletableFuture", + "java.util.concurrent.ConcurrentHashMap", + "java.util.concurrent.ExecutionException", + "java.util.concurrent.ExecutorService", + "java.util.concurrent.Executors", + "java.util.concurrent.Future", + "java.util.concurrent.TimeUnit", + "java.util.concurrent.atomic.AtomicReference", + "java.util.function.BiConsumer", + "java.util.function.Supplier", + "java.util.regex.Pattern", + "java.util.stream.Collectors", + "java.util.zip.ZipError", + + "org.objectweb.asm.ClassReader", + "org.objectweb.asm.ClassVisitor", + "org.objectweb.asm.ClassWriter", + "org.objectweb.asm.FieldVisitor", + "org.objectweb.asm.MethodVisitor", + "org.objectweb.asm.Opcodes", + "org.objectweb.asm.commons.Remapper", + "org.objectweb.asm.util.CheckClassAdapter", + + "fr.catcore.modremapperapi.api.RemapLibrary", + "fr.catcore.modremapperapi.api.ModRemapper", + "fr.catcore.modremapperapi.utils.BArrayList", + "fr.catcore.modremapperapi.utils.CollectionUtils", + "fr.catcore.modremapperapi.utils.Constants", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModEntry", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModRemapper", + "fr.catcore.modremapperapi.utils.FileUtils", + "fr.catcore.modremapperapi.utils.MappingsUtils", + "fr.catcore.modremapperapi.utils.MixinUtils", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", + "fr.catcore.modremapperapi.remapping.MappingBuilder", + "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", + "fr.catcore.modremapperapi.remapping.MappingBuilder$Type", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAMethodVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper", + "fr.catcore.modremapperapi.remapping.RemapUtil", + "fr.catcore.modremapperapi.remapping.RemapUtil$MappingList", + "fr.catcore.modremapperapi.remapping.VisitorInfos", + "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodNamed", + "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodValue", + "fr.catcore.modremapperapi.remapping.VisitorInfos$Type", + "net.fabricmc.loader.impl.launch.FabricLauncher", + "net.fabricmc.loader.impl.launch.FabricLauncherBase", + "net.fabricmc.loader.api.ObjectShare", + + getLibClassName("tinyremapper", "AsmClassRemapper"), + getLibClassName("tinyremapper", "AsmClassRemapper$AsmAnnotationRemapper"), + getLibClassName("tinyremapper", "AsmClassRemapper$AsmAnnotationRemapper$AsmArrayAttributeAnnotationRemapper"), + getLibClassName("tinyremapper", "AsmClassRemapper$AsmFieldRemapper"), + getLibClassName("tinyremapper", "AsmClassRemapper$AsmMethodRemapper"), + getLibClassName("tinyremapper", "AsmClassRemapper$AsmRecordComponentRemapper"), + getLibClassName("tinyremapper", "AsmRemapper"), + getLibClassName("tinyremapper", "BridgeHandler"), + getLibClassName("tinyremapper", "ClassInstance"), + getLibClassName("tinyremapper", "FileSystemReference"), + getLibClassName("tinyremapper", "IMappingProvider"), + getLibClassName("tinyremapper", "IMappingProvider$MappingAcceptor"), + getLibClassName("tinyremapper", "IMappingProvider$Member"), + getLibClassName("tinyremapper", "InputTag"), + getLibClassName("tinyremapper", "MemberInstance"), + getLibClassName("tinyremapper", "MetaInfFixer"), + getLibClassName("tinyremapper", "MetaInfRemover"), + getLibClassName("tinyremapper", "NonClassCopyMode"), + getLibClassName("tinyremapper", "OutputConsumerPath"), + getLibClassName("tinyremapper", "OutputConsumerPath$1"), + getLibClassName("tinyremapper", "OutputConsumerPath$Builder"), + getLibClassName("tinyremapper", "OutputConsumerPath$ResourceRemapper"), + getLibClassName("tinyremapper", "PackageAccessChecker"), + getLibClassName("tinyremapper", "Propagator"), + getLibClassName("tinyremapper", "TinyRemapper"), + getLibClassName("tinyremapper", "TinyRemapper$1"), + getLibClassName("tinyremapper", "TinyRemapper$1$1"), + getLibClassName("tinyremapper", "TinyRemapper$2"), + getLibClassName("tinyremapper", "TinyRemapper$3"), + getLibClassName("tinyremapper", "TinyRemapper$4"), + getLibClassName("tinyremapper", "TinyRemapper$5"), + getLibClassName("tinyremapper", "TinyRemapper$AnalyzeVisitorProvider"), + getLibClassName("tinyremapper", "TinyRemapper$ApplyVisitorProvider"), + getLibClassName("tinyremapper", "TinyRemapper$Builder"), + getLibClassName("tinyremapper", "TinyRemapper$CLIExtensionProvider"), + getLibClassName("tinyremapper", "TinyRemapper$Direction"), + getLibClassName("tinyremapper", "TinyRemapper$Extension"), + getLibClassName("tinyremapper", "TinyRemapper$LinkedMethodPropagation"), + getLibClassName("tinyremapper", "TinyRemapper$MrjState"), + getLibClassName("tinyremapper", "TinyRemapper$Propagation"), + getLibClassName("tinyremapper", "TinyRemapper$StateProcessor"), + getLibClassName("tinyremapper", "TinyUtils"), + getLibClassName("tinyremapper", "TinyUtils$MappingAdapter"), + getLibClassName("tinyremapper", "VisitTrackingClassRemapper"), + getLibClassName("tinyremapper", "VisitTrackingClassRemapper$VisitKind"), + getLibClassName("tinyremapper", "extension.mixin.common.IMappable"), + getLibClassName("tinyremapper", "extension.mixin.common.MapUtility"), + getLibClassName("tinyremapper", "extension.mixin.common.ResolveUtility"), + getLibClassName("tinyremapper", "extension.mixin.common.StringUtility"), + getLibClassName("tinyremapper", "extension.mixin.common.data.Annotation"), + getLibClassName("tinyremapper", "extension.mixin.common.data.AnnotationElement"), + getLibClassName("tinyremapper", "extension.mixin.common.data.CommonData"), + getLibClassName("tinyremapper", "extension.mixin.common.data.Constant"), + getLibClassName("tinyremapper", "extension.mixin.common.data.Message"), + getLibClassName("tinyremapper", "extension.mixin.common.data.MxClass"), + getLibClassName("tinyremapper", "extension.mixin.common.data.MxMember"), + getLibClassName("tinyremapper", "extension.mixin.common.data.Pair"), + getLibClassName("tinyremapper", "extension.mixin.soft.SoftTargetMixinClassVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.SoftTargetMixinMethodVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.AccessorAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.InvokerAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.MixinAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtConstructorMappable"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtSecondPassAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.AtAnnotationVisitor$AtSecondPassAnnotationVisitor$1"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.CommonInjectionAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.CommonInjectionAnnotationVisitor$InjectMethodMappable"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionAnnotationVisitor$MemberRemappingVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionsAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DefinitionsAnnotationVisitor$DefinitionRemappingVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.DescAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.InjectAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyArgAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyArgsAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyConstantAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyExpressionValueAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyReceiverAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyReturnValueAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.ModifyVariableAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.RedirectAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.SliceAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapMethodAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapOperationAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapWithConditionAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.annotation.injection.WrapWithConditionV2AnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.soft.data.MemberInfo"), + getLibClassName("tinyremapper", "extension.mixin.soft.util.NamedMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinClassVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinFieldVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.HardTargetMixinMethodVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$1"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$InterfaceAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ImplementsAnnotationVisitor$SoftImplementsMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor$1"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.MixinAnnotationVisitor$2"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.OverwriteAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.OverwriteAnnotationVisitor$OverwriteMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ShadowAnnotationVisitor"), + getLibClassName("tinyremapper", "extension.mixin.hard.annotation.ShadowAnnotationVisitor$ShadowPrefixMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.data.SoftInterface"), + getLibClassName("tinyremapper", "extension.mixin.hard.data.SoftInterface$Remap"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.CamelPrefixString"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.ConvertibleMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.HardTargetMappable"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.IConvertibleString"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.IdentityString"), + getLibClassName("tinyremapper", "extension.mixin.hard.util.PrefixString"), + getLibClassName("tinyremapper", "extension.mixin.MixinExtension"), + getLibClassName("tinyremapper", "extension.mixin.MixinExtension$AnalyzeVisitorProvider"), + getLibClassName("tinyremapper", "extension.mixin.MixinExtension$AnnotationTarget"), + getLibClassName("tinyremapper", "extension.mixin.MixinExtension$CLIProvider"), + getLibClassName("tinyremapper", "extension.mixin.MixinExtension$PreApplyVisitorProvider"), + getLibClassName("tinyremapper", "api.TrClass"), + getLibClassName("tinyremapper", "api.TrEnvironment"), + getLibClassName("tinyremapper", "api.TrField"), + getLibClassName("tinyremapper", "api.TrLogger"), + getLibClassName("tinyremapper", "api.TrLogger$Level"), + getLibClassName("tinyremapper", "api.TrMember"), + getLibClassName("tinyremapper", "api.TrMember$MemberType"), + getLibClassName("tinyremapper", "api.TrMethod"), + getLibClassName("tinyremapper", "api.TrRemapper"), + + getLibClassName("mappingio", "MappingReader"), + getLibClassName("mappingio", "MappingReader$1"), + getLibClassName("mappingio", "FlatMappingVisitor"), + getLibClassName("mappingio", "MappedElementKind"), + getLibClassName("mappingio", "MappingFlag"), + getLibClassName("mappingio", "MappingUtil"), + getLibClassName("mappingio", "MappingVisitor"), + getLibClassName("mappingio", "MappingWriter"), + getLibClassName("mappingio", "MappingWriter$1") + }) { + try { + Constants.MAIN_LOGGER.debug("Preloading class: " + clazz); + Class.forName(clazz); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } + } + + private static String getLibClassName(String lib, String string) { + if (FabricLoader.getInstance().isDevelopmentEnvironment()) { + return "net.fabricmc." + lib + "." + string; + } + + return "fr.catcore.modremapperapi.impl.lib." + lib + "." + string; + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java index 297b38e..9704a4d 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java @@ -5,6 +5,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; @@ -41,7 +42,7 @@ private static Collection getMinecraftJar(Collection sourcePaths, St .ignoreConflicts(true) .fixPackageAccess(true) .withMappings( - MappingTreeHelper.createMappingProvider(MappingsUtilsImpl.getMinecraftMappings(), src, target) + MappingTreeHelper.createMappingProvider(MappingsRegistry.FORMATTED, src, target) ); TinyRemapper remapper = builder.build(); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java index 876a010..ddc9f79 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java @@ -4,7 +4,6 @@ import net.fabricmc.loader.api.FabricLoader; import org.jetbrains.annotations.ApiStatus; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collection; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java index 7f63730..5eb36eb 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/FileUtils.java @@ -130,6 +130,19 @@ public static List listDirectoryContent(File[] files) { return list; } + @ApiStatus.Internal + public static List listPathContent(Path path) throws IOException { + File file = path.toFile(); + + if (file.isDirectory()) { + return listDirectoryContent(file.listFiles()); + } else if (file.isFile()) { + return listZipContent(path); + } + + return new ArrayList<>(); + } + @ApiStatus.Internal public static void emptyDir(Path dir) { try { From 3496c57601f87e911fc258fde27bc5b4e4523022 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Sat, 22 Mar 2025 16:15:06 +0100 Subject: [PATCH 12/15] Mappings and Libraries refactoring --- .../modremapperapi/remapping/RemapUtil.java | 105 ++---------------- .../modremappingapi/impl/LibraryHandler.java | 61 ++++++++++ .../modremappingapi/impl/ModDiscoverer.java | 2 +- .../impl/mappings/MappingsRegistry.java | 41 ++++++- 4 files changed, 107 insertions(+), 102 deletions(-) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 5673ec3..435fca0 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -3,8 +3,7 @@ import fr.catcore.modremapperapi.utils.Constants; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; -import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.LibraryHandler; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; @@ -15,18 +14,15 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.tree.MappingTree; -import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.tinyremapper.*; import net.fabricmc.tinyremapper.extension.mixin.MixinExtension; import org.jetbrains.annotations.ApiStatus; import java.io.*; -import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.util.*; @@ -34,7 +30,6 @@ public class RemapUtil { private static List remappers; - private static MappingTree LOADER_TREE; @ApiStatus.Internal public static final Map> MIXINED = new HashMap<>(); @@ -42,8 +37,8 @@ public class RemapUtil { @ApiStatus.Internal public static String defaultPackage = ""; - @ApiStatus.Internal - public static final List MC_CLASS_NAMES = new ArrayList<>(); + @Deprecated + public static final List MC_CLASS_NAMES = MappingsRegistry.VANILLA_CLASS_LIST; @ApiStatus.Internal public static void init(List modRemappers) { @@ -87,57 +82,16 @@ public static void init(List libraries = new ArrayList<>(); - - remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); - - Map libraryPaths = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); - - for (Map.Entry entry : libraryPaths.entrySet()) { - RemapLibrary library = entry.getKey(); - Path path = entry.getValue(); - - if (!library.url.isEmpty()) { - Constants.MAIN_LOGGER.info("Downloading remapping library '" + library.fileName + "' from url '" + library.url + "'"); - FileUtils.downloadFile(library.url, path); - FileUtils.removeEntriesFromZip(path, library.toExclude); - Constants.MAIN_LOGGER.info("Remapping library ready for use."); - } else if (library.path != null) { - Constants.MAIN_LOGGER.info("Extracting remapping library '" + library.fileName + "' from mod jar."); - FileUtils.copyZipFile(library.path, path); - Constants.MAIN_LOGGER.info("Remapping library ready for use."); - } - } - } - } catch (IOException | URISyntaxException e) { - throw new RuntimeException(e); - } + MappingsRegistry.registerAdditionalMappings(remappers); } @ApiStatus.Internal public static void remapMods(Map pathMap) { Constants.MAIN_LOGGER.debug("Starting jar remapping!"); SoftLockFixer.preloadClasses(); - TinyRemapper remapper = makeRemapper(MappingsRegistry.FORMATTED, LOADER_TREE, MappingsRegistry.MODS); + TinyRemapper remapper = makeRemapper(MappingsRegistry.FORMATTED, MappingsRegistry.ADDITIONAL, MappingsRegistry.MODS); Constants.MAIN_LOGGER.debug("Remapper created!"); remapFiles(remapper, pathMap); Constants.MAIN_LOGGER.debug("Jar remapping done!"); @@ -145,15 +99,6 @@ public static void remapMods(Map pathMap) { MappingsUtilsImpl.writeFullMappings(); } - @ApiStatus.Internal - public static void writeMcMappings() { - try { - MappingTreeHelper.exportMappings(MappingsRegistry.FORMATTED, Constants.MC_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - @Deprecated public static class MappingList extends ArrayList { public MappingList() { @@ -180,28 +125,6 @@ public void accept(MappingVisitor visitor) throws IOException { } } - private static MappingTree generateMappings() { - MemoryMappingTree mappingTree; - - try { - mappingTree = MappingTreeHelper.createMappingTree(); - - io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder builder = new MappingBuilderImpl(mappingTree); - - for (ModRemapper remapper : remappers) { - remapper.registerMappings(builder); - } - - mappingTree.visitEnd(); - - MappingTreeHelper.exportMappings(mappingTree, Constants.EXTRA_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException("Error while generating remappers mappings", e); - } - - return mappingTree; - } - /** * Will create remapper with specified trees. */ @@ -250,21 +173,7 @@ private static TinyRemapper makeRemapper(MappingTree... trees) { throw new RuntimeException(e); } - for (ModRemapper modRemapper : remappers) { - List libraries = new ArrayList<>(); - - modRemapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); - - for (RemapLibrary library : libraries) { - Path libPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()).resolve(library.fileName); - - if (Files.exists(libPath)) { - remapper.readClassPathAsync(libPath); - } else { - Constants.MAIN_LOGGER.info("Library " + libPath + " does not exist."); - } - } - } + LibraryHandler.addLibrariesToRemapClasspath(remapper); return remapper; } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java new file mode 100644 index 0000000..6cd1425 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java @@ -0,0 +1,61 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl; + +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.RemapLibrary; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.tinyremapper.TinyRemapper; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class LibraryHandler { + private static Map remapLibraries; + + public static void gatherRemapLibraries(List remappers) { + try { + for (ModRemapper remapper : remappers) { + List libraries = new ArrayList<>(); + + remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); + + remapLibraries = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); + + for (Map.Entry entry : remapLibraries.entrySet()) { + RemapLibrary library = entry.getKey(); + Path path = entry.getValue(); + + if (!library.url.isEmpty()) { + Constants.MAIN_LOGGER.info("Downloading remapping library '" + library.fileName + "' from url '" + library.url + "'"); + FileUtils.downloadFile(library.url, path); + FileUtils.removeEntriesFromZip(path, library.toExclude); + Constants.MAIN_LOGGER.info("Remapping library ready for use."); + } else if (library.path != null) { + Constants.MAIN_LOGGER.info("Extracting remapping library '" + library.fileName + "' from mod jar."); + FileUtils.copyZipFile(library.path, path); + Constants.MAIN_LOGGER.info("Remapping library ready for use."); + } + } + } + } catch (IOException | URISyntaxException e) { + throw new RuntimeException(e); + } + } + + public static void addLibrariesToRemapClasspath(TinyRemapper remapper) { + for (Path libPath : remapLibraries.values()) { + if (Files.exists(libPath)) { + remapper.readClassPathAsync(libPath); + } else { + Constants.MAIN_LOGGER.info("Library " + libPath + " does not exist."); + } + } + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index 499def3..54d5e4d 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -114,7 +114,7 @@ private static Map excludeClassEdits(Map modPaths, Path Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING); } - FileUtils.removeEntriesFromZip(entry.getValue(), RemapUtil.MC_CLASS_NAMES); + FileUtils.removeEntriesFromZip(entry.getValue(), MappingsRegistry.VANILLA_CLASS_LIST); } catch (IOException | URISyntaxException e) { e.printStackTrace(); errored.add(entry.getValue()); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java index 71119f5..0398d12 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java @@ -3,6 +3,7 @@ import fr.catcore.modremapperapi.utils.Constants; import fr.catcore.wfvaio.WhichFabricVariantAmIOn; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingBuilderImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; @@ -20,24 +21,26 @@ import java.net.URL; import java.net.URLConnection; import java.nio.file.Path; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; +import java.util.*; import java.util.zip.ZipError; import static fr.catcore.modremapperapi.remapping.RemapUtil.defaultPackage; @ApiStatus.Internal public class MappingsRegistry { + public static List VANILLA_CLASS_LIST = new ArrayList<>(); + public static final MemoryMappingTree VANILLA; public static MemoryMappingTree FORMATTED = new MemoryMappingTree(); public static boolean generated = false; public static MemoryMappingTree MODS; + public static MemoryMappingTree ADDITIONAL; static { try { MODS = MappingTreeHelper.createMappingTree(); + ADDITIONAL = MappingTreeHelper.createMappingTree(); } catch (IOException e) { throw new RuntimeException(e); } @@ -105,6 +108,20 @@ public static void generateFormattedMappings(@Nullable InputStream extraStream) } FORMATTED.accept(FULL); + + for (MappingTree.ClassMapping classView : FORMATTED.getClasses()) { + String className = classView.getName(MappingsUtilsImpl.getSourceNamespace()); + + if (className != null) { + VANILLA_CLASS_LIST.add("/" + className + ".class"); + } + } + + try { + MappingTreeHelper.exportMappings(MappingsRegistry.FORMATTED, Constants.MC_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException("Error while writing formatted mappings", e); + } } public static void addModMappings(Path path) { @@ -132,4 +149,22 @@ public static void generateModMappings() { MappingsUtilsImpl.addMappingsToContext(MODS); } + + public static void registerAdditionalMappings(List remappers) { + MappingBuilder builder = new MappingBuilderImpl(ADDITIONAL); + + for (ModRemapper remapper : remappers) { + remapper.registerMappings(builder); + } + + ADDITIONAL.visitEnd(); + + try { + MappingTreeHelper.exportMappings(ADDITIONAL, Constants.EXTRA_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException("Error while generating remappers mappings", e); + } + + MappingsUtilsImpl.addMappingsToContext(ADDITIONAL); + } } From ef00298031e39be2585c74c0464ee97d1d997d4d Mon Sep 17 00:00:00 2001 From: Cat Core Date: Sat, 22 Mar 2025 16:45:09 +0100 Subject: [PATCH 13/15] Finish cleaning up RemapUtil. --- .../modremapperapi/remapping/RemapUtil.java | 203 +----------------- .../impl/MappingsUtilsImpl.java | 9 + .../modremappingapi/impl/ModDiscoverer.java | 7 +- .../impl/ModRemapperContext.java | 81 +++++++ .../impl/mappings/MappingsRegistry.java | 4 +- .../impl/remapper/MixinRemappingHelper.java | 12 ++ .../impl/remapper/ModTrRemapper.java | 87 ++++++++ .../impl/remapper/TrRemapperHelper.java | 67 ++++++ .../remapper/minecraft/MinecraftRemapper.java | 3 +- .../remapper/resource/RefmapRemapper.java | 4 +- .../visitor/MixinPostApplyVisitor.java | 4 +- 11 files changed, 268 insertions(+), 213 deletions(-) create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/MixinRemappingHelper.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java create mode 100644 src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 435fca0..6245ae8 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -1,104 +1,21 @@ package fr.catcore.modremapperapi.remapping; -import fr.catcore.modremapperapi.utils.Constants; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.LibraryHandler; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.SoftLockFixer; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft.MinecraftRemapper; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; -import net.fabricmc.mappingio.tree.MappingTree; -import net.fabricmc.tinyremapper.*; -import net.fabricmc.tinyremapper.extension.mixin.MixinExtension; import org.jetbrains.annotations.ApiStatus; import java.io.*; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.*; -import java.util.function.Supplier; +@Deprecated public class RemapUtil { - private static List remappers; - - @ApiStatus.Internal - public static final Map> MIXINED = new HashMap<>(); - - @ApiStatus.Internal - public static String defaultPackage = ""; - @Deprecated public static final List MC_CLASS_NAMES = MappingsRegistry.VANILLA_CLASS_LIST; - @ApiStatus.Internal - public static void init(List modRemappers) { - remappers = modRemappers; - - for (ModRemapper remapper : remappers) { - Optional pkg = remapper.getDefaultPackage(); - - pkg.ifPresent(s -> defaultPackage = s); - - Optional sourceNamespace = remapper.getSourceNamespace(); - - sourceNamespace.ifPresent(MappingsUtilsImpl::setSourceNamespace); - - Optional> mappings = remapper.getExtraMapping(); - - mappings.ifPresent(inputStreamSupplier -> { - try { - MappingsRegistry.generateFormattedMappings(inputStreamSupplier.get()); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - - if (!MappingsRegistry.generated) { - try { - MappingsRegistry.generateFormattedMappings(null); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - Path sourceLibraryPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()); - - if (!Files.exists(sourceLibraryPath)) { - try { - Files.createDirectories(sourceLibraryPath); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - LibraryHandler.gatherRemapLibraries(remappers); - - MappingsRegistry.registerAdditionalMappings(remappers); - } - - @ApiStatus.Internal - public static void remapMods(Map pathMap) { - Constants.MAIN_LOGGER.debug("Starting jar remapping!"); - SoftLockFixer.preloadClasses(); - TinyRemapper remapper = makeRemapper(MappingsRegistry.FORMATTED, MappingsRegistry.ADDITIONAL, MappingsRegistry.MODS); - Constants.MAIN_LOGGER.debug("Remapper created!"); - remapFiles(remapper, pathMap); - Constants.MAIN_LOGGER.debug("Jar remapping done!"); - - MappingsUtilsImpl.writeFullMappings(); - } - @Deprecated public static class MappingList extends ArrayList { public MappingList() { @@ -125,124 +42,6 @@ public void accept(MappingVisitor visitor) throws IOException { } } - /** - * Will create remapper with specified trees. - */ - private static TinyRemapper makeRemapper(MappingTree... trees) { - TinyRemapper.Builder builder = TinyRemapper - .newRemapper() - .renameInvalidLocals(true) - .ignoreFieldDesc(false) - .propagatePrivate(true) - .ignoreConflicts(true); - - if (FabricLoader.getInstance().isDevelopmentEnvironment()) { - builder.fixPackageAccess(true); - } - - for (MappingTree tree : trees) { - builder.withMappings(MappingTreeHelper.createMappingProvider(tree, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace())); - } - - MRAApplyVisitor preApplyVisitor = new MRAApplyVisitor(); - MRAApplyVisitor postApplyVisitor = new MRAApplyVisitor(); - MixinPostApplyVisitor mixinPostApplyVisitor = new MixinPostApplyVisitor(); - - VisitorInfosImpl preInfos = new VisitorInfosImpl(); - VisitorInfosImpl postInfos = new VisitorInfosImpl(); - - for (ModRemapper modRemapper : remappers) { - modRemapper.registerPreVisitors(preInfos); - modRemapper.registerPostVisitors(postInfos); - } - - preApplyVisitor.setInfos(preInfos); - postApplyVisitor.setInfos(postInfos); - - builder.extraPreApplyVisitor(preApplyVisitor); - builder.extraPostApplyVisitor(postApplyVisitor); - builder.extraPostApplyVisitor(mixinPostApplyVisitor); - - builder.extension(new MixinExtension(EnumSet.of(MixinExtension.AnnotationTarget.HARD))); - - TinyRemapper remapper = builder.build(); - - try { - MinecraftRemapper.addMinecraftJar(remapper); - } catch (IOException e) { - throw new RuntimeException(e); - } - - LibraryHandler.addLibrariesToRemapClasspath(remapper); - - return remapper; - } - - /** - * Will remap file with specified remapper and store it into output. - * - * @param remapper {@link TinyRemapper} to remap with. - */ - private static void remapFiles(TinyRemapper remapper, Map paths) { - List outputConsumerPaths = new ArrayList<>(); - - List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); - resourceRemappers.add(new RefmapRemapper()); - - applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace()); - } - - @ApiStatus.Internal - public static void applyRemapper(TinyRemapper remapper, Map paths, List outputConsumerPaths, List resourceRemappers, boolean analyzeMapping, String srcNamespace, String targetNamespace) { - try { - Map tagMap = new HashMap<>(); - - Constants.MAIN_LOGGER.debug("Creating InputTags!"); - for (Path input : paths.keySet()) { - InputTag tag = remapper.createInputTag(); - tagMap.put(input, tag); - remapper.readInputsAsync(tag, input); - } - - Constants.MAIN_LOGGER.debug("Initializing remapping!"); - for (Map.Entry entry : paths.entrySet()) { - Constants.MAIN_LOGGER.debug("Starting remapping " + entry.getKey().toString() + " to " + entry.getValue().toString()); - OutputConsumerPath outputConsumer = new OutputConsumerPath.Builder(entry.getValue()).build(); - - outputConsumerPaths.add(outputConsumer); - - Constants.MAIN_LOGGER.debug("Apply remapper!"); - remapper.apply(outputConsumer, tagMap.get(entry.getKey())); - - Constants.MAIN_LOGGER.debug("Add input as non class file!"); - outputConsumer.addNonClassFiles(entry.getKey(), remapper, resourceRemappers); - - Constants.MAIN_LOGGER.debug("Done 1!"); - } - - if (analyzeMapping) MappingsUtilsImpl.completeMappingsFromTr(remapper.getEnvironment(), srcNamespace); - } catch (Exception e) { - remapper.finish(); - outputConsumerPaths.forEach(o -> { - try { - o.close(); - } catch (IOException e2) { - e2.printStackTrace(); - } - }); - throw new RuntimeException("Failed to remap jar", e); - } finally { - remapper.finish(); - outputConsumerPaths.forEach(o -> { - try { - o.close(); - } catch (IOException e) { - e.printStackTrace(); - } - }); - } - } - @Deprecated public static String getRemappedFieldName(Class owner, String fieldName) { return MappingUtils.mapField(owner, fieldName).name; diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java index 2425b96..50e030b 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java @@ -23,6 +23,7 @@ @ApiStatus.Internal public class MappingsUtilsImpl { private static String sourceNamespace = "official"; + private static String defaultPackage = ""; @ApiStatus.Internal public static String getSourceNamespace() { @@ -34,6 +35,14 @@ public static void setSourceNamespace(String sourceNamespace) { MappingsUtilsImpl.sourceNamespace = sourceNamespace; } + public static String getDefaultPackage() { + return defaultPackage; + } + + public static void setDefaultPackage(String defaultPackage) { + MappingsUtilsImpl.defaultPackage = defaultPackage; + } + public static boolean isSourceNamespaceObf() { return Objects.equals(sourceNamespace, "official"); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java index 54d5e4d..2d28bf8 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java @@ -2,7 +2,6 @@ import fr.catcore.modremapperapi.utils.Constants; import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; -import fr.catcore.modremapperapi.remapping.RemapUtil; import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; @@ -23,7 +22,9 @@ public class ModDiscoverer { private static final Map> EXCLUDED = new HashMap<>(); protected static void init(List modRemappers, boolean remapClassEdits) { - RemapUtil.init(modRemappers); + ModRemapperContext context = new ModRemapperContext(modRemappers); + + context.init(); List mods = new ArrayList<>(); @@ -78,7 +79,7 @@ protected static void init(List modRemappers, boolean remapClassEdi MappingsRegistry.generateModMappings(); - RemapUtil.remapMods(modPaths); + context.remapMods(modPaths); modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java new file mode 100644 index 0000000..27608ab --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java @@ -0,0 +1,81 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl; + +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.ModTrRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.SoftLockFixer; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import net.fabricmc.tinyremapper.TinyRemapper; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +public class ModRemapperContext { + private final List remappers; + + public ModRemapperContext(List remappers) { + this.remappers = remappers; + } + + public void init() { + for (ModRemapper remapper : remappers) { + Optional pkg = remapper.getDefaultPackage(); + + pkg.ifPresent(MappingsUtilsImpl::setDefaultPackage); + + Optional sourceNamespace = remapper.getSourceNamespace(); + + sourceNamespace.ifPresent(MappingsUtilsImpl::setSourceNamespace); + + Optional> mappings = remapper.getExtraMapping(); + + mappings.ifPresent(inputStreamSupplier -> { + try { + MappingsRegistry.generateFormattedMappings(inputStreamSupplier.get()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + if (!MappingsRegistry.generated) { + try { + MappingsRegistry.generateFormattedMappings(null); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + Path sourceLibraryPath = CacheUtils.getLibraryPath(MappingsUtilsImpl.getSourceNamespace()); + + if (!Files.exists(sourceLibraryPath)) { + try { + Files.createDirectories(sourceLibraryPath); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + LibraryHandler.gatherRemapLibraries(remappers); + + MappingsRegistry.registerAdditionalMappings(remappers); + } + + public void remapMods(Map pathMap) { + Constants.MAIN_LOGGER.debug("Starting jar remapping!"); + SoftLockFixer.preloadClasses(); + TinyRemapper remapper = ModTrRemapper.makeRemapper(remappers); + Constants.MAIN_LOGGER.debug("Remapper created!"); + ModTrRemapper.remapMods(remapper, pathMap); + Constants.MAIN_LOGGER.debug("Jar remapping done!"); + + MappingsUtilsImpl.writeFullMappings(); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java index 0398d12..5952a0f 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/mappings/MappingsRegistry.java @@ -24,8 +24,6 @@ import java.util.*; import java.util.zip.ZipError; -import static fr.catcore.modremapperapi.remapping.RemapUtil.defaultPackage; - @ApiStatus.Internal public class MappingsRegistry { public static List VANILLA_CLASS_LIST = new ArrayList<>(); @@ -132,7 +130,7 @@ public static void addModMappings(Path path) { .stream() .filter(file -> file.endsWith(".class")) .map(file -> file.replace(".class", "")) - .forEach(cl -> mappingBuilder.addMapping(cl, (cl.contains("/") ? "" : defaultPackage) + cl)); + .forEach(cl -> mappingBuilder.addMapping(cl, (cl.contains("/") ? "" : MappingsUtilsImpl.getDefaultPackage()) + cl)); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/MixinRemappingHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/MixinRemappingHelper.java new file mode 100644 index 0000000..99b973e --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/MixinRemappingHelper.java @@ -0,0 +1,12 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@ApiStatus.Internal +public class MixinRemappingHelper { + public static final Map> MIXIN2TARGETMAP = new HashMap<>(); +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java new file mode 100644 index 0000000..6b7a278 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java @@ -0,0 +1,87 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; + +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.LibraryHandler; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.VisitorInfosImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.minecraft.MinecraftRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.mappingio.tree.MappingTree; +import net.fabricmc.tinyremapper.NonClassCopyMode; +import net.fabricmc.tinyremapper.OutputConsumerPath; +import net.fabricmc.tinyremapper.TinyRemapper; +import net.fabricmc.tinyremapper.extension.mixin.MixinExtension; +import org.jetbrains.annotations.ApiStatus; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.*; + +@ApiStatus.Internal +public class ModTrRemapper { + public static TinyRemapper makeRemapper(List remappers) { + List trees = Arrays.asList(MappingsRegistry.FORMATTED, MappingsRegistry.ADDITIONAL, MappingsRegistry.MODS); + + TinyRemapper.Builder builder = TinyRemapper + .newRemapper() + .renameInvalidLocals(true) + .ignoreFieldDesc(false) + .propagatePrivate(true) + .ignoreConflicts(true); + + if (FabricLoader.getInstance().isDevelopmentEnvironment()) { + builder.fixPackageAccess(true); + } + + for (MappingTree tree : trees) { + builder.withMappings(MappingTreeHelper.createMappingProvider(tree, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace())); + } + + MRAApplyVisitor preApplyVisitor = new MRAApplyVisitor(); + MRAApplyVisitor postApplyVisitor = new MRAApplyVisitor(); + MixinPostApplyVisitor mixinPostApplyVisitor = new MixinPostApplyVisitor(); + + VisitorInfosImpl preInfos = new VisitorInfosImpl(); + VisitorInfosImpl postInfos = new VisitorInfosImpl(); + + for (ModRemapper modRemapper : remappers) { + modRemapper.registerPreVisitors(preInfos); + modRemapper.registerPostVisitors(postInfos); + } + + preApplyVisitor.setInfos(preInfos); + postApplyVisitor.setInfos(postInfos); + + builder.extraPreApplyVisitor(preApplyVisitor); + builder.extraPostApplyVisitor(postApplyVisitor); + builder.extraPostApplyVisitor(mixinPostApplyVisitor); + + builder.extension(new MixinExtension(EnumSet.of(MixinExtension.AnnotationTarget.HARD))); + + TinyRemapper remapper = builder.build(); + + try { + MinecraftRemapper.addMinecraftJar(remapper); + } catch (IOException e) { + throw new RuntimeException(e); + } + + LibraryHandler.addLibrariesToRemapClasspath(remapper); + + return remapper; + } + + public static void remapMods(TinyRemapper remapper, Map paths) { + List outputConsumerPaths = new ArrayList<>(); + + List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); + resourceRemappers.add(new RefmapRemapper()); + + TrRemapperHelper.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace()); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java new file mode 100644 index 0000000..afbd2b9 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java @@ -0,0 +1,67 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; + +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import net.fabricmc.tinyremapper.InputTag; +import net.fabricmc.tinyremapper.OutputConsumerPath; +import net.fabricmc.tinyremapper.TinyRemapper; +import org.jetbrains.annotations.ApiStatus; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@ApiStatus.Internal +public class TrRemapperHelper { + public static void applyRemapper(TinyRemapper remapper, Map paths, List outputConsumerPaths, List resourceRemappers, boolean analyzeMapping, String srcNamespace, String targetNamespace) { + try { + Map tagMap = new HashMap<>(); + + Constants.MAIN_LOGGER.debug("Creating InputTags!"); + for (Path input : paths.keySet()) { + InputTag tag = remapper.createInputTag(); + tagMap.put(input, tag); + remapper.readInputsAsync(tag, input); + } + + Constants.MAIN_LOGGER.debug("Initializing remapping!"); + for (Map.Entry entry : paths.entrySet()) { + Constants.MAIN_LOGGER.debug("Starting remapping " + entry.getKey().toString() + " to " + entry.getValue().toString()); + OutputConsumerPath outputConsumer = new OutputConsumerPath.Builder(entry.getValue()).build(); + + outputConsumerPaths.add(outputConsumer); + + Constants.MAIN_LOGGER.debug("Apply remapper!"); + remapper.apply(outputConsumer, tagMap.get(entry.getKey())); + + Constants.MAIN_LOGGER.debug("Add input as non class file!"); + outputConsumer.addNonClassFiles(entry.getKey(), remapper, resourceRemappers); + + Constants.MAIN_LOGGER.debug("Done 1!"); + } + + if (analyzeMapping) MappingsUtilsImpl.completeMappingsFromTr(remapper.getEnvironment(), srcNamespace); + } catch (Exception e) { + remapper.finish(); + outputConsumerPaths.forEach(o -> { + try { + o.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } + }); + throw new RuntimeException("Failed to remap jar", e); + } finally { + remapper.finish(); + outputConsumerPaths.forEach(o -> { + try { + o.close(); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java index 9704a4d..9995326 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/minecraft/MinecraftRemapper.java @@ -6,6 +6,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.impl.RemapUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.TrRemapperHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; import net.fabricmc.loader.api.FabricLoader; @@ -53,7 +54,7 @@ private static Collection getMinecraftJar(Collection sourcePaths, St List resourceRemappers = new ArrayList<>(NonClassCopyMode.FIX_META_INF.remappers); - RemapUtil.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, src, target); + TrRemapperHelper.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, src, target); Constants.MAIN_LOGGER.info("MC jar remapped successfully!"); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java index 8b6cd75..22d12a5 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/resource/RefmapRemapper.java @@ -1,7 +1,7 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource; import com.google.gson.Gson; -import fr.catcore.modremapperapi.remapping.RemapUtil; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.MixinRemappingHelper; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.api.TrRemapper; @@ -40,7 +40,7 @@ public void transform(Path destinationDirectory, Path relativePath, InputStream public String mapRefMapEntry(String mixinClass, String old, TinyRemapper remapper) { TrRemapper trRemapper = remapper.getEnvironment().getRemapper(); - List supers = RemapUtil.MIXINED.get(mixinClass); + List supers = MixinRemappingHelper.MIXIN2TARGETMAP.get(mixinClass); // format is: // owner + name + quantifier + (desc == null || desc.startsWith("(") ? "" : ":") + desc + (tail != null ? " -> " : "") + tail String owner; // can be "" diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java index 429be58..e78e0fd 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MixinPostApplyVisitor.java @@ -1,7 +1,7 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor; -import fr.catcore.modremapperapi.remapping.RemapUtil; import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.MixinRemappingHelper; import net.fabricmc.tinyremapper.TinyRemapper; import net.fabricmc.tinyremapper.api.TrClass; import org.objectweb.asm.ClassReader; @@ -54,7 +54,7 @@ public ClassVisitor insertApplyVisitor(TrClass cls, ClassVisitor next) { }); } - RemapUtil.MIXINED.put(cls.getName().replace(".", "/"), supers); + MixinRemappingHelper.MIXIN2TARGETMAP.put(cls.getName().replace(".", "/"), supers); return next; } From da19f5c8b750db8bc5625515e1855725567e0a34 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Sat, 22 Mar 2025 16:57:22 +0100 Subject: [PATCH 14/15] Fix tr soft locking --- .../impl/remapper/SoftLockFixer.java | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java index e607428..3d08f27 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/SoftLockFixer.java @@ -56,29 +56,35 @@ public static void preloadClasses() { "fr.catcore.modremapperapi.utils.BArrayList", "fr.catcore.modremapperapi.utils.CollectionUtils", "fr.catcore.modremapperapi.utils.Constants", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModEntry", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModRemapper", "fr.catcore.modremapperapi.utils.FileUtils", "fr.catcore.modremapperapi.utils.MappingsUtils", "fr.catcore.modremapperapi.utils.MixinUtils", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", "fr.catcore.modremapperapi.remapping.MappingBuilder", "fr.catcore.modremapperapi.remapping.MappingBuilder$Entry", "fr.catcore.modremapperapi.remapping.MappingBuilder$Type", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAMethodVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor", - "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper", "fr.catcore.modremapperapi.remapping.RemapUtil", "fr.catcore.modremapperapi.remapping.RemapUtil$MappingList", "fr.catcore.modremapperapi.remapping.VisitorInfos", "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodNamed", "fr.catcore.modremapperapi.remapping.VisitorInfos$MethodValue", "fr.catcore.modremapperapi.remapping.VisitorInfos$Type", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModEntry", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModRemapper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModDiscoverer$1", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.ModEntry", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapJson", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MixinPostApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAClassVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.asm.MRAMethodVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.resource.RefmapRemapper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.MixinRemappingHelper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.ModTrRemapper", + "io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.TrRemapperHelper", + "net.fabricmc.loader.impl.launch.FabricLauncher", "net.fabricmc.loader.impl.launch.FabricLauncherBase", "net.fabricmc.loader.api.ObjectShare", From abde2024ddc843f620636826114a4abef5785489 Mon Sep 17 00:00:00 2001 From: Cat Core Date: Tue, 25 Mar 2025 11:52:53 +0100 Subject: [PATCH 15/15] Fix remapping dependencies missing from remapping classpath --- .../modremappingapi/impl/LibraryHandler.java | 11 ++++++++--- .../modremappingapi/impl/utils/CacheUtils.java | 6 +----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java index 6cd1425..0b23642 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java @@ -13,11 +13,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; public class LibraryHandler { - private static Map remapLibraries; + private static final Map remapLibraries = new HashMap<>(); public static void gatherRemapLibraries(List remappers) { try { @@ -26,12 +27,14 @@ public static void gatherRemapLibraries(List remappers) { remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); - remapLibraries = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); + Map temp = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); - for (Map.Entry entry : remapLibraries.entrySet()) { + for (Map.Entry entry : temp.entrySet()) { RemapLibrary library = entry.getKey(); Path path = entry.getValue(); + if (Files.exists(path)) continue; + if (!library.url.isEmpty()) { Constants.MAIN_LOGGER.info("Downloading remapping library '" + library.fileName + "' from url '" + library.url + "'"); FileUtils.downloadFile(library.url, path); @@ -43,6 +46,8 @@ public static void gatherRemapLibraries(List remappers) { Constants.MAIN_LOGGER.info("Remapping library ready for use."); } } + + remapLibraries.putAll(temp); } } catch (IOException | URISyntaxException e) { throw new RuntimeException(e); diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java index ddc9f79..04b4350 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/utils/CacheUtils.java @@ -36,11 +36,7 @@ public static Map computeLibraryPaths(Collection sourcePaths, public static Map computeExtraLibraryPaths(Collection sourcePaths, String target) { return sourcePaths.stream() .collect(Collectors.toMap(p -> p, - p -> CacheUtils.getLibraryPath(target).resolve(p.fileName))) - .entrySet() - .stream() - .filter(entry -> !Files.exists(entry.getValue())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + p -> CacheUtils.getLibraryPath(target).resolve(p.fileName))); } static {