diff --git a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java index 6245ae8..051f9fd 100644 --- a/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java +++ b/src/main/java/fr/catcore/modremapperapi/remapping/RemapUtil.java @@ -2,7 +2,7 @@ import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1.ModRemapperV1Context; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.mappingio.MappingVisitor; @@ -14,7 +14,7 @@ @Deprecated public class RemapUtil { @Deprecated - public static final List MC_CLASS_NAMES = MappingsRegistry.VANILLA_CLASS_LIST; + public static final List MC_CLASS_NAMES = ModRemapperV1Context.INSTANCE.getMappingsRegistry().getVanillaClassNames(); @Deprecated public static class MappingList extends ArrayList { 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 d10b203..3423cd3 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/MappingUtils.java @@ -38,7 +38,7 @@ static String unmapClass(String className) { */ @Deprecated static MappingUtils.ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { - return MappingsUtilsImpl.mapField(className, fieldName, fieldDesc); + return MappingsUtilsImpl.mapField(MappingsUtilsImpl.getV1Registry(), className, fieldName, fieldDesc); } /** @@ -50,7 +50,7 @@ static MappingUtils.ClassMember mapField(String className, String fieldName, @Nu */ @Deprecated static MappingUtils.ClassMember mapFieldFromRemappedClass(String className, String fieldName, @Nullable String fieldDesc) { - return MappingsUtilsImpl.mapFieldFromRemappedClass(className, fieldName, fieldDesc); + return MappingsUtilsImpl.mapFieldFromRemappedClass(MappingsUtilsImpl.getV1Registry(), className, fieldName, fieldDesc); } /** @@ -62,7 +62,7 @@ static MappingUtils.ClassMember mapFieldFromRemappedClass(String className, Stri */ @Deprecated static MappingUtils.ClassMember mapMethod(String className, String methodName, String methodDesc) { - return MappingsUtilsImpl.mapMethod(className, methodName, methodDesc); + return MappingsUtilsImpl.mapMethod(MappingsUtilsImpl.getV1Registry(), className, methodName, methodDesc); } /** @@ -74,7 +74,7 @@ static MappingUtils.ClassMember mapMethod(String className, String methodName, S */ @Deprecated static MappingUtils.ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { - return MappingsUtilsImpl.mapMethodFromRemappedClass(className, methodName, methodDesc); + return MappingsUtilsImpl.mapMethodFromRemappedClass(MappingsUtilsImpl.getV1Registry(), className, methodName, methodDesc); } /** @@ -85,7 +85,7 @@ static MappingUtils.ClassMember mapMethodFromRemappedClass(String className, Str */ @Deprecated static MappingUtils.ClassMember mapField(Class owner, String fieldName) { - return MappingsUtilsImpl.mapField(owner, fieldName); + return MappingsUtilsImpl.mapField(MappingsUtilsImpl.getV1Registry(), owner, fieldName); } /** @@ -97,7 +97,7 @@ static MappingUtils.ClassMember mapField(Class owner, String fieldName) { */ @Deprecated static MappingUtils.ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { - return MappingsUtilsImpl.mapMethod(owner, methodName, parameterTypes); + return MappingsUtilsImpl.mapMethod(MappingsUtilsImpl.getV1Registry(), owner, methodName, parameterTypes); } /** 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 index 7becc3a..179df43 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/MappingUtils.java @@ -11,7 +11,7 @@ public interface MappingUtils { * @return remapped class name */ static String mapClass(String className) { - return MappingsUtilsImpl.mapClass(className); + return MappingsUtilsImpl.mapClass(MappingsUtilsImpl.getV1Registry(), className); } /** @@ -20,7 +20,7 @@ static String mapClass(String className) { * @return original class name */ static String unmapClass(String className) { - return MappingsUtilsImpl.unmapClass(className); + return MappingsUtilsImpl.unmapClass(MappingsUtilsImpl.getV1Registry(), className); } /** @@ -31,7 +31,7 @@ static String unmapClass(String className) { * @return */ static ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { - return MappingsUtilsImpl.mapField(className, fieldName, fieldDesc); + return MappingsUtilsImpl.mapField(MappingsUtilsImpl.getV1Registry(), className, fieldName, fieldDesc); } /** @@ -42,7 +42,7 @@ static ClassMember mapField(String className, String fieldName, @Nullable String * @return */ static ClassMember mapFieldFromRemappedClass(String className, String fieldName, @Nullable String fieldDesc) { - return MappingsUtilsImpl.mapFieldFromRemappedClass(className, fieldName, fieldDesc); + return MappingsUtilsImpl.mapFieldFromRemappedClass(MappingsUtilsImpl.getV1Registry(), className, fieldName, fieldDesc); } /** @@ -53,7 +53,7 @@ static ClassMember mapFieldFromRemappedClass(String className, String fieldName, * @return */ static ClassMember mapMethod(String className, String methodName, String methodDesc) { - return MappingsUtilsImpl.mapMethod(className, methodName, methodDesc); + return MappingsUtilsImpl.mapMethod(MappingsUtilsImpl.getV1Registry(), className, methodName, methodDesc); } /** @@ -64,15 +64,15 @@ static ClassMember mapMethod(String className, String methodName, String methodD * @return */ static ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { - return MappingsUtilsImpl.mapMethodFromRemappedClass(className, methodName, methodDesc); + return MappingsUtilsImpl.mapMethodFromRemappedClass(MappingsUtilsImpl.getV1Registry(), className, methodName, methodDesc); } static ClassMember mapField(Class owner, String fieldName) { - return MappingsUtilsImpl.mapField(owner, fieldName); + return MappingsUtilsImpl.mapField(MappingsUtilsImpl.getV1Registry(), owner, fieldName); } static ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { - return MappingsUtilsImpl.mapMethod(owner, methodName, parameterTypes); + return MappingsUtilsImpl.mapMethod(MappingsUtilsImpl.getV1Registry(), owner, methodName, parameterTypes); } /** @@ -81,7 +81,7 @@ static ClassMember mapMethod(Class owner, String methodName, Class[] param * @return remapped descriptor */ static String mapDescriptor(String desc) { - return MappingsUtilsImpl.mapDescriptor(desc); + return MappingsUtilsImpl.mapDescriptor(MappingsUtilsImpl.getV1Registry(), desc); } class ClassMember { diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ModRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ModRemapper.java index 93e11a2..f114218 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ModRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/api/v1/ModRemapper.java @@ -30,4 +30,12 @@ default Optional getSourceNamespace() { default Optional> getExtraMapping() { return Optional.empty(); } + + /** + * Whether to enable mixin remapping. Enabled by default for compatibility purposes. + * @return true - enabled
false - disabled + */ + default boolean remapMixins() { + return true; + } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModCandidate.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModCandidate.java new file mode 100644 index 0000000..5028b49 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModCandidate.java @@ -0,0 +1,9 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl; + +import java.nio.file.Path; + +public class DefaultModCandidate extends ModCandidate { + public DefaultModCandidate(String modName, Path file, Path original) { + super(modName, modName, file, original); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java deleted file mode 100644 index 21e539a..0000000 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModEntry.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.github.fabriccompatibiltylayers.modremappingapi.impl; - -import java.nio.file.Path; - -public class DefaultModEntry extends ModEntry { - protected DefaultModEntry(String modName, Path file, Path original) { - super(modName, modName, file, original); - } - - @Override - String getType() { - return "Possible"; - } -} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModRemapper.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModRemapper.java index a718099..067aa8f 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/DefaultModRemapper.java @@ -33,4 +33,9 @@ public void registerPreVisitors(VisitorInfos infos) { public void registerPostVisitors(VisitorInfos infos) { } + + @Override + public boolean remapMixins() { + return false; + } } 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 0b23642..feb3b6a 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/LibraryHandler.java @@ -18,16 +18,34 @@ import java.util.Map; public class LibraryHandler { - private static final Map remapLibraries = new HashMap<>(); + private final Map remapLibraries = new HashMap<>(); - public static void gatherRemapLibraries(List remappers) { + private String sourceNamespace; + + public LibraryHandler() {} + + public void init(String sourceNamespace) { + this.sourceNamespace = sourceNamespace; + + Path sourceLibraryPath = CacheUtils.getLibraryPath(this.sourceNamespace); + + if (!Files.exists(sourceLibraryPath)) { + try { + Files.createDirectories(sourceLibraryPath); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + public void gatherRemapLibraries(List remappers) { try { for (ModRemapper remapper : remappers) { List libraries = new ArrayList<>(); remapper.addRemapLibraries(libraries, FabricLoader.getInstance().getEnvironmentType()); - Map temp = CacheUtils.computeExtraLibraryPaths(libraries, MappingsUtilsImpl.getSourceNamespace()); + Map temp = CacheUtils.computeExtraLibraryPaths(libraries, sourceNamespace); for (Map.Entry entry : temp.entrySet()) { RemapLibrary library = entry.getKey(); @@ -54,7 +72,7 @@ public static void gatherRemapLibraries(List remappers) { } } - public static void addLibrariesToRemapClasspath(TinyRemapper remapper) { + public void addLibrariesToRemapClasspath(TinyRemapper remapper) { for (Path libPath : remapLibraries.values()) { if (Files.exists(libPath)) { remapper.readClassPathAsync(libPath); 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 50e030b..8f89c4e 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/MappingsUtilsImpl.java @@ -1,52 +1,20 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl; -import fr.catcore.modremapperapi.utils.Constants; import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1.ModRemapperV1Context; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; import net.fabricmc.api.EnvType; import net.fabricmc.loader.api.FabricLoader; -import net.fabricmc.mappingio.MappedElementKind; import net.fabricmc.mappingio.tree.*; -import net.fabricmc.tinyremapper.api.TrClass; -import net.fabricmc.tinyremapper.api.TrEnvironment; -import net.fabricmc.tinyremapper.api.TrMethod; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.objectweb.asm.Type; -import java.io.IOException; import java.util.*; -import java.util.stream.Collectors; @ApiStatus.Internal public class MappingsUtilsImpl { - private static String sourceNamespace = "official"; - private static String defaultPackage = ""; - - @ApiStatus.Internal - public static String getSourceNamespace() { - return sourceNamespace; - } - - @ApiStatus.Internal - 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"); - } - public static String getTargetNamespace() { return FabricLoader.getInstance().getMappingResolver().getCurrentRuntimeNamespace(); } @@ -59,224 +27,63 @@ public static String getNativeNamespace() { return "official"; } - @ApiStatus.Internal - public static void addMappingsToContext(MappingTree mappingTreeView) { - try { - MappingTreeHelper.merge(MappingsRegistry.FULL, mappingTreeView); - } catch (IOException e) { - e.printStackTrace(); - } - } - - public static void completeMappingsFromTr(TrEnvironment trEnvironment, String src) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(src); - int trueSrcNamespace = MappingsRegistry.FULL.getNamespaceId(MappingsRegistry.FULL.getSrcNamespace()); - - Map> classMembers = new HashMap<>(); - - for (MappingTree.ClassMapping classMapping : MappingsRegistry.FULL.getClasses()) { - String className = classMapping.getName(srcNamespace); - - TrClass trClass = trEnvironment.getClass(className); - - if (trClass == null) continue; - - List children = trClass.getChildren().stream().map(TrClass::getName).collect(Collectors.toList()); - - for (MappingTree.MethodMapping methodMapping : classMapping.getMethods()) { - String methodName = methodMapping.getName(srcNamespace); - String methodDesc = methodMapping.getDesc(srcNamespace); - - if (methodName == null || methodDesc == null) continue; - - TrMethod method = trClass.getMethod(methodName, methodDesc); - - if (method != null && method.isVirtual()) { - classMembers.put(new ExtendedClassMember( - methodMapping.getName(srcNamespace), methodMapping.getDesc(srcNamespace), className - ), children); - } - } - } - - gatherChildClassCandidates(trEnvironment, classMembers); - - int propagated = 0; - - try { - MappingsRegistry.FULL.visitHeader(); - MappingsRegistry.FULL.visitNamespaces(MappingsRegistry.FULL.getSrcNamespace(), MappingsRegistry.FULL.getDstNamespaces()); - MappingsRegistry.FULL.visitContent(); - } catch (IOException e) { - throw new RuntimeException(e); - } - - for (Map.Entry> entry : classMembers.entrySet()) { - ExtendedClassMember member = entry.getKey(); - - for (String child : entry.getValue()) { - - TrClass trClass = trEnvironment.getClass(child); - if (trClass == null) continue; - - if (srcNamespace == trueSrcNamespace) { - MappingsRegistry.FULL.visitClass(child); - } else { - MappingsRegistry.FULL.visitClass(MappingsRegistry.FULL.mapClassName(child, srcNamespace, trueSrcNamespace)); - } - - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(child, srcNamespace); - - if (classMapping == null) continue; - - TrMethod trMethod = trClass.getMethod(member.name, member.desc); - if (trMethod == null) continue; - - try { - if (srcNamespace == trueSrcNamespace) { - MappingsRegistry.FULL.visitMethod(member.name, member.desc); - } else { - MappingTree.MemberMapping memberMapping = MappingsRegistry.FULL.getMethod(member.owner, member.name, member.desc, srcNamespace); - if (memberMapping == null) continue; - - MappingsRegistry.FULL.visitMethod(memberMapping.getSrcName(), memberMapping.getSrcDesc()); - - MappingsRegistry.FULL.visitDstName(MappedElementKind.METHOD, srcNamespace, member.name); - MappingsRegistry.FULL.visitDstDesc(MappedElementKind.METHOD, srcNamespace, member.desc); - } - - 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 : MappingsRegistry.FULL.getDstNamespaces()) { - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(namespace); - - if (targetNamespace == srcNamespace) continue; - - if (newMethodMapping.getName(targetNamespace) == null) { - String targetName = methodMapping.getName(targetNamespace); - - if (targetName != null) { - MappingsRegistry.FULL.visitDstName(MappedElementKind.METHOD, targetNamespace, targetName); - actualPropagated = true; - } - } - - if (newMethodMapping.getDesc(targetNamespace) == null) { - String targetDesc = methodMapping.getDesc(targetNamespace); - - if (targetDesc != null) { - MappingsRegistry.FULL.visitDstDesc(MappedElementKind.METHOD, targetNamespace, targetDesc); - actualPropagated = true; - } - } - } - - if (actualPropagated) propagated++; - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - Constants.MAIN_LOGGER.info("Propagated: " + propagated + " methods from namespace " + src); - } - - - - public static void writeFullMappings() { - try { - MappingTreeHelper.exportMappings(MappingsRegistry.FULL, Constants.FULL_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void gatherChildClassCandidates(TrEnvironment trEnvironment, Map> classMembers) { - for (Map.Entry> entry : classMembers.entrySet()) { - List toAdd = new ArrayList<>(entry.getValue()); - - while (!toAdd.isEmpty()) { - TrClass trClass = trEnvironment.getClass(toAdd.remove(0)); - if (trClass == null) continue; - - List children = trClass.getChildren().stream().map(TrClass::getName).collect(Collectors.toList()); - - for (String child : children) { - if (!entry.getValue().contains(child)) { - toAdd.add(child); - entry.getValue().add(child); - } - } - } - } - } - - static class ExtendedClassMember extends MappingUtils.ClassMember { - public final String owner; - public ExtendedClassMember(String name, @Nullable String desc, String owner) { - super(name, desc); - this.owner = owner; - } + public static MappingsRegistry getV1Registry() { + return ModRemapperV1Context.INSTANCE.getMappingsRegistry(); } - public static String mapClass(String className) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static String mapClass(MappingsRegistry registry, String className) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - return MappingsRegistry.FULL.mapClassName(className, srcNamespace, targetNamespace); + return registry.getFullMappings().mapClassName(className, srcNamespace, targetNamespace); } - public static String unmapClass(String className) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); + public static String unmapClass(MappingsRegistry registry, String className) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); - return MappingsRegistry.FULL.mapClassName(className, srcNamespace, targetNamespace); + return registry.getFullMappings().mapClassName(className, srcNamespace, targetNamespace); } - public static MappingUtils.ClassMember mapField(String className, String fieldName, @Nullable String fieldDesc) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static MappingUtils.ClassMember mapField(MappingsRegistry registry, String className, String fieldName, @Nullable String fieldDesc) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - MappingTree.FieldMapping fieldMapping = MappingsRegistry.FULL.getField(className, fieldName, fieldDesc, srcNamespace); + MappingTree.FieldMapping fieldMapping = registry.getFullMappings().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 = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static MappingUtils.ClassMember mapFieldFromRemappedClass(MappingsRegistry registry, String className, String fieldName, @Nullable String fieldDesc) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, targetNamespace); + MappingTree.ClassMapping classMapping = registry.getFullMappings().getClass(className, targetNamespace); if (classMapping == null) return new MappingUtils.ClassMember(fieldName, fieldDesc); MappingTree.FieldMapping fieldMapping = classMapping.getField(fieldName, fieldDesc, srcNamespace); return mapMember(fieldName, fieldDesc, targetNamespace, fieldMapping); } - public static MappingUtils.ClassMember mapMethod(String className, String methodName, String methodDesc) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static MappingUtils.ClassMember mapMethod(MappingsRegistry registry, String className, String methodName, String methodDesc) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - MappingTree.MethodMapping methodMapping = MappingsRegistry.FULL.getMethod(className, methodName, methodDesc, srcNamespace); + MappingTree.MethodMapping methodMapping = registry.getFullMappings().getMethod(className, methodName, methodDesc, srcNamespace); if (methodMapping == null) { - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, srcNamespace); + MappingTree.ClassMapping classMapping = registry.getFullMappings().getClass(className, srcNamespace); if (classMapping != null) methodMapping = mapMethodWithPartialDesc(classMapping, methodName, methodDesc, srcNamespace); } return mapMember(methodName, methodDesc, targetNamespace, methodMapping); } - public static MappingUtils.ClassMember mapMethodFromRemappedClass(String className, String methodName, String methodDesc) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static MappingUtils.ClassMember mapMethodFromRemappedClass(MappingsRegistry registry, String className, String methodName, String methodDesc) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(className, targetNamespace); + MappingTree.ClassMapping classMapping = registry.getFullMappings().getClass(className, targetNamespace); if (classMapping == null) return new MappingUtils.ClassMember(methodName, methodDesc); MappingTree.MethodMapping methodMapping = classMapping.getMethod(methodName, methodDesc, srcNamespace); @@ -312,10 +119,10 @@ private static MappingUtils.ClassMember mapMember(String memberName, @Nullable S ); } - public static MappingUtils.ClassMember mapField(Class owner, String fieldName) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(owner.getName().replace(".", "/"), targetNamespace); + public static MappingUtils.ClassMember mapField(MappingsRegistry registry, Class owner, String fieldName) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); + MappingTree.ClassMapping classMapping = registry.getFullMappings().getClass(owner.getName().replace(".", "/"), targetNamespace); if (classMapping != null) { MappingTree.FieldMapping fieldMapping = classMapping.getField(fieldName, null, srcNamespace); @@ -326,29 +133,29 @@ public static MappingUtils.ClassMember mapField(Class owner, String fieldName } if (owner.getSuperclass() != null) { - return mapField(owner.getSuperclass(), fieldName); + return mapField(registry, owner.getSuperclass(), fieldName); } return new MappingUtils.ClassMember(fieldName, null); } - public static MappingUtils.ClassMember mapMethod(Class owner, String methodName, Class[] parameterTypes) { + public static MappingUtils.ClassMember mapMethod(MappingsRegistry registry, Class owner, String methodName, Class[] parameterTypes) { String argDesc = classTypeToDescriptor(parameterTypes); - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); - MappingTree.ClassMapping classMapping = MappingsRegistry.FULL.getClass(owner.getName().replace(".", "/"), targetNamespace); + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); + MappingTree.ClassMapping classMapping = registry.getFullMappings().getClass(owner.getName().replace(".", "/"), targetNamespace); if (classMapping != null) { for (MappingTree.MethodMapping methodDef : classMapping.getMethods()) { String methodSubName = methodDef.getName(srcNamespace); if (Objects.equals(methodSubName, methodName)) { - String methodDescriptor = methodDef.getDesc(getTargetNamespace()); + String methodDescriptor = methodDef.getDesc(registry.getTargetNamespace()); if (methodDescriptor != null && methodDescriptor.startsWith(argDesc)) { return new MappingUtils.ClassMember( - methodDef.getName(getTargetNamespace()), + methodDef.getName(registry.getTargetNamespace()), methodDescriptor ); } @@ -357,7 +164,7 @@ public static MappingUtils.ClassMember mapMethod(Class owner, String methodNa } if (owner.getSuperclass() != null) { - return mapMethod(owner.getSuperclass(), methodName, parameterTypes); + return mapMethod(registry, owner.getSuperclass(), methodName, parameterTypes); } return new MappingUtils.ClassMember(methodName, null); @@ -373,10 +180,10 @@ private static String classTypeToDescriptor(Class[] classTypes) { return desc + ")"; } - public static String mapDescriptor(String desc) { - int srcNamespace = MappingsRegistry.FULL.getNamespaceId(getSourceNamespace()); - int targetNamespace = MappingsRegistry.FULL.getNamespaceId(getTargetNamespace()); + public static String mapDescriptor(MappingsRegistry registry, String desc) { + int srcNamespace = registry.getFullMappings().getNamespaceId(registry.getSourceNamespace()); + int targetNamespace = registry.getFullMappings().getNamespaceId(registry.getTargetNamespace()); - return MappingsRegistry.FULL.mapDesc(desc, srcNamespace, targetNamespace); + return registry.getFullMappings().mapDesc(desc, srcNamespace, targetNamespace); } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModCandidate.java similarity index 70% rename from src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java rename to src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModCandidate.java index 90644c8..991bd28 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModEntry.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModCandidate.java @@ -2,19 +2,17 @@ import java.nio.file.Path; -public abstract class ModEntry { +public abstract class ModCandidate { public final String modName; public final String modId; public final Path file; public final Path original; - protected ModEntry(String modName, String modId, Path file, Path original) { + protected ModCandidate(String modName, String modId, Path file, Path original) { this.modName = modName; this.modId = modId; this.file = file; this.original = original; } - - abstract String getType(); } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java deleted file mode 100644 index 2d28bf8..0000000 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModDiscoverer.java +++ /dev/null @@ -1,225 +0,0 @@ -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.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; -import net.fabricmc.loader.impl.launch.FabricLauncherBase; -import org.jetbrains.annotations.NotNull; -import org.spongepowered.include.com.google.common.collect.ImmutableList; - -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; - -public class ModDiscoverer { - private static final Map> EXCLUDED = new HashMap<>(); - - protected static void init(List modRemappers, boolean remapClassEdits) { - ModRemapperContext context = new ModRemapperContext(modRemappers); - - context.init(); - - List mods = new ArrayList<>(); - - for (ModRemapper remapper : modRemappers) { - if (remapper instanceof V0ModRemapper) { - EXCLUDED.putAll(((V0ModRemapper) remapper).getExclusions()); - } - } - - for (ModRemapper remapper : modRemappers) { - for (String jarFolder : remapper.getJarFolders()) { - Path mcSubFolder = FabricLoader.getInstance().getGameDir().resolve(jarFolder); - Path cacheFolder = CacheUtils.getCachePath(jarFolder); - - try { - if (!Files.exists(mcSubFolder)) Files.createDirectories(mcSubFolder); - if (!Files.exists(cacheFolder)) Files.createDirectories(cacheFolder); - else FileUtils.emptyDir(cacheFolder); - - mods.addAll(discoverModsInFolder(mcSubFolder, cacheFolder)); - } catch (IOException | URISyntaxException e) { - e.printStackTrace(); - } - } - } - - Path mainTempDir = CacheUtils.getCachePath("temp"); - - if (Files.exists(mainTempDir)) { - FileUtils.emptyDir(mainTempDir); - } - - try { - Files.createDirectory(mainTempDir); - } catch (IOException e) { - throw new RuntimeException(e); - } - - Map modPaths = mods.stream() - .filter(entry -> Files.exists(entry.original)) - .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); - } - - for (Path path : modPaths.keySet()) { - MappingsRegistry.addModMappings(path); - } - - MappingsRegistry.generateModMappings(); - - context.remapMods(modPaths); - - modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath); - } - - private static Map excludeClassEdits(Map modPaths, Path tempFolder) { - Map map = new HashMap<>(); - Map convertMap = new HashMap<>(); - - for (Map.Entry entry : modPaths.entrySet()) { - Path tempDir = tempFolder.resolve(entry.getValue().getParent().getFileName().toString()); - - if (!Files.exists(tempDir)) { - try { - Files.createDirectory(tempDir); - } catch (IOException e) { - e.printStackTrace(); - continue; - } - } - - Path tempFile = tempDir.resolve(entry.getValue().getFileName().toString()); - map.put(tempFile, entry.getValue()); - convertMap.put(entry.getKey(), tempFile); - } - - List errored = new ArrayList<>(); - - for (Map.Entry entry : convertMap.entrySet()) { - try { - if (Files.isDirectory(entry.getKey())) { - FileUtils.zipFolder(entry.getKey(), entry.getValue()); - } else { - Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING); - } - - FileUtils.removeEntriesFromZip(entry.getValue(), MappingsRegistry.VANILLA_CLASS_LIST); - } catch (IOException | URISyntaxException e) { - e.printStackTrace(); - errored.add(entry.getValue()); - } - } - - errored.forEach(map::remove); - - return map; - } - - private static Optional discoverFolderMod(Path folder, Path destinationFolder) throws IOException { - String name = folder.getFileName().toString().replace(" ", "_"); - Path destination = destinationFolder.resolve(name + ".zip"); - - final boolean[] hasClasses = {false}; - - 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; - } - - return super.visitFile(file, attrs); - } - }); - - if (hasClasses[0]) { - return Optional.of( - new DefaultModEntry( - name, - destination, - folder - ) - ); - } - - return Optional.empty(); - } - - private static Optional discoverFileMod(Path file, Path destinationFolder) throws IOException { - String fileName = file.getFileName().toString().replace(" ", "_"); - String modName = fileName.replace(".jar", "").replace(".zip", ""); - - List entries = FileUtils.listZipContent(file); - - boolean found = false; - - for (String entry : entries) { - if (entry.contains("fabric.mod.json")) return Optional.empty(); - - if (entry.endsWith(".class")) { - found = true; - } - } - - if (found) { - return Optional.of( - new DefaultModEntry( - modName, - destinationFolder.resolve(fileName), - 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 (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)) { - for (String excluded : EXCLUDED.get(modEntry.modId)) { - if (Files.deleteIfExists(modEntry.file.resolve(excluded))) { - Constants.MAIN_LOGGER.debug("File deleted: " + modEntry.file.resolve(excluded)); - } - } - } else { - FileUtils.removeEntriesFromZip(modEntry.file, EXCLUDED.get(modEntry.modId)); - } - } - } - - return mods; - } -} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java deleted file mode 100644 index 27608ab..0000000 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemapperContext.java +++ /dev/null @@ -1,81 +0,0 @@ -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/ModRemappingAPIImpl.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemappingAPIImpl.java index 3ab181f..d04c1ae 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemappingAPIImpl.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/ModRemappingAPIImpl.java @@ -2,19 +2,14 @@ import fr.catcore.wfvaio.FabricVariants; import fr.catcore.wfvaio.WhichFabricVariantAmIOn; -import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.ModRemapperContext; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1.ModRemapperV1Context; import net.fabricmc.loader.api.FabricLoader; import java.io.File; -import java.util.ArrayList; -import java.util.List; public class ModRemappingAPIImpl { - - private static final String v0EntrypointName = "mod-remapper-api:modremapper"; - private static final String v1EntrypointName = "mod-remapper-api:modremapper_v1"; - private static final List modRemappers = new ArrayList<>(); + private static ModRemapperContext CURRENT_CONTEXT = null; public static final boolean BABRIC = WhichFabricVariantAmIOn.getVariant() == FabricVariants.BABRIC || WhichFabricVariantAmIOn.getVariant() == FabricVariants.BABRIC_NEW_FORMAT; public static boolean remapClassEdits = false; @@ -29,20 +24,20 @@ public static void init() { FabricLoader.getInstance().getConfigDir().toFile().mkdirs(); remapClassEdits = new File(FabricLoader.getInstance().getConfigDir().toFile(), ".remapclassedits").exists(); - FabricLoader.getInstance() - .getEntrypoints(v0EntrypointName, fr.catcore.modremapperapi.api.ModRemapper.class) - .stream() - .map(V0ModRemapper::new) - .forEach(modRemappers::add); - - modRemappers.addAll(FabricLoader.getInstance().getEntrypoints(v1EntrypointName, ModRemapper.class)); + CURRENT_CONTEXT = new ModRemapperV1Context(); + CURRENT_CONTEXT.gatherRemappers(); - ModDiscoverer.init(modRemappers, remapClassEdits); + CURRENT_CONTEXT.init(); + CURRENT_CONTEXT.discoverMods(remapClassEdits); - modRemappers.forEach(ModRemapper::afterRemap); + CURRENT_CONTEXT.afterRemap(); initializing = false; init = true; } } + + public static ModRemapperContext getCurrentContext() { + return CURRENT_CONTEXT; + } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/BaseModRemapperContext.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/BaseModRemapperContext.java new file mode 100644 index 0000000..2dc94b4 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/BaseModRemapperContext.java @@ -0,0 +1,16 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.context; + +import java.util.HashMap; +import java.util.Map; + +public abstract class BaseModRemapperContext implements ModRemapperContext { + private static final Map REGISTRY = new HashMap<>(); + + public BaseModRemapperContext(String id) { + REGISTRY.put(id, this); + } + + public static ModRemapperContext get(String id) { + return REGISTRY.get(id); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/MappingsRegistryInstance.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/MappingsRegistryInstance.java new file mode 100644 index 0000000..30c2784 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/MappingsRegistryInstance.java @@ -0,0 +1,206 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.context; + +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.mappings.MappingTreeHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +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.mappingio.MappingVisitor; +import net.fabricmc.mappingio.tree.MappingTree; +import net.fabricmc.mappingio.tree.MemoryMappingTree; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.*; + +public class MappingsRegistryInstance extends MappingsRegistry { + public List vanillaClassNames = new ArrayList<>(); + private MemoryMappingTree formatted = new MemoryMappingTree(); + private MemoryMappingTree mods, additional; + private final MemoryMappingTree full = new MemoryMappingTree(); + + private String defaultPackage = ""; + private String sourceNamespace = "official"; + + public MappingsRegistryInstance() { + super(); + + try { + this.formatVanillaMappings(); + mods = MappingTreeHelper.createMappingTree(this.sourceNamespace, getTargetNamespace()); + additional = MappingTreeHelper.createMappingTree(this.sourceNamespace, getTargetNamespace()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void formatVanillaMappings() throws IOException { + 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; + } + + MappingVisitor visitor = MappingTreeHelper.getNsReorderingVisitor(formatted, switchNamespace, renames); + + MappingsRegistry.VANILLA.accept(visitor); + } + + @Override + public List getVanillaClassNames() { + return vanillaClassNames; + } + + @Override + public MemoryMappingTree getFormattedMappings() { + return formatted; + } + + @Override + public void addToFormattedMappings(InputStream stream) throws IOException { + MappingTree extra = MappingTreeHelper.readMappings(stream); + + formatted = MappingTreeHelper.mergeIntoNew(formatted, extra); + } + + @Override + public void completeFormattedMappings() throws IOException { + formatted.accept(full); + + for (MappingTree.ClassMapping classView : formatted.getClasses()) { + String className = classView.getName(this.getSourceNamespace()); + + if (className != null) { + vanillaClassNames.add("/" + className + ".class"); + } + } + + try { + MappingTreeHelper.exportMappings(formatted, Constants.MC_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException("Error while writing formatted mappings", e); + } + } + + public void setDefaultPackage(String defaultPackage) { + this.defaultPackage = defaultPackage; + } + + @Override + public 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("/") ? "" : this.defaultPackage) + cl)); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public 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); + } + + this.addToFullMappings(mods); + } + + @Override + public MemoryMappingTree getModsMappings() { + return mods; + } + + @Override + public MemoryMappingTree getAdditionalMappings() { + return additional; + } + + @Override + public void generateAdditionalMappings() { + additional.visitEnd(); + + try { + MappingTreeHelper.exportMappings(additional, Constants.EXTRA_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException("Error while generating remappers mappings", e); + } + + this.addToFullMappings(additional); + } + + @Override + public MemoryMappingTree getFullMappings() { + return full; + } + + @Override + public String getSourceNamespace() { + return sourceNamespace; + } + + public void setSourceNamespace(String sourceNamespace) { + this.sourceNamespace = sourceNamespace; + + try { + mods = MappingTreeHelper.createMappingTree(this.sourceNamespace, getTargetNamespace()); + additional = MappingTreeHelper.createMappingTree(this.sourceNamespace, getTargetNamespace()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public String getTargetNamespace() { + return FabricLoader.getInstance().getMappingResolver().getCurrentRuntimeNamespace(); + } + + @Override + public void writeFullMappings() { + try { + MappingTreeHelper.exportMappings(full, Constants.FULL_MAPPINGS_FILE.toPath()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public List getRemappingMappings() { + return Arrays.asList( + this.getFormattedMappings(), + this.getModsMappings(), + this.getAdditionalMappings() + ); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/ModRemapperContext.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/ModRemapperContext.java new file mode 100644 index 0000000..a748708 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/ModRemapperContext.java @@ -0,0 +1,24 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.context; + +import io.github.fabriccompatibiltylayers.modremappingapi.impl.LibraryHandler; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.RemappingFlags; +import net.fabricmc.tinyremapper.TinyRemapper; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface ModRemapperContext { + void init(); + void remapMods(Map pathMap); + void afterRemap(); + void discoverMods(boolean remapClassEdits); + void gatherRemappers(); + Map> getMixin2TargetMap(); + MappingsRegistry getMappingsRegistry(); + void addToRemapperBuilder(TinyRemapper.Builder builder); + Set getRemappingFlags(); + LibraryHandler getLibraryHandler(); +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/ModRemapperV1Context.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/ModRemapperV1Context.java new file mode 100644 index 0000000..73697ec --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/ModRemapperV1Context.java @@ -0,0 +1,165 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1; + +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingBuilder; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.*; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.BaseModRemapperContext; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.context.MappingsRegistryInstance; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.ModTrRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.RemappingFlags; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.SoftLockFixer; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.visitor.MRAApplyVisitor; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.impl.launch.FabricLauncherBase; +import net.fabricmc.tinyremapper.TinyRemapper; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.*; +import java.util.function.Supplier; + +public class ModRemapperV1Context extends BaseModRemapperContext { + private final Set remapFlags = new HashSet<>(); + private final List remappers = new ArrayList<>(); + private final Map> mixin2TargetMap = new HashMap<>(); + private final MappingsRegistryInstance mappingsRegistry = new MappingsRegistryInstance(); + private final LibraryHandler libraryHandler = new LibraryHandler(); + private final V1ModDiscoverer modDiscoverer = new V1ModDiscoverer(); + + public static ModRemapperV1Context INSTANCE; + + public ModRemapperV1Context() { + super("mod-remapping-api_v1"); + INSTANCE = this; + } + + public void init() { + for (ModRemapper remapper : remappers) { + Optional pkg = remapper.getDefaultPackage(); + + pkg.ifPresent(this.mappingsRegistry::setDefaultPackage); + + Optional sourceNamespace = remapper.getSourceNamespace(); + + sourceNamespace.ifPresent(this.mappingsRegistry::setSourceNamespace); + + Optional> mappings = remapper.getExtraMapping(); + + mappings.ifPresent(inputStreamSupplier -> { + try { + this.mappingsRegistry.addToFormattedMappings(inputStreamSupplier.get()); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + if (remapper.remapMixins()) { + remapFlags.add(RemappingFlags.MIXIN); + } + } + + try { + this.mappingsRegistry.completeFormattedMappings(); + } catch (IOException e) { + throw new RuntimeException(e); + } + + libraryHandler.init(this.mappingsRegistry.getSourceNamespace()); + + libraryHandler.gatherRemapLibraries(remappers); + + this.registerAdditionalMappings(); + this.mappingsRegistry.generateAdditionalMappings(); + } + + public void remapMods(Map pathMap) { + Constants.MAIN_LOGGER.debug("Starting jar remapping!"); + SoftLockFixer.preloadClasses(); + TinyRemapper remapper = ModTrRemapper.makeRemapper(this); + Constants.MAIN_LOGGER.debug("Remapper created!"); + ModTrRemapper.remapMods(remapper, pathMap, this.mappingsRegistry); + Constants.MAIN_LOGGER.debug("Jar remapping done!"); + + this.mappingsRegistry.writeFullMappings(); + } + + @Override + public void afterRemap() { + remappers.forEach(ModRemapper::afterRemap); + } + + @Override + public void discoverMods(boolean remapClassEdits) { + Map modPaths = this.modDiscoverer.init(remappers, remapClassEdits, this); + + for (Path path : modPaths.keySet()) { + mappingsRegistry.addModMappings(path); + } + + mappingsRegistry.generateModMappings(); + + this.remapMods(modPaths); + + modPaths.values().forEach(FabricLauncherBase.getLauncher()::addToClassPath); + } + + private static final String v0EntrypointName = "mod-remapper-api:modremapper"; + private static final String v1EntrypointName = "mod-remapper-api:modremapper_v1"; + + @Override + public void gatherRemappers() { + FabricLoader.getInstance() + .getEntrypoints(v0EntrypointName, fr.catcore.modremapperapi.api.ModRemapper.class) + .stream() + .map(V0ModRemapper::new) + .forEach(remappers::add); + + remappers.addAll(FabricLoader.getInstance().getEntrypoints(v1EntrypointName, ModRemapper.class)); + } + + @Override + public Map> getMixin2TargetMap() { + return mixin2TargetMap; + } + + @Override + public MappingsRegistry getMappingsRegistry() { + return this.mappingsRegistry; + } + + private void registerAdditionalMappings() { + MappingBuilder builder = new MappingBuilderImpl(mappingsRegistry.getAdditionalMappings()); + + for (ModRemapper remapper : remappers) { + remapper.registerMappings(builder); + } + } + + @Override + public void addToRemapperBuilder(TinyRemapper.Builder builder) { + VisitorInfosImpl preInfos = new VisitorInfosImpl(); + VisitorInfosImpl postInfos = new VisitorInfosImpl(); + + for (ModRemapper modRemapper : remappers) { + modRemapper.registerPreVisitors(preInfos); + modRemapper.registerPostVisitors(postInfos); + } + + builder.extraPreApplyVisitor(new MRAApplyVisitor(preInfos)); + builder.extraPostApplyVisitor(new MRAApplyVisitor(postInfos)); + } + + @Override + public Set getRemappingFlags() { + return remapFlags; + } + + @Override + public LibraryHandler getLibraryHandler() { + return libraryHandler; + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/V1ModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/V1ModDiscoverer.java new file mode 100644 index 0000000..b9f24db --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/context/v1/V1ModDiscoverer.java @@ -0,0 +1,179 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.context.v1; + +import fr.catcore.modremapperapi.utils.Constants; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.DefaultModCandidate; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModCandidate; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.compatibility.V0ModRemapper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.discover.BaseModDiscoverer; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.CacheUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; +import net.fabricmc.loader.api.FabricLoader; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; +import java.util.stream.Collectors; + +public class V1ModDiscoverer extends BaseModDiscoverer { + private final Map> excluded = new HashMap<>(); + + public Map init(List modRemappers, boolean remapClassEdits, ModRemapperV1Context context) { + Set modFolders = new HashSet<>(); + + for (ModRemapper remapper : modRemappers) { + Collections.addAll(modFolders, remapper.getJarFolders()); + + if (remapper instanceof V0ModRemapper) { + excluded.putAll(((V0ModRemapper) remapper).getExclusions()); + } + } + + List mods = new ArrayList<>(); + + for (String jarFolder : modFolders) { + Path mcSubFolder = FabricLoader.getInstance().getGameDir().resolve(jarFolder); + Path cacheFolder = CacheUtils.getCachePath(jarFolder); + + try { + if (!Files.exists(mcSubFolder)) Files.createDirectories(mcSubFolder); + if (!Files.exists(cacheFolder)) Files.createDirectories(cacheFolder); + else FileUtils.emptyDir(cacheFolder); + + mods.addAll(this.discoverMods(mcSubFolder, cacheFolder)); + + this.handleV0Excluded(mods); + } catch (IOException | URISyntaxException e) { + e.printStackTrace(); + } + } + + Path mainTempDir = CacheUtils.getCachePath("temp"); + + if (Files.exists(mainTempDir)) { + FileUtils.emptyDir(mainTempDir); + } + + try { + Files.createDirectory(mainTempDir); + } catch (IOException e) { + throw new RuntimeException(e); + } + + Map modPaths = mods.stream() + .filter(entry -> Files.exists(entry.original)) + .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, context.getMappingsRegistry()); + } + + return modPaths; + } + + private void handleV0Excluded(List mods) throws IOException, URISyntaxException { + for (ModCandidate modCandidate : mods) { + if (excluded.containsKey(modCandidate.modId)) { + if (Files.isDirectory(modCandidate.file)) { + for (String excluded : excluded.get(modCandidate.modId)) { + if (Files.deleteIfExists(modCandidate.file.resolve(excluded))) { + Constants.MAIN_LOGGER.debug("File deleted: " + modCandidate.file.resolve(excluded)); + } + } + } else { + FileUtils.removeEntriesFromZip(modCandidate.file, excluded.get(modCandidate.modId)); + } + } + } + } + + @Override + public boolean isValidFileName(String fileName) { + return fileName.endsWith(".jar") || fileName.endsWith(".zip"); + } + + @Override + public boolean allowDirectoryMods() { + return true; + } + + @Override + public boolean searchRecursively() { + return false; + } + + @Override + public boolean isValidDirectoryName(String directoryName) { + return false; + } + + @Override + public Optional discoverFolderMod(Path folder, Path destinationFolder) throws IOException { + String name = folder.getFileName().toString().replace(" ", "_"); + Path destination = destinationFolder.resolve(name + ".zip"); + + final boolean[] hasClasses = {false}; + + 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; + } + + return super.visitFile(file, attrs); + } + }); + + if (hasClasses[0]) { + return Optional.of( + new DefaultModCandidate( + name, + destination, + folder + ) + ); + } + + return Optional.empty(); + } + + @Override + public Optional discoverFileMod(Path file, Path destinationFolder) throws IOException { + String fileName = file.getFileName().toString().replace(" ", "_"); + String modName = fileName.replace(".jar", "").replace(".zip", ""); + + List entries = FileUtils.listZipContent(file); + + boolean found = false; + + for (String entry : entries) { + if (entry.contains("fabric.mod.json")) return Optional.empty(); + + if (entry.endsWith(".class")) { + found = true; + } + } + + if (found) { + return Optional.of( + new DefaultModCandidate( + modName, + destinationFolder.resolve(fileName), + file + ) + ); + } + + return Optional.empty(); + } +} diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/discover/BaseModDiscoverer.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/discover/BaseModDiscoverer.java new file mode 100644 index 0000000..c4621c6 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/discover/BaseModDiscoverer.java @@ -0,0 +1,92 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.discover; + +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModCandidate; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.FileUtils; +import org.spongepowered.include.com.google.common.collect.ImmutableList; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.*; + +public abstract class BaseModDiscoverer { + public abstract boolean isValidFileName(String fileName); + public abstract boolean allowDirectoryMods(); + public abstract boolean searchRecursively(); + public abstract boolean isValidDirectoryName(String directoryName); + public abstract Optional discoverFolderMod(Path folder, Path destinationFolder) throws IOException; + public abstract Optional discoverFileMod(Path file, Path destinationFolder) throws IOException; + + public List discoverMods(Path folder, Path destination) throws IOException { + 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 (Files.isDirectory(path)) { + if (searchRecursively() && isValidDirectoryName(name)) { + mods.addAll(discoverMods(folder.resolve(name), destination.resolve(name))); + } else if (allowDirectoryMods()) { + discoverFolderMod(path, destination) + .ifPresent(mods::add); + } + } else if (Files.exists(path) && isValidFileName(name)) { + discoverFileMod(path, destination) + .ifPresent(mods::add); + } + } + } + + return mods; + } + + public Map excludeClassEdits(Map modPaths, Path tempFolder, MappingsRegistry mappingsRegistry) { + Map map = new HashMap<>(); + Map convertMap = new HashMap<>(); + + for (Map.Entry entry : modPaths.entrySet()) { + Path tempDir = tempFolder.resolve(entry.getValue().getParent().getFileName().toString()); + + if (!Files.exists(tempDir)) { + try { + Files.createDirectory(tempDir); + } catch (IOException e) { + e.printStackTrace(); + continue; + } + } + + Path tempFile = tempDir.resolve(entry.getValue().getFileName().toString()); + map.put(tempFile, entry.getValue()); + convertMap.put(entry.getKey(), tempFile); + } + + List errored = new ArrayList<>(); + + for (Map.Entry entry : convertMap.entrySet()) { + try { + if (Files.isDirectory(entry.getKey())) { + FileUtils.zipFolder(entry.getKey(), entry.getValue()); + } else { + Files.copy(entry.getKey(), entry.getValue(), StandardCopyOption.REPLACE_EXISTING); + } + + FileUtils.removeEntriesFromZip(entry.getValue(), mappingsRegistry.getVanillaClassNames()); + } catch (IOException | URISyntaxException e) { + e.printStackTrace(); + errored.add(entry.getValue()); + } + } + + errored.forEach(map::remove); + + return map; + } +} 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 0bba6a3..b28caac 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,6 +1,6 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.impl.util.log.Log; import net.fabricmc.loader.impl.util.log.LogCategory; @@ -33,7 +33,9 @@ public class MappingTreeHelper { @ApiStatus.Internal - public static void mergeIntoNew(VisitableMappingTree result, MappingTree left, MappingTree right) throws IOException { + public static MemoryMappingTree mergeIntoNew(MappingTree left, MappingTree right) throws IOException { + MemoryMappingTree result = new MemoryMappingTree(); + if (!Objects.equals(left.getSrcNamespace(), right.getSrcNamespace())) { throw new RuntimeException("Source namespace mismatch!"); } @@ -58,6 +60,8 @@ public static void mergeIntoNew(VisitableMappingTree result, MappingTree left, M reorderedLeft.accept(result, VisitOrder.createByName()); reorderedRight.accept(result, VisitOrder.createByName()); + + return result; } @ApiStatus.Internal @@ -71,7 +75,7 @@ public static void merge(VisitableMappingTree main, MappingTree additional) thro List dstNamespaces = new ArrayList<>(additional.getDstNamespaces()); dstNamespaces.add(main.getSrcNamespace()); - visitor = new MappingDstNsReorder(reorder, dstNamespaces); + visitor = new MappingDstNsReorder(visitor, dstNamespaces); } additional.accept(visitor); @@ -122,7 +126,9 @@ public static IMappingProvider createMappingProvider(MappingTree mappings, Strin @ApiStatus.Internal public static MemoryMappingTree createMappingTree() throws IOException { - return createMappingTree(MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace()); + MappingsRegistry registry = ModRemappingAPIImpl.getCurrentContext().getMappingsRegistry(); + + return createMappingTree(registry.getSourceNamespace(), registry.getTargetNamespace()); } @ApiStatus.Internal 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 5952a0f..0d42728 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,18 +1,14 @@ 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.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; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.utils.VersionHelper; -import net.fabricmc.loader.api.FabricLoader; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import net.fabricmc.loader.impl.launch.MappingConfiguration; -import net.fabricmc.mappingio.MappingVisitor; +import net.fabricmc.mappingio.MappedElementKind; import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.mappingio.tree.MemoryMappingTree; +import net.fabricmc.tinyremapper.api.TrClass; +import net.fabricmc.tinyremapper.api.TrEnvironment; +import net.fabricmc.tinyremapper.api.TrMethod; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -22,29 +18,12 @@ import java.net.URLConnection; import java.nio.file.Path; import java.util.*; +import java.util.stream.Collectors; import java.util.zip.ZipError; @ApiStatus.Internal -public class MappingsRegistry { - public static List VANILLA_CLASS_LIST = new ArrayList<>(); - +public abstract class MappingsRegistry { 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); - } - } - - public static MemoryMappingTree FULL = new MemoryMappingTree(); static { URL url = MappingConfiguration.class.getClassLoader().getResource("mappings/mappings.tiny"); @@ -62,107 +41,194 @@ public class MappingsRegistry { } } - 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; + public abstract List getVanillaClassNames(); + public abstract MemoryMappingTree getFormattedMappings(); + public abstract void addToFormattedMappings(InputStream stream) throws IOException; + public abstract void completeFormattedMappings() throws IOException; + public abstract void addModMappings(Path path); + public abstract void generateModMappings(); + public abstract MemoryMappingTree getModsMappings(); + public abstract MemoryMappingTree getAdditionalMappings(); + public abstract void generateAdditionalMappings(); + public abstract MemoryMappingTree getFullMappings(); + public abstract String getSourceNamespace(); + public abstract String getTargetNamespace(); + public abstract void writeFullMappings(); + public abstract List getRemappingMappings(); + + public void addToFullMappings(MappingTree mappingTreeView) { + try { + MappingTreeHelper.merge(this.getFullMappings(), mappingTreeView); + } catch (IOException e) { + e.printStackTrace(); } + } - MemoryMappingTree tempTree = new MemoryMappingTree(); - MappingVisitor visitor = MappingTreeHelper.getNsReorderingVisitor(tempTree, switchNamespace, renames); + public boolean isSourceNamespaceObf() { + return Objects.equals(getSourceNamespace(), "official"); + } - VANILLA.accept(visitor); + public void completeMappingsFromTr(TrEnvironment trEnvironment, String src) { + int srcNamespace = getFullMappings().getNamespaceId(src); + int trueSrcNamespace = getFullMappings().getNamespaceId(getFullMappings().getSrcNamespace()); - if (extraStream == null) { - tempTree.accept(FORMATTED); - } else { - MappingTree extra = MappingTreeHelper.readMappings(extraStream); + Map> classMembers = getClassMembers(trEnvironment, srcNamespace); - MappingTreeHelper.mergeIntoNew( - FORMATTED, - tempTree, - extra - ); + gatherChildClassCandidates(trEnvironment, classMembers); + + try { + getFullMappings().visitHeader(); + getFullMappings().visitNamespaces(getFullMappings().getSrcNamespace(), getFullMappings().getDstNamespaces()); + getFullMappings().visitContent(); + } catch (IOException e) { + throw new RuntimeException(e); } - FORMATTED.accept(FULL); + int propagated = propagateMembers(trEnvironment, classMembers, srcNamespace, trueSrcNamespace); + + Constants.MAIN_LOGGER.info("Propagated: " + propagated + " methods from namespace " + src); + } + + private int propagateMembers(TrEnvironment trEnvironment, Map> classMembers, int srcNamespace, int trueSrcNamespace) { + int propagated = 0; + + for (Map.Entry> entry : classMembers.entrySet()) { + ExtendedClassMember member = entry.getKey(); + + for (String child : entry.getValue()) { + + TrClass trClass = trEnvironment.getClass(child); + if (trClass == null) continue; + + if (srcNamespace == trueSrcNamespace) { + getFullMappings().visitClass(child); + } else { + getFullMappings().visitClass(getFullMappings().mapClassName(child, srcNamespace, trueSrcNamespace)); + } + + MappingTree.ClassMapping classMapping = getFullMappings().getClass(child, srcNamespace); + + if (classMapping == null) continue; - for (MappingTree.ClassMapping classView : FORMATTED.getClasses()) { - String className = classView.getName(MappingsUtilsImpl.getSourceNamespace()); + TrMethod trMethod = trClass.getMethod(member.name, member.desc); + if (trMethod == null) continue; - if (className != null) { - VANILLA_CLASS_LIST.add("/" + className + ".class"); + try { + Boolean actualPropagated = tryPropagatingMember(srcNamespace, trueSrcNamespace, member, classMapping); + if (actualPropagated == null) continue; + + if (actualPropagated) propagated++; + } catch (IOException e) { + e.printStackTrace(); + } } } + return propagated; + } - try { - MappingTreeHelper.exportMappings(MappingsRegistry.FORMATTED, Constants.MC_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException("Error while writing formatted mappings", e); + private @Nullable Boolean tryPropagatingMember(int srcNamespace, int trueSrcNamespace, ExtendedClassMember member, MappingTree.ClassMapping classMapping) throws IOException { + if (srcNamespace == trueSrcNamespace) { + getFullMappings().visitMethod(member.name, member.desc); + } else { + MappingTree.MemberMapping memberMapping = getFullMappings().getMethod(member.owner, member.name, member.desc, srcNamespace); + if (memberMapping == null) return null; + + getFullMappings().visitMethod(memberMapping.getSrcName(), memberMapping.getSrcDesc()); + + getFullMappings().visitDstName(MappedElementKind.METHOD, srcNamespace, member.name); + getFullMappings().visitDstDesc(MappedElementKind.METHOD, srcNamespace, member.desc); } - } - public static void addModMappings(Path path) { - MappingBuilder mappingBuilder = new MappingBuilderImpl(MODS); + MappingTree.MethodMapping methodMapping = getFullMappings().getMethod(member.owner, member.name, member.desc, srcNamespace); + if (methodMapping == null) return null; - try { - FileUtils.listPathContent(path) - .stream() - .filter(file -> file.endsWith(".class")) - .map(file -> file.replace(".class", "")) - .forEach(cl -> mappingBuilder.addMapping(cl, (cl.contains("/") ? "" : MappingsUtilsImpl.getDefaultPackage()) + cl)); - } catch (IOException e) { - throw new RuntimeException(e); + MappingTree.MethodMapping newMethodMapping = classMapping.getMethod(member.name, member.desc, srcNamespace); + + boolean actualPropagated = false; + + for (String namespace : getFullMappings().getDstNamespaces()) { + int targetNamespace = getFullMappings().getNamespaceId(namespace); + + if (targetNamespace == srcNamespace) continue; + + if (newMethodMapping.getName(targetNamespace) == null) { + String targetName = methodMapping.getName(targetNamespace); + + if (targetName != null) { + getFullMappings().visitDstName(MappedElementKind.METHOD, targetNamespace, targetName); + actualPropagated = true; + } + } + + if (newMethodMapping.getDesc(targetNamespace) == null) { + String targetDesc = methodMapping.getDesc(targetNamespace); + + if (targetDesc != null) { + getFullMappings().visitDstDesc(MappedElementKind.METHOD, targetNamespace, targetDesc); + actualPropagated = true; + } + } } + + return actualPropagated; } - public static void generateModMappings() { - try { - MODS.visitEnd(); + private Map> getClassMembers(TrEnvironment trEnvironment, int srcNamespace) { + Map> classMembers = new HashMap<>(); - MappingTreeHelper.exportMappings(MODS, Constants.REMAPPED_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException("Error while generating mods mappings", e); + for (MappingTree.ClassMapping classMapping : getFullMappings().getClasses()) { + String className = classMapping.getName(srcNamespace); + + TrClass trClass = trEnvironment.getClass(className); + + if (trClass == null) continue; + + List children = trClass.getChildren().stream().map(TrClass::getName).collect(Collectors.toList()); + + for (MappingTree.MethodMapping methodMapping : classMapping.getMethods()) { + String methodName = methodMapping.getName(srcNamespace); + String methodDesc = methodMapping.getDesc(srcNamespace); + + if (methodName == null || methodDesc == null) continue; + + TrMethod method = trClass.getMethod(methodName, methodDesc); + + if (method != null && method.isVirtual()) { + classMembers.put(new ExtendedClassMember( + methodMapping.getName(srcNamespace), methodMapping.getDesc(srcNamespace), className + ), children); + } + } } - MappingsUtilsImpl.addMappingsToContext(MODS); + return classMembers; } - public static void registerAdditionalMappings(List remappers) { - MappingBuilder builder = new MappingBuilderImpl(ADDITIONAL); + private void gatherChildClassCandidates(TrEnvironment trEnvironment, Map> classMembers) { + for (Map.Entry> entry : classMembers.entrySet()) { + List toAdd = new ArrayList<>(entry.getValue()); - for (ModRemapper remapper : remappers) { - remapper.registerMappings(builder); - } + while (!toAdd.isEmpty()) { + TrClass trClass = trEnvironment.getClass(toAdd.remove(0)); + if (trClass == null) continue; - ADDITIONAL.visitEnd(); + List children = trClass.getChildren().stream().map(TrClass::getName).collect(Collectors.toList()); - try { - MappingTreeHelper.exportMappings(ADDITIONAL, Constants.EXTRA_MAPPINGS_FILE.toPath()); - } catch (IOException e) { - throw new RuntimeException("Error while generating remappers mappings", e); + for (String child : children) { + if (!entry.getValue().contains(child)) { + toAdd.add(child); + entry.getValue().add(child); + } + } + } } + } - MappingsUtilsImpl.addMappingsToContext(ADDITIONAL); + static class ExtendedClassMember extends MappingUtils.ClassMember { + public final String owner; + public ExtendedClassMember(String name, @Nullable String desc, String owner) { + super(name, desc); + this.owner = owner; + } } } 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 deleted file mode 100644 index 99b973e..0000000 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/MixinRemappingHelper.java +++ /dev/null @@ -1,12 +0,0 @@ -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 index 6b7a278..72b5c1b 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/ModTrRemapper.java @@ -1,14 +1,10 @@ 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.context.ModRemapperContext; 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; @@ -24,8 +20,10 @@ @ApiStatus.Internal public class ModTrRemapper { - public static TinyRemapper makeRemapper(List remappers) { - List trees = Arrays.asList(MappingsRegistry.FORMATTED, MappingsRegistry.ADDITIONAL, MappingsRegistry.MODS); + public static TinyRemapper makeRemapper(ModRemapperContext context) { + MappingsRegistry mappingsRegistry = context.getMappingsRegistry(); + + List trees = mappingsRegistry.getRemappingMappings(); TinyRemapper.Builder builder = TinyRemapper .newRemapper() @@ -39,49 +37,36 @@ public static TinyRemapper makeRemapper(List remappers) { } for (MappingTree tree : trees) { - builder.withMappings(MappingTreeHelper.createMappingProvider(tree, MappingsUtilsImpl.getSourceNamespace(), MappingsUtilsImpl.getTargetNamespace())); + builder.withMappings(MappingTreeHelper.createMappingProvider(tree, mappingsRegistry.getSourceNamespace(), mappingsRegistry.getTargetNamespace())); } - MRAApplyVisitor preApplyVisitor = new MRAApplyVisitor(); - MRAApplyVisitor postApplyVisitor = new MRAApplyVisitor(); - MixinPostApplyVisitor mixinPostApplyVisitor = new MixinPostApplyVisitor(); - - VisitorInfosImpl preInfos = new VisitorInfosImpl(); - VisitorInfosImpl postInfos = new VisitorInfosImpl(); + context.addToRemapperBuilder(builder); - for (ModRemapper modRemapper : remappers) { - modRemapper.registerPreVisitors(preInfos); - modRemapper.registerPostVisitors(postInfos); + if (context.getRemappingFlags().contains(RemappingFlags.MIXIN)) { + MixinPostApplyVisitor mixinPostApplyVisitor = new MixinPostApplyVisitor(); + builder.extraPostApplyVisitor(mixinPostApplyVisitor); + builder.extension(new MixinExtension(EnumSet.of(MixinExtension.AnnotationTarget.HARD))); } - 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); + MinecraftRemapper.addMinecraftJar(remapper, mappingsRegistry); } catch (IOException e) { throw new RuntimeException(e); } - LibraryHandler.addLibrariesToRemapClasspath(remapper); + context.getLibraryHandler().addLibrariesToRemapClasspath(remapper); return remapper; } - public static void remapMods(TinyRemapper remapper, Map paths) { + public static void remapMods(TinyRemapper remapper, Map paths, MappingsRegistry mappingsRegistry) { 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()); + TrRemapperHelper.applyRemapper(remapper, paths, outputConsumerPaths, resourceRemappers, true, mappingsRegistry.getSourceNamespace(), mappingsRegistry.getTargetNamespace()); } } diff --git a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/RemappingFlags.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/RemappingFlags.java new file mode 100644 index 0000000..51861d0 --- /dev/null +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/RemappingFlags.java @@ -0,0 +1,8 @@ +package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public enum RemappingFlags { + MIXIN +} 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 3d08f27..c247ae0 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 @@ -68,11 +68,7 @@ public static void preloadClasses() { "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", @@ -81,7 +77,6 @@ public static void preloadClasses() { "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", 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 index afbd2b9..af555e8 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/TrRemapperHelper.java @@ -1,7 +1,7 @@ package io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper; import fr.catcore.modremapperapi.utils.Constants; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.MappingsUtilsImpl; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; import net.fabricmc.tinyremapper.InputTag; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; @@ -42,7 +42,7 @@ public static void applyRemapper(TinyRemapper remapper, Map paths, L Constants.MAIN_LOGGER.debug("Done 1!"); } - if (analyzeMapping) MappingsUtilsImpl.completeMappingsFromTr(remapper.getEnvironment(), srcNamespace); + if (analyzeMapping) ModRemappingAPIImpl.getCurrentContext().getMappingsRegistry().completeMappingsFromTr(remapper.getEnvironment(), srcNamespace); } catch (Exception e) { remapper.finish(); outputConsumerPaths.forEach(o -> { 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 9995326..2601d85 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 @@ -1,8 +1,6 @@ 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.mappings.MappingTreeHelper; import io.github.fabriccompatibiltylayers.modremappingapi.impl.mappings.MappingsRegistry; @@ -22,14 +20,14 @@ @ApiStatus.Internal public class MinecraftRemapper { - private static Collection getMinecraftJar(Collection sourcePaths, String src, String target) throws IOException { + private static Collection getMinecraftJar(Collection sourcePaths, String src, String target, MappingsRegistry mappingsRegistry) throws IOException { Path targetFolder = CacheUtils.getLibraryPath(target); if (!Files.exists(targetFolder)) { Files.createDirectories(targetFolder); } - Map paths = CacheUtils.computeLibraryPaths(sourcePaths, target); + Map paths = CacheUtils.computeLibraryPaths(new HashSet<>(sourcePaths), target); if (FileUtils.exist(paths.values())) return paths.values(); @@ -43,7 +41,9 @@ private static Collection getMinecraftJar(Collection sourcePaths, St .ignoreConflicts(true) .fixPackageAccess(true) .withMappings( - MappingTreeHelper.createMappingProvider(MappingsRegistry.FORMATTED, src, target) + MappingTreeHelper.createMappingProvider( + mappingsRegistry.getFormattedMappings(), + src, target) ); TinyRemapper remapper = builder.build(); @@ -62,19 +62,20 @@ private static Collection getMinecraftJar(Collection sourcePaths, St } @ApiStatus.Internal - public static void addMinecraftJar(TinyRemapper remapper) throws IOException { + public static void addMinecraftJar(TinyRemapper remapper, MappingsRegistry mappingsRegistry) throws IOException { Collection classPath; if (FabricLoader.getInstance().isDevelopmentEnvironment()) { try { classPath = getMinecraftJar( - getMinecraftJar(RemapUtils.getRemapClasspath(), MappingsUtilsImpl.getTargetNamespace(), "intermediary"), + getMinecraftJar(RemapUtils.getRemapClasspath(), mappingsRegistry.getTargetNamespace(), "intermediary", mappingsRegistry), "intermediary", - "official" + "official", + mappingsRegistry ); - if (!MappingsUtilsImpl.isSourceNamespaceObf()) { - classPath = getMinecraftJar(classPath, "official", MappingsUtilsImpl.getSourceNamespace()); + if (!mappingsRegistry.isSourceNamespaceObf()) { + classPath = getMinecraftJar(classPath, "official", mappingsRegistry.getSourceNamespace(), mappingsRegistry); } } catch (IOException e) { throw new RuntimeException("Failed to populate default remap classpath", e); @@ -82,8 +83,8 @@ public static void addMinecraftJar(TinyRemapper remapper) throws IOException { } else { classPath = RemapUtils.getClassPathFromObjectShare(); - if (!MappingsUtilsImpl.isSourceNamespaceObf()) { - classPath = getMinecraftJar(classPath, "official", MappingsUtilsImpl.getSourceNamespace()); + if (!mappingsRegistry.isSourceNamespaceObf()) { + classPath = getMinecraftJar(classPath, "official", mappingsRegistry.getSourceNamespace(), mappingsRegistry); } } 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 22d12a5..998c92f 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 io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.MixinRemappingHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; 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 = MixinRemappingHelper.MIXIN2TARGETMAP.get(mixinClass); + List supers = ModRemappingAPIImpl.getCurrentContext().getMixin2TargetMap().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/MRAApplyVisitor.java b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java index 8272855..9acc000 100644 --- a/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java +++ b/src/main/java/io/github/fabriccompatibiltylayers/modremappingapi/impl/remapper/visitor/MRAApplyVisitor.java @@ -7,15 +7,15 @@ import org.objectweb.asm.ClassVisitor; public class MRAApplyVisitor implements TinyRemapper.ApplyVisitorProvider { - private VisitorInfosImpl infos; + private final VisitorInfosImpl infos; + + public MRAApplyVisitor(VisitorInfosImpl infos) { + this.infos = infos; + } @Override public ClassVisitor insertApplyVisitor(TrClass cls, ClassVisitor next) { final String className = cls.getName(); return new MRAClassVisitor(next, infos, className); } - - public void setInfos(VisitorInfosImpl infos) { - this.infos = infos; - } } 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 e78e0fd..e4b0a7b 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.utils.Constants; -import io.github.fabriccompatibiltylayers.modremappingapi.impl.remapper.MixinRemappingHelper; +import io.github.fabriccompatibiltylayers.modremappingapi.impl.ModRemappingAPIImpl; 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) { }); } - MixinRemappingHelper.MIXIN2TARGETMAP.put(cls.getName().replace(".", "/"), supers); + ModRemappingAPIImpl.getCurrentContext().getMixin2TargetMap().put(cls.getName().replace(".", "/"), supers); return next; } diff --git a/src/test/java/io/github/fabriccompatibiltylayers/modremappingapi/test/ModRemapperTests.java b/src/test/java/io/github/fabriccompatibiltylayers/modremappingapi/test/ModRemapperTests.java index 7df2cec..02528a1 100644 --- a/src/test/java/io/github/fabriccompatibiltylayers/modremappingapi/test/ModRemapperTests.java +++ b/src/test/java/io/github/fabriccompatibiltylayers/modremappingapi/test/ModRemapperTests.java @@ -1,6 +1,6 @@ package io.github.fabriccompatibiltylayers.modremappingapi.test; -import io.github.fabriccompatibiltylayers.modremappingapi.api.MappingUtils; +import io.github.fabriccompatibiltylayers.modremappingapi.api.v1.MappingUtils; import net.fabricmc.loader.api.FabricLoader; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll;