aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2021-09-18 14:00:14 +0800
committershedaniel <daniel@shedaniel.me>2021-09-18 14:00:14 +0800
commit7f54808315df20baae2b9b737f34a08bd85f6f1e (patch)
treec50b93b170743009d622372ac7237c3a11020814
parent3aa0e5f731f6c8fb5b4afa0c73aaada464f270a5 (diff)
downloadarchitectury-loom-7f54808315df20baae2b9b737f34a08bd85f6f1e.tar.gz
architectury-loom-7f54808315df20baae2b9b737f34a08bd85f6f1e.tar.bz2
architectury-loom-7f54808315df20baae2b9b737f34a08bd85f6f1e.zip
Fix merge conflicts
Signed-off-by: shedaniel <daniel@shedaniel.me>
-rw-r--r--src/main/java/net/fabricmc/loom/api/mappings/layered/MappingsNamespace.java1
-rw-r--r--src/main/java/net/fabricmc/loom/api/mappings/layered/spec/LayeredMappingSpecBuilder.java2
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerJarProcessor.java2
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java4
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java48
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java42
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpecBuilderImpl.java17
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java29
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingLayer.java79
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingsSpec.java9
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java52
-rw-r--r--src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java4
-rw-r--r--src/main/java/net/fabricmc/loom/task/RemapJarTask.java28
-rw-r--r--src/main/java/net/fabricmc/loom/util/MappingsProviderVerbose.java51
-rw-r--r--src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java46
-rw-r--r--src/main/java/net/fabricmc/loom/util/aw2at/Aw2At.java9
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java4
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java6
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java9
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/MCPReader.java25
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java56
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java77
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java4
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/Tsrg2Utils.java89
-rw-r--r--src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java86
25 files changed, 371 insertions, 408 deletions
diff --git a/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingsNamespace.java b/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingsNamespace.java
index ae32f7f9..eb6ae9bc 100644
--- a/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingsNamespace.java
+++ b/src/main/java/net/fabricmc/loom/api/mappings/layered/MappingsNamespace.java
@@ -43,6 +43,7 @@ public enum MappingsNamespace {
* @see <a href="https://github.com/FabricMC/intermediary/">github.com/FabricMC/intermediary/</a>
*/
INTERMEDIARY,
+ SRG,
/**
* Named mappings are the developer friendly names used to develop mods against.
diff --git a/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/LayeredMappingSpecBuilder.java b/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/LayeredMappingSpecBuilder.java
index 05180172..a93d97c1 100644
--- a/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/LayeredMappingSpecBuilder.java
+++ b/src/main/java/net/fabricmc/loom/api/mappings/layered/spec/LayeredMappingSpecBuilder.java
@@ -47,4 +47,6 @@ public interface LayeredMappingSpecBuilder {
}
LayeredMappingSpecBuilder parchment(Object object, Action<ParchmentMappingsSpecBuilder> action);
+
+ LayeredMappingSpecBuilder crane(Object object);
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerJarProcessor.java
index 8ae99383..494c4169 100644
--- a/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerJarProcessor.java
+++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/TransitiveAccessWidenerJarProcessor.java
@@ -31,6 +31,7 @@ import java.util.List;
import java.util.Set;
import com.google.common.base.Preconditions;
+import dev.architectury.tinyremapper.TinyRemapper;
import org.gradle.api.Project;
import net.fabricmc.accesswidener.AccessWidener;
@@ -44,7 +45,6 @@ import net.fabricmc.loom.configuration.RemappedConfigurationEntry;
import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.TinyRemapperHelper;
-import net.fabricmc.tinyremapper.TinyRemapper;
/**
* Applies transitive access wideners that are inherited from mod and api dependencies.
diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java
index 54a7903f..bb3f839e 100644
--- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java
+++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java
@@ -67,7 +67,7 @@ import net.fabricmc.loom.util.LoggerFilter;
import net.fabricmc.loom.util.TinyRemapperHelper;
import net.fabricmc.loom.util.srg.AtRemapper;
import net.fabricmc.loom.util.srg.CoreModClassRemapper;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class ModProcessor {
public static void processMods(Project project, List<ModDependencyInfo> processList) throws IOException {
@@ -148,7 +148,7 @@ public class ModProcessor {
Stopwatch stopwatch = Stopwatch.createStarted();
project.getLogger().lifecycle(":remapping " + remapList.size() + " mods (TinyRemapper, " + fromM + " -> " + toM + ")");
- TinyTree mappings = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings();
+ MemoryMappingTree mappings = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings();
LoggerFilter.replaceSystemOut();
TinyRemapper remapper = TinyRemapper.newRemapper()
.logger(project.getLogger()::lifecycle)
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java
index 2440f526..b24df0ec 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/FieldMigratedMappingsProvider.java
@@ -27,6 +27,7 @@ package net.fabricmc.loom.configuration.providers.forge;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
+import java.io.StringWriter;
import java.io.UncheckedIOException;
import java.nio.file.Files;
import java.nio.file.Path;
@@ -44,11 +45,6 @@ import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
-import dev.architectury.mappingslayers.api.mutable.MappingsEntry;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableFieldDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import dev.architectury.refmapremapper.utils.DescriptorRemapper;
import org.gradle.api.Project;
import org.objectweb.asm.ClassReader;
@@ -58,14 +54,16 @@ import org.objectweb.asm.Opcodes;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.LoomGradlePlugin;
+import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
import net.fabricmc.loom.util.FileSystemUtil;
import net.fabricmc.loom.util.ThreadingUtils;
import net.fabricmc.loom.util.srg.SrgMerger;
-import net.fabricmc.mapping.tree.ClassDef;
-import net.fabricmc.mapping.tree.FieldDef;
-import net.fabricmc.mapping.tree.TinyMappingFactory;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.MappingReader;
+import net.fabricmc.mappingio.format.Tiny2Writer;
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MappingTreeView;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class FieldMigratedMappingsProvider extends MappingsProviderImpl {
private List<Map.Entry<FieldMember, String>> migratedFields = new ArrayList<>();
@@ -148,27 +146,30 @@ public class FieldMigratedMappingsProvider extends MappingsProviderImpl {
fieldDescriptorMap.put(entry.getKey().owner, entry.getKey().field, entry.getValue());
}
- MutableTinyTree mappings;
+ MemoryMappingTree mappings = new MemoryMappingTree();
try (BufferedReader reader = Files.newBufferedReader(rawTinyMappings)) {
- mappings = MappingsUtils.copyAsMutable(TinyMappingFactory.loadWithDetection(reader));
+ MappingReader.read(reader, mappings);
- for (MutableClassDef classDef : mappings.getClassesMutable()) {
- Map<String, String> row = fieldDescriptorMap.row(classDef.getIntermediary());
+ for (MappingTree.ClassMapping classDef : new ArrayList<>(mappings.getClasses())) {
+ Map<String, String> row = fieldDescriptorMap.row(classDef.getName(MappingsNamespace.INTERMEDIARY.toString()));
if (!row.isEmpty()) {
- for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) {
- String newDescriptor = row.get(fieldDef.getIntermediary());
+ for (MappingTree.FieldMapping fieldDef : new ArrayList<>(classDef.getFields())) {
+ String newDescriptor = row.get(fieldDef.getName(MappingsNamespace.INTERMEDIARY.toString()));
if (newDescriptor != null) {
- fieldDef.setDescriptor(MappingsEntry.NS_INTERMEDIARY, newDescriptor);
+ fieldDef.setSrcDesc(mappings.mapDesc(newDescriptor, mappings.getNamespaceId(MappingsNamespace.INTERMEDIARY.toString()), MappingTreeView.SRC_NAMESPACE_ID));
}
}
}
}
}
- Files.writeString(tinyMappings, MappingsUtils.serializeToString(mappings), StandardOpenOption.CREATE);
+ StringWriter stringWriter = new StringWriter();
+ Tiny2Writer tiny2Writer = new Tiny2Writer(stringWriter, false);
+ mappings.accept(tiny2Writer);
+ Files.writeString(tinyMappings, stringWriter.toString(), StandardOpenOption.CREATE);
}
}
@@ -217,27 +218,28 @@ public class FieldMigratedMappingsProvider extends MappingsProviderImpl {
Map<FieldMember, String> migratedFields = new HashMap<>();
try (BufferedReader reader = Files.newBufferedReader(rawTinyMappingsWithSrg)) {
- TinyTree mappings = TinyMappingFactory.loadWithDetection(reader);
+ MemoryMappingTree mappings = new MemoryMappingTree();
+ MappingReader.read(reader, mappings);
Map<String, String> srgToIntermediary = new HashMap<>();
- for (ClassDef aClass : mappings.getClasses()) {
+ for (MappingTree.ClassMapping aClass : mappings.getClasses()) {
srgToIntermediary.put(aClass.getName("srg"), aClass.getName("intermediary"));
}
- for (ClassDef classDef : mappings.getClasses()) {
+ for (MappingTree.ClassMapping classDef : mappings.getClasses()) {
String ownerSrg = classDef.getName("srg");
String ownerIntermediary = classDef.getName("intermediary");
- for (FieldDef fieldDef : classDef.getFields()) {
+ for (MappingTree.FieldMapping fieldDef : classDef.getFields()) {
String fieldSrg = fieldDef.getName("srg");
- String descriptorSrg = fieldDef.getDescriptor("srg");
+ String descriptorSrg = fieldDef.getDesc("srg");
FieldMember member = new FieldMember(ownerSrg, fieldSrg);
String newDescriptor = fieldDescriptorMap.get(member);
if (newDescriptor != null && !newDescriptor.equals(descriptorSrg)) {
String fieldIntermediary = fieldDef.getName("intermediary");
- String descriptorIntermediary = fieldDef.getDescriptor("intermediary");
+ String descriptorIntermediary = fieldDef.getDesc("intermediary");
String newDescriptorRemapped = DescriptorRemapper.remapDescriptor(newDescriptor,
clazz -> srgToIntermediary.getOrDefault(clazz, clazz));
migratedFields.put(new FieldMember(ownerIntermediary, fieldIntermediary), newDescriptorRemapped);
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java
index 9a32304f..7b610e0f 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/forge/MinecraftPatchedProvider.java
@@ -32,6 +32,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
+import java.io.StringReader;
import java.io.UncheckedIOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
@@ -65,10 +66,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.hash.Hashing;
import com.google.common.io.ByteSource;
import de.oceanlabs.mcp.mcinjector.adaptors.ParameterAnnotationFixer;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableMethodDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import dev.architectury.tinyremapper.InputTag;
import dev.architectury.tinyremapper.OutputConsumerPath;
import dev.architectury.tinyremapper.TinyRemapper;
@@ -92,25 +89,27 @@ import org.objectweb.asm.tree.ClassNode;
import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension;
+import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.DependencyProvider;
import net.fabricmc.loom.configuration.providers.MinecraftProviderImpl;
import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext;
-import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace;
import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingLayer;
import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec;
-import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.DependencyDownloader;
import net.fabricmc.loom.util.FileSystemUtil;
import net.fabricmc.loom.util.MappingsProviderVerbose;
import net.fabricmc.loom.util.ThreadingUtils;
-import net.fabricmc.loom.util.TinyRemapperMappingsHelper;
+import net.fabricmc.loom.util.TinyRemapperHelper;
import net.fabricmc.loom.util.function.FsPathConsumer;
import net.fabricmc.loom.util.srg.InnerClassRemapper;
import net.fabricmc.loom.util.srg.SpecialSourceExecutor;
import net.fabricmc.loom.util.srg.Tsrg2Utils;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.loom.util.srg.Tsrg2Writer;
+import net.fabricmc.mappingio.MappingReader;
import net.fabricmc.mappingio.MappingVisitor;
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class MinecraftPatchedProvider extends DependencyProvider {
private static final String LOOM_PATCH_VERSION_KEY = "Loom-Patch-Version";
@@ -319,12 +318,12 @@ public class MinecraftPatchedProvider extends DependencyProvider {
}
private TinyRemapper buildRemapper(Path input) throws IOException {
- Path[] libraries = MinecraftMappedProvider.getRemapClasspath(getProject());
- TinyTree mappingsWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();
+ Path[] libraries = TinyRemapperHelper.getMinecraftDependencies(getProject());
+ MemoryMappingTree mappingsWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();
TinyRemapper remapper = TinyRemapper.newRemapper()
.logger(getProject().getLogger()::lifecycle)
.logUnknownInvokeDynamic(false)
- .withMappings(TinyRemapperMappingsHelper.create(mappingsWithSrg, "srg", "official", true))
+ .withMappings(TinyRemapperHelper.create(mappingsWithSrg, "srg", "official", true))
.withMappings(InnerClassRemapper.of(InnerClassRemapper.readClassNames(input), mappingsWithSrg, "srg", "official"))
.renameInvalidLocals(true)
.rebuildSourceFilenames(true)
@@ -377,14 +376,14 @@ public class MinecraftPatchedProvider extends DependencyProvider {
GradleMappingContext context = new GradleMappingContext(project, "tmp-mojmap");
try {
- FileUtils.deleteDirectory(context.workingDirectory("/"));
+ FileUtils.deleteDirectory(context.workingDirectory("/").toFile());
MojangMappingLayer layer = new MojangMappingsSpec(() -> true).createLayer(context);
layer.visit(visitor);
} catch (IOException e) {
throw new UncheckedIOException(e);
} finally {
try {
- FileUtils.deleteDirectory(context.workingDirectory("/"));
+ FileUtils.deleteDirectory(context.workingDirectory("/").toFile());
} catch (IOException e) {
e.printStackTrace();
}
@@ -397,7 +396,7 @@ public class MinecraftPatchedProvider extends DependencyProvider {
if (Files.notExists(path)) {
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
Tsrg2Utils.writeTsrg(visitor -> visitMojmap(visitor, project),
- MappingNamespace.NAMED.stringValue(), false, writer);
+ MappingsNamespace.NAMED.toString(), false, writer);
}
}
@@ -409,7 +408,9 @@ public class MinecraftPatchedProvider extends DependencyProvider {
if (Files.notExists(path)) {
try (BufferedWriter writer = Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING)) {
- Tsrg2Utils.writeTsrg2(visitor -> visitMojmap(visitor, project), writer);
+ MemoryMappingTree tree = new MemoryMappingTree();
+ visitMojmap(tree, project);
+ writer.write(Tsrg2Writer.serialize(tree));
}
}
@@ -432,15 +433,16 @@ public class MinecraftPatchedProvider extends DependencyProvider {
out.toAbsolutePath().toString()
});
- MutableTinyTree mappings = MappingsUtils.deserializeFromTsrg2(FileUtils.readFileToString(out.toFile(), StandardCharsets.UTF_8));
+ MemoryMappingTree tree = new MemoryMappingTree();
+ MappingReader.read(new StringReader(FileUtils.readFileToString(out.toFile(), StandardCharsets.UTF_8)), tree);
- for (MutableClassDef classDef : mappings.getClassesMutable()) {
- for (MutableMethodDef methodDef : classDef.getMethodsMutable()) {
- methodDef.getParametersMutable().clear();
+ for (MappingTree.ClassMapping classDef : tree.getClasses()) {
+ for (MappingTree.MethodMapping methodDef : classDef.getMethods()) {
+ methodDef.getArgs().clear();
}
}
- Files.writeString(outTrimmed, MappingsUtils.serializeToTsrg2(mappings), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
+ Files.writeString(outTrimmed, Tsrg2Writer.serialize(tree), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
mergedMojangTsrg2Files = new Path[]{out, outTrimmed};
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpecBuilderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpecBuilderImpl.java
index fdd14127..ce9172b8 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpecBuilderImpl.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/LayeredMappingSpecBuilderImpl.java
@@ -46,26 +46,20 @@ public class LayeredMappingSpecBuilderImpl implements LayeredMappingSpecBuilder
@Nullable
private final LoomGradleExtensionAPI extension;
- public LayeredMappingSpecBuilder(@Nullable LoomGradleExtensionAPI extension) {
+ public LayeredMappingSpecBuilderImpl(@Nullable LoomGradleExtensionAPI extension) {
this.extension = extension;
}
@Override
public LayeredMappingSpecBuilder addLayer(MappingsSpec<?> mappingSpec) {
layers.add(mappingSpec);
- public LayeredMappingSpecBuilder officialMojangMappings() {
- layers.add(new MojangMappingsSpec(() -> extension != null && extension.isSilentMojangMappingsLicenseEnabled()));
- return this;
- }
-
- public LayeredMappingSpecBuilder parchment(String mavenNotation) {
- parchment(mavenNotation, parchmentMappingsSpecBuilder -> parchmentMappingsSpecBuilder.setRemovePrefix(true));
return this;
}
@Override
public LayeredMappingSpecBuilder officialMojangMappings() {
- return addLayer(new MojangMappingsSpec());
+ layers.add(new MojangMappingsSpec(() -> extension != null && extension.isSilentMojangMappingsLicenseEnabled()));
+ return this;
}
@Override
@@ -75,8 +69,9 @@ public class LayeredMappingSpecBuilderImpl implements LayeredMappingSpecBuilder
return addLayer(builder.build());
}
- public LayeredMappingSpecBuilder crane(String mavenNotation) {
- layers.add(new CraneMappingsSpec(mavenNotation));
+ @Override
+ public LayeredMappingSpecBuilder crane(Object object) {
+ layers.add(new CraneMappingsSpec(FileSpec.create(object)));
return this;
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java
index f08bf774..b570f428 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java
@@ -71,7 +71,6 @@ import net.fabricmc.loom.util.DownloadUtil;
import net.fabricmc.loom.util.srg.MCPReader;
import net.fabricmc.loom.util.srg.SrgMerger;
import net.fabricmc.loom.util.srg.SrgNamedWriter;
-import net.fabricmc.mapping.reader.v2.TinyMetadata;
import net.fabricmc.mappingio.MappingReader;
import net.fabricmc.mappingio.adapter.MappingNsCompleter;
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch;
@@ -107,6 +106,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
private boolean hasUnpickDefinitions;
private UnpickMetadata unpickMetadata;
private MemoryMappingTree mappingTree;
+ private MemoryMappingTree mappingTreeWithSrg;
public MappingsProviderImpl(Project project) {
super(project);
@@ -116,12 +116,8 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
return Objects.requireNonNull(mappingTree, "Cannot get mappings before they have been read");
}
- public TinyTree getMappingsWithSrg() throws IOException {
- if (getExtension().shouldGenerateSrgTiny()) {
- return MappingsCache.INSTANCE.get(tinyMappingsWithSrg);
- }
-
- throw new UnsupportedOperationException("Not running with Forge support / Tiny srg support.");
+ public MemoryMappingTree getMappingsWithSrg() throws IOException {
+ return Objects.requireNonNull(mappingTreeWithSrg, "Cannot get mappings before they have been read");
}
@Override
@@ -152,7 +148,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
patchedProvider.provide(dependency, postPopulationScheduler);
}
- mappingTree = readMappings();
+ mappingTree = readMappings(tinyMappings);
manipulateMappings(mappingsJar.toPath());
if (getExtension().shouldGenerateSrgTiny()) {
@@ -162,6 +158,8 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
}
}
+ mappingTreeWithSrg = readMappings(tinyMappingsWithSrg);
+
if (Files.notExists(tinyMappingsJar) || isRefreshDeps()) {
ZipUtil.pack(new ZipEntrySource[] {new FileSource("mappings/mappings.tiny", tinyMappings.toFile())}, tinyMappingsJar.toFile());
}
@@ -318,9 +316,9 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
}
}
- private MemoryMappingTree readMappings() throws IOException {
+ private static MemoryMappingTree readMappings(Path file) throws IOException {
MemoryMappingTree mappingTree = new MemoryMappingTree();
- MappingReader.read(tinyMappings, mappingTree);
+ MappingReader.read(file, mappingTree);
return mappingTree;
}
@@ -362,9 +360,8 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
private static boolean areMappingsMergedV2(Path path) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(path)) {
- TinyMetadata metadata = TinyV2Factory.readMetadata(reader);
- return metadata.getNamespaces().containsAll(Arrays.asList("named", "intermediary", "official"));
- } catch (IllegalArgumentException | NoSuchFileException e) {
+ return MappingReader.detectFormat(reader) == MappingFormat.TINY_2 && MappingReader.getNamespaces(reader).containsAll(Arrays.asList("named", "intermediary", "official"));
+ } catch (NoSuchFileException e) {
return false;
}
}
@@ -374,6 +371,8 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
try (BufferedReader reader = Files.newBufferedReader(fs.getPath("mappings", "mappings.tiny"))) {
return MappingReader.detectFormat(reader) == MappingFormat.TINY_2;
}
+ } catch (NoSuchFileException e) {
+ return false;
}
}
@@ -466,10 +465,10 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
runCommand(command, intermediaryMappings.toAbsolutePath().toString(),
yarnMappings.toAbsolutePath().toString(),
newMergedMappings.toAbsolutePath().toString(),
- MappingsNamespace.INTERMEDIARY.toString(), MappingsNamespace.OFFICIAL.toString());
+ MappingsNamespace.INTERMEDIARY.toString(), MappingsNamespace.OFFICIAL.toString());
} catch (Exception e) {
throw new RuntimeException("Could not merge mappings from " + intermediaryMappings.toString()
- + " with mappings from " + yarnMappings, e);
+ + " with mappings from " + yarnMappings, e);
}
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingLayer.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingLayer.java
index 620532f0..f55fa13f 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingLayer.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingLayer.java
@@ -25,91 +25,24 @@
package net.fabricmc.loom.configuration.providers.mappings.crane;
import java.io.BufferedReader;
-import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
-import java.util.Collections;
+import java.nio.file.Path;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableFieldDef;
-import dev.architectury.mappingslayers.api.mutable.MutableMethodDef;
-import dev.architectury.mappingslayers.api.mutable.MutableParameterDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
-import org.apache.commons.io.IOUtils;
-
-import net.fabricmc.loom.configuration.providers.mappings.MappingLayer;
+import net.fabricmc.loom.api.mappings.layered.MappingLayer;
import net.fabricmc.loom.util.FileSystemUtil;
-import net.fabricmc.mappingio.MappedElementKind;
import net.fabricmc.mappingio.MappingVisitor;
+import net.fabricmc.mappingio.format.Tiny2Reader;
-public record CraneMappingLayer(File craneJar) implements MappingLayer {
+public record CraneMappingLayer(Path craneJar) implements MappingLayer {
private static final String TINY_FILE_NAME = "crane.tiny";
@Override
public void visit(MappingVisitor visitor) throws IOException {
- try (FileSystemUtil.FileSystemDelegate fs = FileSystemUtil.getJarFileSystem(craneJar().toPath(), false)) {
+ try (FileSystemUtil.FileSystemDelegate fs = FileSystemUtil.getJarFileSystem(craneJar(), false)) {
try (BufferedReader reader = Files.newBufferedReader(fs.get().getPath(TINY_FILE_NAME), StandardCharsets.UTF_8)) {
- // can't use this, it requires 2 namespaces
- // Tiny2Reader.read(reader, mappingVisitor);
- MutableTinyTree tree = MappingsUtils.deserializeFromString(IOUtils.toString(reader));
-
- do {
- if (visitor.visitHeader()) {
- visitor.visitNamespaces(tree.getMetadata().getNamespaces().get(0), Collections.emptyList());
- }
-
- if (visitor.visitContent()) {
- for (MutableClassDef classDef : tree.getClassesMutable()) {
- if (visitor.visitClass(classDef.getName(0))) {
- if (!visitor.visitElementContent(MappedElementKind.CLASS)) {
- return;
- }
-
- for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) {
- if (visitor.visitField(fieldDef.getName(0), fieldDef.getDescriptor(0))) {
- if (!visitor.visitElementContent(MappedElementKind.FIELD)) {
- return;
- }
-
- if (fieldDef.getComment() != null) {
- visitor.visitComment(MappedElementKind.FIELD, fieldDef.getComment());
- }
- }
- }
-
- for (MutableMethodDef methodDef : classDef.getMethodsMutable()) {
- if (visitor.visitMethod(methodDef.getName(0), methodDef.getDescriptor(0))) {
- if (!visitor.visitElementContent(MappedElementKind.METHOD)) {
- return;
- }
-
- for (MutableParameterDef parameterDef : methodDef.getParametersMutable()) {
- if (visitor.visitMethodArg(parameterDef.getLocalVariableIndex(), parameterDef.getLocalVariableIndex(), parameterDef.getName(0))) {
- if (!visitor.visitElementContent(MappedElementKind.METHOD_ARG)) {
- return;
- }
-
- if (parameterDef.getComment() != null) {
- visitor.visitComment(MappedElementKind.METHOD_ARG, parameterDef.getComment());
- }
- }
- }
-
- if (methodDef.getComment() != null) {
- visitor.visitComment(MappedElementKind.METHOD, methodDef.getComment());
- }
- }
- }
-
- if (classDef.getComment() != null) {
- visitor.visitComment(MappedElementKind.FIELD, classDef.getComment());
- }
- }
- }
- }
- } while (!visitor.visitEnd());
+ Tiny2Reader.read(reader, visitor);
}
}
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingsSpec.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingsSpec.java
index f4ade2cc..04c98170 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingsSpec.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/crane/CraneMappingsSpec.java
@@ -24,12 +24,13 @@
package net.fabricmc.loom.configuration.providers.mappings.crane;
-import net.fabricmc.loom.configuration.providers.mappings.MappingContext;
-import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec;
+import net.fabricmc.loom.api.mappings.layered.MappingContext;
+import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
+import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
-public record CraneMappingsSpec(String mavenNotation) implements MappingsSpec<CraneMappingLayer> {
+public record CraneMappingsSpec(FileSpec fileSpec) implements MappingsSpec<CraneMappingLayer> {
@Override
public CraneMappingLayer createLayer(MappingContext context) {
- return new CraneMappingLayer(context.mavenFile(mavenNotation()));
+ return new CraneMappingLayer(fileSpec().get(context));
}
}
diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
index 757d0355..6afdb961 100644
--- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
+++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftMappedProvider.java
@@ -32,12 +32,10 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
-import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;
import com.google.common.base.Stopwatch;
-import com.google.common.collect.ImmutableMap;
import dev.architectury.tinyremapper.IMappingProvider;
import dev.architectury.tinyremapper.InputTag;
import dev.architectury.tinyremapper.NonClassCopyMode;
@@ -61,15 +59,9 @@ import net.fabricmc.loom.util.TinyRemapperHelper;
import net.fabricmc.loom.util.srg.AtRemapper;
import net.fabricmc.loom.util.srg.CoreModClassRemapper;
import net.fabricmc.loom.util.srg.InnerClassRemapper;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class MinecraftMappedProvider extends DependencyProvider {
- public static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>()
- .put("javax/annotation/Nullable", "org/jetbrains/annotations/Nullable")
- .put("javax/annotation/Nonnull", "org/jetbrains/annotations/NotNull")
- .put("javax/annotation/concurrent/Immutable", "org/jetbrains/annotations/Unmodifiable")
- .build();
-
private File inputJar;
private File inputForgeJar;
private File minecraftMappedJar;
@@ -177,14 +169,6 @@ public class MinecraftMappedProvider extends DependencyProvider {
}
}
- private TinyRemapper buildRemapper() throws IOException {
- Path[] libraries = getRemapClasspath(getProject());
- TinyRemapper remapper = getTinyRemapper();
- remapper.readClassPath(libraries);
- remapper.prepareClasses();
- return remapper;
- }
-
private byte[][] inputBytes(Path input) throws IOException {
List<byte[]> inputByteList = new ArrayList<>();
@@ -244,7 +228,7 @@ public class MinecraftMappedProvider extends DependencyProvider {
Info vanilla = new Info(vanillaAssets, input, outputMapped, outputIntermediary, outputSrg);
Info forge = getExtension().isForgeAndNotOfficial() ? new Info(forgeAssets, inputForge, forgeOutputMapped, forgeOutputIntermediary, forgeOutputSrg) : null;
- TinyRemapper remapper = remapperArray[0] = buildRemapper();
+ TinyRemapper remapper = remapperArray[0] = TinyRemapperHelper.getTinyRemapper(getProject());
assetsOut(input, vanillaAssets);
@@ -295,60 +279,34 @@ public class MinecraftMappedProvider extends DependencyProvider {
OutputRemappingHandler.remap(remapper, forge.assets, outputForge, null, forgeTag);
}
- // TODO TinyRemapperHelper
getProject().getLogger().lifecycle(":remapped minecraft (TinyRemapper, " + fromM + " -> " + toM + ") in " + stopwatch);
remapper.removeInput();
if (getExtension().isForge() && !"srg".equals(toM)) {
getProject().getLogger().info(":running minecraft finalising tasks");
- TinyTree yarnWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();
+ MemoryMappingTree yarnWithSrg = getExtension().getMappingsProvider().getMappingsWithSrg();
AtRemapper.remap(getProject().getLogger(), output, yarnWithSrg);
CoreModClassRemapper.remapJar(output, yarnWithSrg, getProject().getLogger());
}
}
}
- public TinyRemapper getTinyRemapper() throws IOException {
- TinyRemapper.Builder builder = TinyRemapper.newRemapper()
- .renameInvalidLocals(true)
- .logUnknownInvokeDynamic(false)
- .ignoreConflicts(getExtension().isForge())
- .cacheMappings(true)
- .threads(Runtime.getRuntime().availableProcessors())
- .logger(getProject().getLogger()::lifecycle)
- .rebuildSourceFilenames(true);
-
- if (getExtension().isForge()) {
- /* FORGE: Required for classes like aej$OptionalNamedTag (1.16.4) which are added by Forge patches.
- * They won't get remapped to their proper packages, so IllegalAccessErrors will happen without ._.
- */
- builder.fixPackageAccess(true);
- }
-
- return builder.build();
- }
-
public Set<IMappingProvider> getMappings(@Nullable Set<String> fromClassNames, String fromM, String toM) throws IOException {
Set<IMappingProvider> providers = new HashSet<>();
- providers.add(TinyRemapperMappingsHelper.create(getExtension().isForge() ? getExtension().getMappingsProvider().getMappingsWithSrg() : getExtension().getMappingsProvider().getMappings(), fromM, toM, true));
+ providers.add(TinyRemapperHelper.create(getExtension().isForge() ? getExtension().getMappingsProvider().getMappingsWithSrg() : getExtension().getMappingsProvider().getMappings(), fromM, toM, true));
if (getExtension().isForge()) {
if (fromClassNames != null) {
providers.add(InnerClassRemapper.of(fromClassNames, getExtension().getMappingsProvider().getMappingsWithSrg(), fromM, toM));
}
} else {
- providers.add(out -> JSR_TO_JETBRAINS.forEach(out::acceptClass));
+ providers.add(out -> TinyRemapperHelper.JSR_TO_JETBRAINS.forEach(out::acceptClass));
}
return providers;
}
- public static Path[] getRemapClasspath(Project project) {
- return project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles()
- .stream().map(File::toPath).toArray(Path[]::new);
- }
-
protected void addDependencies(DependencyInfo dependency, Consumer<Runnable> postPopulationScheduler) {
getProject().getDependencies().add(Constants.Configurations.MINECRAFT_NAMED,
getProject().getDependencies().module("net.minecraft:" + minecraftProvider.getJarPrefix() + "minecraft-mapped:" + getMinecraftProvider().minecraftVersion() + "/" + getExtension().getMappingsProvider().mappingsIdentifier()));
diff --git a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java
index 0e204eb4..076f3674 100644
--- a/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java
+++ b/src/main/java/net/fabricmc/loom/configuration/sources/ForgeSourcesRemapper.java
@@ -48,13 +48,13 @@ import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.build.ModCompileRemapper;
-import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
import net.fabricmc.loom.task.GenerateSourcesTask;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.DeletingFileVisitor;
import net.fabricmc.loom.util.FileSystemUtil;
import net.fabricmc.loom.util.SourceRemapper;
import net.fabricmc.loom.util.ThreadingUtils;
+import net.fabricmc.loom.util.TinyRemapperHelper;
import net.fabricmc.lorenztiny.TinyMappingsReader;
public class ForgeSourcesRemapper {
@@ -171,7 +171,7 @@ public class ForgeSourcesRemapper {
MappingSet mappings = new TinyMappingsReader(extension.getMappingsProvider().getMappingsWithSrg(), "srg", "named").read();
- for (Map.Entry<String, String> entry : MinecraftMappedProvider.JSR_TO_JETBRAINS.entrySet()) {
+ for (Map.Entry<String, String> entry : TinyRemapperHelper.JSR_TO_JETBRAINS.entrySet()) {
mappings.getOrCreateClassMapping(entry.getKey()).setDeobfuscatedName(entry.getValue());
}
diff --git a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java
index 1b9a1e48..9fb95507 100644
--- a/src/main/java/net/fabricmc/loom/task/RemapJarTask.java
+++ b/src/main/java/net/fabricmc/loom/task/RemapJarTask.java
@@ -88,7 +88,6 @@ import org.zeroturnaround.zip.transform.StreamZipEntryTransformer;
import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry;
import net.fabricmc.loom.LoomGradleExtension;
-import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.build.JarRemapper;
import net.fabricmc.loom.build.MixinRefmapHelper;
import net.fabricmc.loom.build.nesting.EmptyNestedJarProvider;
@@ -109,10 +108,7 @@ import net.fabricmc.loom.util.TinyRemapperHelper;
import net.fabricmc.loom.util.ZipReprocessorUtil;
import net.fabricmc.loom.util.aw2at.Aw2At;
import net.fabricmc.lorenztiny.TinyMappingsReader;
-import net.fabricmc.mapping.tree.ClassDef;
-import net.fabricmc.mapping.tree.FieldDef;
-import net.fabricmc.mapping.tree.MethodDef;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MappingTree;
import net.fabricmc.stitch.util.Pair;
public class RemapJarTask extends Jar {
@@ -169,7 +165,7 @@ public class RemapJarTask extends Jar {
}
private ReferenceRemapper createReferenceRemapper(LoomGradleExtension extension, String from, String to) throws IOException {
- TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
+ MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
return new SimpleReferenceRemapper(new SimpleReferenceRemapper.Remapper() {
@Override
@@ -186,13 +182,13 @@ public class RemapJarTask extends Jar {
@Nullable
public String mapMethod(@Nullable String className, String methodName, String methodDescriptor) {
if (className != null) {
- Optional<ClassDef> classDef = mappings.getClasses().stream()
+ Optional<MappingTree.ClassMapping> classDef = (Optional<MappingTree.ClassMapping>) mappings.getClasses().stream()
.filter(c -> Objects.equals(c.getName(from), className))
.findFirst();
if (classDef.isPresent()) {
- for (MethodDef methodDef : classDef.get().getMethods()) {
- if (Objects.equals(methodDef.getName(from), methodName) && Objects.equals(methodDef.getDescriptor(from), methodDescriptor)) {
+ for (MappingTree.MethodMapping methodDef : classDef.get().getMethods()) {
+ if (Objects.equals(methodDef.getName(from), methodName) && Objects.equals(methodDef.getDesc(from), methodDescriptor)) {
return methodDef.getName(to);
}
}
@@ -201,7 +197,7 @@ public class RemapJarTask extends Jar {
return mappings.getClasses().stream()
.flatMap(classDef -> classDef.getMethods().stream())
- .filter(methodDef -> Objects.equals(methodDef.getName(from), methodName) && Objects.equals(methodDef.getDescriptor(from), methodDescriptor))
+ .filter(methodDef -> Objects.equals(methodDef.getName(from), methodName) && Objects.equals(methodDef.getDesc(from), methodDescriptor))
.findFirst()
.map(methodDef -> methodDef.getName(to))
.orElse(null);
@@ -211,13 +207,13 @@ public class RemapJarTask extends Jar {
@Nullable
public String mapField(@Nullable String className, String fieldName, String fieldDescriptor) {
if (className != null) {
- Optional<ClassDef> classDef = mappings.getClasses().stream()
+ Optional<MappingTree.ClassMapping> classDef = (Optional<MappingTree.ClassMapping>) mappings.getClasses().stream()
.filter(c -> Objects.equals(c.getName(from), className))
.findFirst();
if (classDef.isPresent()) {
- for (FieldDef fieldDef : classDef.get().getFields()) {
- if (Objects.equals(fieldDef.getName(from), fieldName) && Objects.equals(fieldDef.getDescriptor(from), fieldDescriptor)) {
+ for (MappingTree.FieldMapping fieldDef : classDef.get().getFields()) {
+ if (Objects.equals(fieldDef.getName(from), fieldName) && Objects.equals(fieldDef.getDesc(from), fieldDescriptor)) {
return fieldDef.getName(to);
}
}
@@ -226,7 +222,7 @@ public class RemapJarTask extends Jar {
return mappings.getClasses().stream()
.flatMap(classDef -> classDef.getFields().stream())
- .filter(fieldDef -> Objects.equals(fieldDef.getName(from), fieldName) && Objects.equals(fieldDef.getDescriptor(from), fieldDescriptor))
+ .filter(fieldDef -> Objects.equals(fieldDef.getName(from), fieldName) && Objects.equals(fieldDef.getDesc(from), fieldDescriptor))
.findFirst()
.map(fieldDef -> fieldDef.getName(to))
.orElse(null);
@@ -407,7 +403,7 @@ public class RemapJarTask extends Jar {
}
private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent, String from, String to) throws IOException {
- TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
+ MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
return sink -> {
parent.load(new IMappingProvider.MappingAcceptor() {
@@ -507,7 +503,7 @@ public class RemapJarTask extends Jar {
}
LoomGradleExtension extension = LoomGradleExtension.get(getProject());
- TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
+ MappingTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
try (TinyMappingsReader reader = new TinyMappingsReader(mappings, fromM.get(), toM.get())) {
MappingSet mappingSet = reader.read();
diff --git a/src/main/java/net/fabricmc/loom/util/MappingsProviderVerbose.java b/src/main/java/net/fabricmc/loom/util/MappingsProviderVerbose.java
index 7a8bd7f1..9ddb07ef 100644
--- a/src/main/java/net/fabricmc/loom/util/MappingsProviderVerbose.java
+++ b/src/main/java/net/fabricmc/loom/util/MappingsProviderVerbose.java
@@ -25,20 +25,23 @@
package net.fabricmc.loom.util;
import java.io.IOException;
+import java.io.StringWriter;
+import java.io.UncheckedIOException;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
-import java.util.Arrays;
-import java.util.HashMap;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.Set;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyMetadata;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import dev.architectury.tinyremapper.IMappingProvider;
import dev.architectury.tinyremapper.TinyRemapper;
+import net.fabricmc.mappingio.adapter.RegularAsFlatMappingVisitor;
+import net.fabricmc.mappingio.format.Tiny2Writer;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
+
public class MappingsProviderVerbose {
public static void saveFile(TinyRemapper providers) throws IOException {
try {
@@ -52,26 +55,38 @@ public class MappingsProviderVerbose {
}
public static void saveFile(Iterable<IMappingProvider> providers) throws IOException {
- MutableTinyTree tree = MappingsUtils.create(MutableTinyMetadata.create(2, 0, Arrays.asList("from", "to"), new HashMap<>()));
+ MemoryMappingTree tree = new MemoryMappingTree();
+ tree.setSrcNamespace("from");
+ tree.setDstNamespaces(new ArrayList<>(Collections.singletonList("to")));
+ RegularAsFlatMappingVisitor flatVisitor = new RegularAsFlatMappingVisitor(tree);
for (IMappingProvider provider : providers) {
provider.load(new IMappingProvider.MappingAcceptor() {
@Override
public void acceptClass(String from, String to) {
- tree.getOrCreateClass(from).setName(1, to);
+ try {
+ flatVisitor.visitClass(from, to);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
@Override
public void acceptMethod(IMappingProvider.Member from, String to) {
- tree.getOrCreateClass(from.owner).getOrCreateMethod(from.name, from.desc)
- .setName(1, to);
+ try {
+ flatVisitor.visitMethod(from.owner, from.name, from.desc, to);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
@Override
public void acceptMethodArg(IMappingProvider.Member from, int lvIndex, String to) {
- tree.getOrCreateClass(from.owner).getOrCreateMethod(from.name, from.desc)
- .getOrCreateParameter(lvIndex, "")
- .setName(1, to);
+ try {
+ flatVisitor.visitMethodArg(from.owner, from.name, from.desc, lvIndex, lvIndex, "", to);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
@Override
@@ -81,14 +96,20 @@ public class MappingsProviderVerbose {
@Override
public void acceptField(IMappingProvider.Member from, String to) {
- tree.getOrCreateClass(from.owner).getOrCreateField(from.name, from.desc)
- .setName(1, to);
+ try {
+ flatVisitor.visitField(from.owner, from.name, from.desc, to);
+ } catch (IOException e) {
+ throw new UncheckedIOException(e);
+ }
}
});
}
Path check = Files.createTempFile("CHECK", null);
- Files.writeString(check, MappingsUtils.serializeToString(tree), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
+ StringWriter stringWriter = new StringWriter();
+ Tiny2Writer tiny2Writer = new Tiny2Writer(stringWriter, false);
+ tree.accept(tiny2Writer);
+ Files.writeString(check, stringWriter.toString(), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
System.out.println("Saved debug check mappings to " + check);
}
}
diff --git a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java
index aa295f0c..5a50047a 100644
--- a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java
+++ b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java
@@ -30,18 +30,19 @@ import java.nio.file.Path;
import java.util.Map;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import dev.architectury.tinyremapper.IMappingProvider;
+import dev.architectury.tinyremapper.TinyRemapper;
import org.gradle.api.Project;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.mappingio.tree.MappingTree;
-import net.fabricmc.tinyremapper.IMappingProvider;
-import net.fabricmc.tinyremapper.TinyRemapper;
/**
* Contains shortcuts to create tiny remappers using the mappings accessibly to the project.
*/
public final class TinyRemapperHelper {
- private static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>()
+ public static final Map<String, String> JSR_TO_JETBRAINS = new ImmutableMap.Builder<String, String>()
.put("javax/annotation/Nullable", "org/jetbrains/annotations/Nullable")
.put("javax/annotation/Nonnull", "org/jetbrains/annotations/NotNull")
.put("javax/annotation/concurrent/Immutable", "org/jetbrains/annotations/Unmodifiable")
@@ -53,12 +54,41 @@ public final class TinyRemapperHelper {
public static TinyRemapper getTinyRemapper(Project project, String fromM, String toM) throws IOException {
LoomGradleExtension extension = LoomGradleExtension.get(project);
- return TinyRemapper.newRemapper()
- .withMappings(create(extension.getMappingsProvider().getMappings(), fromM, toM, true))
- .withMappings(out -> JSR_TO_JETBRAINS.forEach(out::acceptClass))
+ TinyRemapper remapper = _getTinyRemapper(project);
+ remapper.replaceMappings(ImmutableSet.of(
+ TinyRemapperHelper.create(extension.isForge() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings(), fromM, toM, true),
+ out -> TinyRemapperHelper.JSR_TO_JETBRAINS.forEach(out::acceptClass)
+ ));
+ return remapper;
+ }
+
+ public static TinyRemapper _getTinyRemapper(Project project) throws IOException {
+ LoomGradleExtension extension = LoomGradleExtension.get(project);
+
+ TinyRemapper.Builder builder = TinyRemapper.newRemapper()
.renameInvalidLocals(true)
- .rebuildSourceFilenames(true)
- .build();
+ .logUnknownInvokeDynamic(false)
+ .ignoreConflicts(extension.isForge())
+ .cacheMappings(true)
+ .threads(Runtime.getRuntime().availableProcessors())
+ .logger(project.getLogger()::lifecycle)
+ .rebuildSourceFilenames(true);
+
+ if (extension.isForge()) {
+ /* FORGE: Required for classes like aej$OptionalNamedTag (1.16.4) which are added by Forge patches.
+ * They won't get remapped to their proper packages, so IllegalAccessErrors will happen without ._.
+ */
+ builder.fixPackageAccess(true);
+ }
+
+ return builder.build();
+ }
+
+ public static TinyRemapper getTinyRemapper(Project project) throws IOException {
+ TinyRemapper remapper = _getTinyRemapper(project);
+ remapper.readClassPath(getMinecraftDependencies(project));
+ remapper.prepareClasses();
+ return remapper;
}
public static Path[] getMinecraftDependencies(Project project) {
diff --git a/src/main/java/net/fabricmc/loom/util/aw2at/Aw2At.java b/src/main/java/net/fabricmc/loom/util/aw2at/Aw2At.java
index 2574b57a..06fd7e86 100644
--- a/src/main/java/net/fabricmc/loom/util/aw2at/Aw2At.java
+++ b/src/main/java/net/fabricmc/loom/util/aw2at/Aw2At.java
@@ -39,6 +39,7 @@ import org.gradle.api.tasks.SourceSet;
import org.gradle.api.tasks.SourceSetContainer;
import net.fabricmc.accesswidener.AccessWidenerReader;
+import net.fabricmc.accesswidener.AccessWidenerVisitor;
import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.task.RemapJarTask;
@@ -82,19 +83,19 @@ public final class Aw2At {
public static AccessTransformSet toAccessTransformSet(BufferedReader reader) throws IOException {
AccessTransformSet atSet = AccessTransformSet.create();
- new AccessWidenerReader(new AccessWidenerReader.Visitor() {
+ new AccessWidenerReader(new AccessWidenerVisitor() {
@Override
- public void visitClass(String name, AccessWidenerReader.AccessType access) {
+ public void visitClass(String name, AccessWidenerReader.AccessType access, boolean transitive) {
atSet.getOrCreateClass(name).merge(toAt(access));
}
@Override
- public void visitMethod(String owner, String name, String descriptor, AccessWidenerReader.AccessType access) {
+ public void visitMethod(String owner, String name, String descriptor, AccessWidenerReader.AccessType access, boolean transitive) {
atSet.getOrCreateClass(owner).mergeMethod(MethodSignature.of(name, descriptor), toAt(access));
}
@Override
- public void visitField(String owner, String name, String descriptor, AccessWidenerReader.AccessType access) {
+ public void visitField(String owner, String name, String descriptor, AccessWidenerReader.AccessType access, boolean transitive) {
atSet.getOrCreateClass(owner).mergeField(name, toAt(access));
}
}).read(reader);
diff --git a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
index c435498a..8e1d3008 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/AtRemapper.java
@@ -42,7 +42,7 @@ import org.gradle.api.logging.Logger;
import net.fabricmc.loom.util.Constants;
import net.fabricmc.loom.util.function.CollectionUtil;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MappingTree;
/**
* Remaps AT classes from SRG to Yarn.
@@ -50,7 +50,7 @@ import net.fabricmc.mapping.tree.TinyTree;
* @author Juuz
*/
public final class AtRemapper {
- public static void remap(Logger logger, Path jar, TinyTree mappings) throws IOException {
+ public static void remap(Logger logger, Path jar, MappingTree mappings) throws IOException {
try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + jar.toUri()), ImmutableMap.of("create", false))) {
Path atPath = fs.getPath(Constants.Forge.ACCESS_TRANSFORMER_PATH);
diff --git a/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java
index 2cb47615..535bcb21 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/CoreModClassRemapper.java
@@ -47,7 +47,7 @@ import com.google.gson.JsonObject;
import org.gradle.api.logging.Logger;
import net.fabricmc.loom.util.function.CollectionUtil;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MappingTree;
/**
* Remaps coremod class names from SRG to Yarn.
@@ -57,7 +57,7 @@ import net.fabricmc.mapping.tree.TinyTree;
public final class CoreModClassRemapper {
private static final Pattern CLASS_NAME_PATTERN = Pattern.compile("^(.*')((?:com\\.mojang\\.|net\\.minecraft\\.)[A-Za-z0-9.-_$]+)('.*)$");
- public static void remapJar(Path jar, TinyTree mappings, Logger logger) throws IOException {
+ public static void remapJar(Path jar, MappingTree mappings, Logger logger) throws IOException {
try (FileSystem fs = FileSystems.newFileSystem(URI.create("jar:" + jar.toUri()), ImmutableMap.of("create", false))) {
Path coremodsJsonPath = fs.getPath("META-INF", "coremods.json");
@@ -86,7 +86,7 @@ public final class CoreModClassRemapper {
}
}
- public static void remap(Path js, TinyTree mappings) throws IOException {
+ public static void remap(Path js, MappingTree mappings) throws IOException {
List<String> lines = Files.readAllLines(js);
List<String> output = new ArrayList<>(lines);
diff --git a/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java
index edc7e263..5a2688fe 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/InnerClassRemapper.java
@@ -39,11 +39,10 @@ import dev.architectury.tinyremapper.IMappingProvider;
import net.fabricmc.loom.util.FileSystemUtil;
import net.fabricmc.loom.util.FileSystemUtil.FileSystemDelegate;
-import net.fabricmc.mapping.tree.ClassDef;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MappingTree;
public class InnerClassRemapper {
- public static IMappingProvider of(Set<String> fromClassNames, TinyTree mappingsWithSrg, String from, String to) throws IOException {
+ public static IMappingProvider of(Set<String> fromClassNames, MappingTree mappingsWithSrg, String from, String to) throws IOException {
return sink -> {
remapInnerClass(fromClassNames, mappingsWithSrg, from, to, sink::acceptClass);
};
@@ -72,10 +71,10 @@ public class InnerClassRemapper {
return set;
}
- private static void remapInnerClass(Set<String> classNames, TinyTree mappingsWithSrg, String from, String to, BiConsumer<String, String> action) {
+ private static void remapInnerClass(Set<String> classNames, MappingTree mappingsWithSrg, String from, String to, BiConsumer<String, String> action) {
BiMap<String, String> availableClasses = HashBiMap.create(mappingsWithSrg.getClasses().stream()
.collect(Collectors.groupingBy(classDef -> classDef.getName(from),
- Collectors.<ClassDef, String>reducing(
+ Collectors.<MappingTree.ClassMapping, String>reducing(
null,
classDef -> classDef.getName(to),
(first, last) -> last
diff --git a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java
index f8ade791..96382bb5 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/MCPReader.java
@@ -42,11 +42,6 @@ import java.util.regex.Pattern;
import com.opencsv.CSVReader;
import com.opencsv.exceptions.CsvValidationException;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableFieldDef;
-import dev.architectury.mappingslayers.api.mutable.MutableMethodDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import org.apache.commons.io.IOUtils;
import org.cadixdev.lorenz.MappingSet;
import org.cadixdev.lorenz.io.srg.tsrg.TSrgReader;
@@ -57,6 +52,9 @@ import org.cadixdev.lorenz.model.MethodMapping;
import org.cadixdev.lorenz.model.TopLevelClassMapping;
import org.jetbrains.annotations.Nullable;
+import net.fabricmc.mappingio.MappingReader;
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
import net.fabricmc.stitch.commands.tinyv2.TinyClass;
import net.fabricmc.stitch.commands.tinyv2.TinyField;
import net.fabricmc.stitch.commands.tinyv2.TinyFile;
@@ -204,21 +202,22 @@ public class MCPReader {
return tokens;
}
- private void readTsrg2(Map<MemberToken, String> tokens, String content) {
- MutableTinyTree tree = MappingsUtils.deserializeFromTsrg2(content);
- int obfIndex = tree.getMetadata().index("obf");
- int srgIndex = tree.getMetadata().index("srg");
+ private void readTsrg2(Map<MemberToken, String> tokens, String content) throws IOException {
+ MemoryMappingTree tree = new MemoryMappingTree();
+ MappingReader.read(new StringReader(content), tree);
+ int obfIndex = tree.getNamespaceId("obf");
+ int srgIndex = tree.getNamespaceId("srg");
- for (MutableClassDef classDef : tree.getClassesMutable()) {
+ for (MappingTree.ClassMapping classDef : tree.getClasses()) {
MemberToken ofClass = MemberToken.ofClass(classDef.getName(obfIndex));
tokens.put(ofClass, classDef.getName(srgIndex));
- for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) {
+ for (MappingTree.FieldMapping fieldDef : classDef.getFields()) {
tokens.put(MemberToken.ofField(ofClass, fieldDef.getName(obfIndex)), fieldDef.getName(srgIndex));
}
- for (MutableMethodDef methodDef : classDef.getMethodsMutable()) {
- tokens.put(MemberToken.ofMethod(ofClass, methodDef.getName(obfIndex), methodDef.getDescriptor(obfIndex)),
+ for (MappingTree.MethodMapping methodDef : classDef.getMethods()) {
+ tokens.put(MemberToken.ofMethod(ofClass, methodDef.getName(obfIndex), methodDef.getDesc(obfIndex)),
methodDef.getName(srgIndex));
}
}
diff --git a/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java b/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java
index b3a0e4c3..b239fcc5 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/SpecialSourceExecutor.java
@@ -29,25 +29,34 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
-import java.util.jar.JarOutputStream;
import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import org.apache.commons.io.IOUtils;
+import com.google.common.base.Stopwatch;
import org.apache.commons.io.output.NullOutputStream;
import org.gradle.api.Project;
import org.gradle.api.file.FileCollection;
import org.gradle.api.logging.LogLevel;
import org.gradle.api.logging.configuration.ShowStacktrace;
-import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension;
+import net.fabricmc.loom.util.FileSystemUtil;
+import net.fabricmc.loom.util.ThreadingUtils;
public class SpecialSourceExecutor {
+ private static String trimLeadingSlash(String string) {
+ if (string.startsWith(File.separator)) {
+ return string.substring(File.separator.length());
+ } else if (string.startsWith("/")) {
+ return string.substring(1);
+ }
+ return string;
+ }
+
public static Path produceSrgJar(boolean specialSource, Project project, String side, FileCollection classpath, Set<File> mcLibs, Path officialJar, Path mappings)
throws Exception {
Set<String> filter = Files.readAllLines(mappings, StandardCharsets.UTF_8).stream()
@@ -58,14 +67,35 @@ public class SpecialSourceExecutor {
Path stripped = extension.getFiles().getProjectBuildCache().toPath().resolve(officialJar.getFileName().toString().substring(0, officialJar.getFileName().toString().length() - 4) + "-filtered.jar");
Files.deleteIfExists(stripped);
- try (JarOutputStream output = new JarOutputStream(Files.newOutputStream(stripped))) {
- ZipUtil.iterate(officialJar.toFile(), (in, zipEntry) -> {
- if (filter.contains(zipEntry.getName())) {
- output.putNextEntry((ZipEntry) zipEntry.clone());
- IOUtils.write(IOUtils.toByteArray(in), output);
- output.closeEntry();
+ Stopwatch stopwatch = Stopwatch.createStarted();
+
+ try (FileSystemUtil.FileSystemDelegate output = FileSystemUtil.getJarFileSystem(stripped, true)) {
+ try (FileSystemUtil.FileSystemDelegate fs = FileSystemUtil.getJarFileSystem(officialJar, false)) {
+ ThreadingUtils.TaskCompleter completer = ThreadingUtils.taskCompleter();
+
+ for (Path path : (Iterable<? extends Path>) Files.walk(fs.get().getPath("/"))::iterator) {
+ String trimLeadingSlash = trimLeadingSlash(path.toString());
+ if (!trimLeadingSlash.endsWith(".class")) continue;
+ boolean has = filter.contains(trimLeadingSlash);
+ String s = trimLeadingSlash;
+ while (s.contains("$") && !has) {
+ s = s.substring(0, s.lastIndexOf("$")) + ".class";
+ has = filter.contains(s);
+ }
+ if (!has) continue;
+ Path to = output.get().getPath(trimLeadingSlash);
+ Path parent = to.getParent();
+ if (parent != null) Files.createDirectories(parent);
+
+ completer.add(() -> {
+ Files.copy(path, to, StandardCopyOption.COPY_ATTRIBUTES);
+ });
}
- });
+
+ completer.complete();
+ }
+ } finally {
+ project.getLogger().info("Copied class files in " + stopwatch.stop());
}
Path output = extension.getFiles().getProjectBuildCache().toPath().resolve(officialJar.getFileName().toString().substring(0, officialJar.getFileName().toString().length() - 4) + "-srg-output.jar");
@@ -93,7 +123,7 @@ public class SpecialSourceExecutor {
// if running with INFO or DEBUG logging
if (project.getGradle().getStartParameter().getShowStacktrace() != ShowStacktrace.INTERNAL_EXCEPTIONS
- || project.getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) < 0) {
+ || project.getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) < 0) {
spec.setStandardOutput(System.out);
spec.setErrorOutput(System.err);
} else {
@@ -131,7 +161,7 @@ public class SpecialSourceExecutor {
// if running with INFO or DEBUG logging
if (project.getGradle().getStartParameter().getShowStacktrace() != ShowStacktrace.INTERNAL_EXCEPTIONS
- || project.getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) < 0) {
+ || project.getGradle().getStartParameter().getLogLevel().compareTo(LogLevel.LIFECYCLE) < 0) {
spec.setStandardOutput(System.out);
spec.setErrorOutput(System.err);
} else {
diff --git a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java
index e2cf730f..eed51da8 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/SrgMerger.java
@@ -37,14 +37,10 @@ import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
import com.google.common.base.MoreObjects;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableDescriptored;
-import dev.architectury.mappingslayers.api.mutable.MutableFieldDef;
-import dev.architectury.mappingslayers.api.mutable.MutableMethodDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import org.apache.commons.io.IOUtils;
import org.cadixdev.lorenz.MappingSet;
import org.cadixdev.lorenz.io.srg.tsrg.TSrgReader;
@@ -56,12 +52,11 @@ import org.cadixdev.lorenz.model.TopLevelClassMapping;
import org.jetbrains.annotations.Nullable;
import net.fabricmc.loom.util.function.CollectionUtil;
-import net.fabricmc.mapping.tree.ClassDef;
-import net.fabricmc.mapping.tree.FieldDef;
-import net.fabricmc.mapping.tree.MethodDef;
-import net.fabricmc.mapping.tree.TinyMappingFactory;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.MappingReader;
import net.fabricmc.mappingio.format.TsrgReader;
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MappingTreeView;
+import net.fabricmc.mappingio.tree.MemoryMappingTree;
import net.fabricmc.stitch.commands.tinyv2.TinyClass;
import net.fabricmc.stitch.commands.tinyv2.TinyField;
import net.fabricmc.stitch.commands.tinyv2.TinyFile;
@@ -87,15 +82,15 @@ public final class SrgMerger {
* or if an element mentioned in the SRG file does not have tiny mappings
*/
public static void mergeSrg(Supplier<Path> mojmap, Path srg, Path tiny, Path out, boolean lenient) throws IOException, MappingException {
- Map<String, List<MutableDescriptored>> addRegardlessSrgs = new HashMap<>();
+ Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs = new HashMap<>();
MappingSet arr = readSrg(srg, mojmap, addRegardlessSrgs);
- TinyTree foss;
+ MemoryMappingTree foss = new MemoryMappingTree();
try (BufferedReader reader = Files.newBufferedReader(tiny)) {
- foss = TinyMappingFactory.loadWithDetection(reader);
+ MappingReader.read(reader, foss);
}
- List<String> namespaces = new ArrayList<>(foss.getMetadata().getNamespaces());
+ List<String> namespaces = Stream.concat(Stream.of(foss.getSrcNamespace()), foss.getDstNamespaces().stream()).collect(Collectors.toList());
namespaces.add(1, "srg");
if (!"official".equals(namespaces.get(0))) {
@@ -114,7 +109,8 @@ public final class SrgMerger {
TinyV2Writer.write(file, out);
}
- private static MappingSet readSrg(Path srg, Supplier<Path> mojmap, Map<String, List<MutableDescriptored>> addRegardlessSrgs) throws IOException {
+ private static MappingSet readSrg(Path srg, Supplier<Path> mojmap, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs)
+ throws IOException {
try (BufferedReader reader = Files.newBufferedReader(srg)) {
String content = IOUtils.toString(reader);
@@ -128,26 +124,27 @@ public final class SrgMerger {
}
}
- private static MappingSet readTsrg2(String content, Supplier<Path> mojmap, Map<String, List<MutableDescriptored>> addRegardlessSrgs) throws IOException {
+ private static MappingSet readTsrg2(String content, Supplier<Path> mojmap, Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs)
+ throws IOException {
MappingSet set;
try (Tsrg2Utils.MappingsIO2LorenzWriter lorenzWriter = new Tsrg2Utils.MappingsIO2LorenzWriter(0, false)) {
TsrgReader.read(new StringReader(content), lorenzWriter);
set = lorenzWriter.read();
- MutableTinyTree mojmapTree = readTsrg2ToTinyTree(mojmap.get());
+ MemoryMappingTree mojmapTree = readTsrg2ToTinyTree(mojmap.get());
- for (MutableClassDef classDef : mojmapTree.getClassesMutable()) {
- for (MutableMethodDef methodDef : classDef.getMethodsMutable()) {
- String name = methodDef.getName(0);
+ for (MappingTree.ClassMapping classDef : mojmapTree.getClasses()) {
+ for (MappingTree.MethodMapping methodDef : classDef.getMethods()) {
+ String name = methodDef.getSrcName();
- if (name.indexOf('<') != 0 && name.equals(methodDef.getName(1))) {
- addRegardlessSrgs.computeIfAbsent(classDef.getName(0), $ -> new ArrayList<>()).add(methodDef);
+ if (name.indexOf('<') != 0 && name.equals(methodDef.getDstName(0))) {
+ addRegardlessSrgs.computeIfAbsent(classDef.getSrcName(), $ -> new ArrayList<>()).add(methodDef);
}
}
- for (MutableFieldDef fieldDef : classDef.getFieldsMutable()) {
- if (fieldDef.getName(0).equals(fieldDef.getName(1))) {
- addRegardlessSrgs.computeIfAbsent(classDef.getName(0), $ -> new ArrayList<>()).add(fieldDef);
+ for (MappingTree.FieldMapping fieldDef : classDef.getFields()) {
+ if (fieldDef.getSrcName().equals(fieldDef.getDstName(0))) {
+ addRegardlessSrgs.computeIfAbsent(classDef.getSrcName(), $ -> new ArrayList<>()).add(fieldDef);
}
}
}
@@ -156,20 +153,20 @@ public final class SrgMerger {
return set;
}
- private static MutableTinyTree readTsrg2ToTinyTree(Path path) throws IOException {
- MutableTinyTree tree;
+ private static MemoryMappingTree readTsrg2ToTinyTree(Path path) throws IOException {
+ MemoryMappingTree tree = new MemoryMappingTree();
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
- tree = MappingsUtils.deserializeFromTsrg2(IOUtils.toString(reader));
+ MappingReader.read(reader, tree);
}
return tree;
}
- private static void classToTiny(Map<String, List<MutableDescriptored>> addRegardlessSrgs, TinyTree foss, List<String> namespaces, ClassMapping<?, ?> klass, Consumer<TinyClass> classConsumer, boolean lenient) {
+ private static void classToTiny(Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, MappingTree foss, List<String> namespaces, ClassMapping<?, ?> klass, Consumer<TinyClass> classConsumer, boolean lenient) {
String obf = klass.getFullObfuscatedName();
String srg = klass.getFullDeobfuscatedName();
- ClassDef classDef = foss.getDefaultNamespaceClassMap().get(obf);
+ MappingTree.ClassMapping classDef = foss.getClass(obf);
if (classDef == null) {
if (lenient) {
@@ -188,9 +185,9 @@ public final class SrgMerger {
List<TinyField> fields = new ArrayList<>();
for (MethodMapping method : klass.getMethodMappings()) {
- MethodDef def = CollectionUtil.find(
+ MappingTree.MethodMapping def = CollectionUtil.find(
classDef.getMethods(),
- m -> m.getName("official").equals(method.getObfuscatedName()) && m.getDescriptor("official").equals(method.getObfuscatedDescriptor())
+ m -> m.getName("official").equals(method.getObfuscatedName()) && m.getDesc("official").equals(method.getObfuscatedDescriptor())
).orElse(null);
if (def == null) {
@@ -209,7 +206,7 @@ public final class SrgMerger {
);
methods.add(new TinyMethod(
- def.getDescriptor("official"), methodNames,
+ def.getDesc("official"), methodNames,
/* parameters */ Collections.emptyList(),
/* locals */ Collections.emptyList(),
/* comments */ Collections.emptyList()
@@ -217,7 +214,7 @@ public final class SrgMerger {
}
for (FieldMapping field : klass.getFieldMappings()) {
- FieldDef def = CollectionUtil.find(
+ MappingTree.FieldMapping def = CollectionUtil.find(
classDef.getFields(),
f -> f.getName("official").equals(field.getObfuscatedName())
).orElse(nullOrThrow(lenient, () -> new MappingException("Missing field: " + field.getFullObfuscatedName() + " (srg: " + field.getFullDeobfuscatedName() + ")")));
@@ -229,7 +226,7 @@ public final class SrgMerger {
namespace -> "srg".equals(namespace) ? field.getDeobfuscatedName() : def.getName(namespace)
);
- fields.add(new TinyField(def.getDescriptor("official"), fieldNames, Collections.emptyList()));
+ fields.add(new TinyField(def.getDesc("official"), fieldNames, Collections.emptyList()));
}
TinyClass tinyClass = new TinyClass(classNames, methods, fields, Collections.emptyList());
@@ -240,13 +237,13 @@ public final class SrgMerger {
}
}
- private static boolean tryMatchRegardlessSrgs(Map<String, List<MutableDescriptored>> addRegardlessSrgs, List<String> namespaces, String obf,
+ private static boolean tryMatchRegardlessSrgs(Map<String, List<MappingTreeView.MemberMappingView>> addRegardlessSrgs, List<String> namespaces, String obf,
List<TinyMethod> methods, MethodMapping method) {
- List<MutableDescriptored> mutableDescriptoredList = addRegardlessSrgs.get(obf);
+ List<MappingTreeView.MemberMappingView> mutableDescriptoredList = addRegardlessSrgs.get(obf);
if (!method.getDeobfuscatedName().equals(method.getObfuscatedName())) {
- for (MutableDescriptored descriptored : MoreObjects.firstNonNull(mutableDescriptoredList, Collections.<MutableDescriptored>emptyList())) {
- if (descriptored.isMethod() && descriptored.getName(0).equals(method.getObfuscatedName()) && descriptored.getDescriptor(0).equals(method.getObfuscatedDescriptor())) {
+ for (MappingTreeView.MemberMappingView descriptored : MoreObjects.firstNonNull(mutableDescriptoredList, Collections.<MappingTreeView.MemberMappingView>emptyList())) {
+ if (descriptored instanceof MappingTreeView.MethodMappingView && descriptored.getSrcName().equals(method.getObfuscatedName()) && descriptored.getSrcDesc().equals(method.getObfuscatedDescriptor())) {
List<String> methodNames = CollectionUtil.map(
namespaces,
namespace -> "srg".equals(namespace) ? method.getDeobfuscatedName() : method.getObfuscatedName()
diff --git a/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java b/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java
index cea3dbc5..456b8b1b 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/SrgNamedWriter.java
@@ -32,10 +32,10 @@ import org.cadixdev.lorenz.io.srg.SrgWriter;
import org.gradle.api.logging.Logger;
import net.fabricmc.lorenztiny.TinyMappingsReader;
-import net.fabricmc.mapping.tree.TinyTree;
+import net.fabricmc.mappingio.tree.MappingTree;
public class SrgNamedWriter {
- public static void writeTo(Logger logger, Path srgFile, TinyTree mappings, String from, String to) throws IOException {
+ public static void writeTo(Logger logger, Path srgFile, MappingTree mappings, String from, String to) throws IOException {
Files.deleteIfExists(srgFile);
try (SrgWriter writer = new SrgWriter(Files.newBufferedWriter(srgFile))) {
diff --git a/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Utils.java b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Utils.java
index 6279d569..4ed3a884 100644
--- a/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Utils.java
+++ b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Utils.java
@@ -25,22 +25,11 @@
package net.fabricmc.loom.util.srg;
import java.io.IOException;
-import java.io.Reader;
-import java.io.UncheckedIOException;
import java.io.Writer;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.function.Consumer;
-import dev.architectury.mappingslayers.api.mutable.MutableClassDef;
-import dev.architectury.mappingslayers.api.mutable.MutableFieldDef;
-import dev.architectury.mappingslayers.api.mutable.MutableMethodDef;
-import dev.architectury.mappingslayers.api.mutable.MutableParameterDef;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyMetadata;
-import dev.architectury.mappingslayers.api.mutable.MutableTinyTree;
-import dev.architectury.mappingslayers.api.utils.MappingsUtils;
import org.cadixdev.lorenz.MappingSet;
import org.cadixdev.lorenz.io.srg.tsrg.TSrgWriter;
import org.cadixdev.lorenz.model.ClassMapping;
@@ -49,21 +38,10 @@ import org.cadixdev.lorenz.model.MethodMapping;
import net.fabricmc.mappingio.MappingVisitor;
import net.fabricmc.mappingio.MappingWriter;
import net.fabricmc.mappingio.adapter.ForwardingMappingVisitor;
-import net.fabricmc.mappingio.format.TsrgReader;
import net.fabricmc.mappingio.tree.MappingTree;
import net.fabricmc.mappingio.tree.MemoryMappingTree;
public class Tsrg2Utils {
- public static void convert(Reader reader, Writer writer) throws IOException {
- writeTsrg(visitor -> {
- try {
- TsrgReader.read(reader, visitor);
- } catch (IOException e) {
- throw new UncheckedIOException(e);
- }
- }, "srg", false, writer);
- }
-
public static void writeTsrg(Consumer<MappingVisitor> visitorConsumer, String dstNamespace, boolean applyParameterMappings, Writer writer)
throws IOException {
MappingSet set;
@@ -78,18 +56,6 @@ public class Tsrg2Utils {
}
}
- public static void writeTsrg2(Consumer<MappingVisitor> visitorConsumer, Writer writer)
- throws IOException {
- MutableTinyTree tree;
-
- try (MappingsIO2MappingsUtils w = new MappingsIO2MappingsUtils()) {
- visitorConsumer.accept(w);
- tree = w.read();
- }
-
- writer.write(MappingsUtils.serializeToTsrg2(tree));
- }
-
// TODO Move this elsewhere
public abstract static class MappingsIO2Others extends ForwardingMappingVisitor implements MappingWriter {
public MappingsIO2Others() {
@@ -175,59 +141,4 @@ public class Tsrg2Utils {
return mappings;
}
}
-
- public static class MappingsIO2MappingsUtils extends MappingsIO2Others {
- public MutableTinyTree read() {
- MappingTree tree = tree();
- int dstNamesSize = tree.getDstNamespaces().size();
- List<String> namespaces = new ArrayList<>();
- namespaces.add(tree.getSrcNamespace());
- namespaces.addAll(tree.getDstNamespaces());
- Map<String, String> properties = new HashMap<>();
-
- for (Map.Entry<String, String> entry : tree.getMetadata()) {
- properties.put(entry.getKey(), entry.getValue());
- }
-
- MutableTinyTree out = MappingsUtils.create(MutableTinyMetadata.create(2, 0, namespaces, properties));
-
- for (MappingTree.ClassMapping aClass : tree.getClasses()) {
- MutableClassDef classDef = out.getOrCreateClass(aClass.getSrcName());
- classDef.setComment(aClass.getComment());
-
- for (int i = 0; i < dstNamesSize; i++) {
- classDef.setName(i + 1, aClass.getDstName(i));
- }
-
- for (MappingTree.MethodMapping aMethod : aClass.getMethods()) {
- MutableMethodDef methodDef = classDef.getOrCreateMethod(aMethod.getSrcName(), aMethod.getSrcDesc());
- methodDef.setComment(aMethod.getComment());
-
- for (int i = 0; i < dstNamesSize; i++) {
- methodDef.setName(i + 1, aMethod.getDstName(i));
- }
-
- for (MappingTree.MethodArgMapping aMethodArg : aMethod.getArgs()) {
- MutableParameterDef parameterDef = methodDef.getOrCreateParameter(aMethodArg.getLvIndex(), aMethodArg.getSrcName());
- parameterDef.setComment(aMethodArg.getComment());
-
- for (int i = 0; i < dstNamesSize; i++) {
- parameterDef.setName(i + 1, aMethodArg.getDstName(i));
- }
- }
- }
-
- for (MappingTree.FieldMapping aField : aClass.getFields()) {
- MutableFieldDef fieldDef = classDef.getOrCreateField(aField.getSrcName(), aField.getSrcDesc());
- fieldDef.setComment(aField.getComment());
-
- for (int i = 0; i < dstNamesSize; i++) {
- fieldDef.setName(i + 1, aField.getDstName(i));
- }
- }
- }
-
- return out;
- }
- }
}
diff --git a/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java
new file mode 100644
index 00000000..29c31560
--- /dev/null
+++ b/src/main/java/net/fabricmc/loom/util/srg/Tsrg2Writer.java
@@ -0,0 +1,86 @@
+package net.fabricmc.loom.util.srg;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import net.fabricmc.mappingio.tree.MappingTree;
+import net.fabricmc.mappingio.tree.MappingTreeView;
+
+public class Tsrg2Writer {
+ public Tsrg2Writer() {
+ }
+
+ public static String serialize(MappingTree tree) {
+ List<String> namespaces = Stream.concat(Stream.of(tree.getSrcNamespace()), tree.getDstNamespaces().stream()).collect(Collectors.toList());
+ StringBuilder builder = new StringBuilder();
+ writeHeader(namespaces, builder);
+
+ for (MappingTree.ClassMapping classMapping : tree.getClasses()) {
+ writeClass(namespaces, classMapping, builder);
+ }
+
+ return builder.toString();
+ }
+
+ private static void writeClass(List<String> namespaces, MappingTree.ClassMapping def, StringBuilder builder) {
+ writeMapped(false, namespaces, def, builder);
+
+ for (MappingTree.MethodMapping method : def.getMethods()) {
+ writeMethod(namespaces, method, builder);
+ }
+
+ for (MappingTree.FieldMapping field : def.getFields()) {
+ writeMapped(true, namespaces, field, builder);
+ }
+ }
+
+ private static void writeMethod(List<String> namespaces, MappingTree.MethodMapping def, StringBuilder builder) {
+ writeMapped(true, namespaces, def, builder);
+ for (MappingTree.MethodArgMapping arg : def.getArgs()) {
+ builder.append("\t\t").append(arg.getLvIndex());
+ writeMapped(true, namespaces, arg, builder);
+ }
+ }
+
+ private static void writeField(List<String> namespaces, MappingTree.FieldMapping def, StringBuilder builder) {
+ writeMapped(true, namespaces, def, builder);
+ }
+
+ private static void writeMapped(boolean needFirst, List<String> namespaces, MappingTreeView.ElementMappingView mapped, StringBuilder builder) {
+ String[] names = namespaces.stream().map(mapped::getName).toArray(String[]::new);
+
+ for (int i = 0; i < names.length; ++i) {
+ String name = names[i];
+ if (i == 0) {
+ if (needFirst) {
+ builder.append('\t');
+ }
+ } else {
+ builder.append(' ');
+ }
+
+ builder.append(name);
+ if (i == 0 && mapped instanceof MappingTreeView.MemberMappingView) {
+ String descriptor = ((MappingTreeView.MemberMappingView) mapped).getSrcDesc();
+ if (descriptor != null && !descriptor.isEmpty()) {
+ builder.append(' ');
+ builder.append(descriptor);
+ }
+ }
+ }
+
+ builder.append('\n');
+ }
+
+ private static void writeHeader(List<String> namespaces, StringBuilder builder) {
+ builder.append("tsrg2");
+
+ for (String namespace : namespaces) {
+ builder.append(' ');
+ builder.append(namespace);
+ }
+
+ builder.append('\n');
+ }
+}