mirror of
https://github.com/architectury/architectury-loom.git
synced 2026-03-30 05:05:20 -05:00
Merge branch 'dev/0.6-forge' into dev/0.7-forge
# Conflicts: # src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java # src/main/java/net/fabricmc/loom/task/RemapJarTask.java # src/main/java/net/fabricmc/loom/task/RemapSourcesJarTask.java # src/main/java/net/fabricmc/loom/util/SourceRemapper.java
This commit is contained in:
@@ -77,8 +77,8 @@ dependencies {
|
||||
}
|
||||
|
||||
// tinyfile management
|
||||
compileOnly ('net.fabricmc:tiny-remapper:0.3.2-architectury.6')
|
||||
shadowArchitectury ('net.fabricmc:tiny-remapper:0.3.2-architectury.6') {
|
||||
compileOnly ('net.fabricmc:tiny-remapper:0.3.2-architectury.7')
|
||||
shadowArchitectury ('net.fabricmc:tiny-remapper:0.3.2-architectury.7') {
|
||||
transitive = false
|
||||
}
|
||||
implementation ('net.fabricmc:tiny-mappings-parser:0.3.0+build.17')
|
||||
|
||||
@@ -134,11 +134,12 @@ public class LoomGradleExtension {
|
||||
}
|
||||
|
||||
public MappingSet getOrCreateSrcMappingCache(int id, Supplier<MappingSet> factory) {
|
||||
if (id < 0 || id >= srcMappingCache.length) return factory.get();
|
||||
return srcMappingCache[id] != null ? srcMappingCache[id] : (srcMappingCache[id] = factory.get());
|
||||
}
|
||||
|
||||
public Mercury getOrCreateSrcMercuryCache(int id, Supplier<Mercury> factory) {
|
||||
if (id == -1) return factory.get();
|
||||
if (id < 0 || id >= srcMercuryCache.length) return factory.get();
|
||||
return srcMercuryCache[id] != null ? srcMercuryCache[id] : (srcMercuryCache[id] = factory.get());
|
||||
}
|
||||
|
||||
|
||||
@@ -115,6 +115,7 @@ public class MinecraftMappedProvider extends DependencyProvider {
|
||||
if (getExtension().isForge()) {
|
||||
minecraftSrgJar.delete();
|
||||
}
|
||||
|
||||
getExtension().getMappingsProvider().cleanFiles();
|
||||
throw new RuntimeException("Failed to remap minecraft", t);
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ import net.fabricmc.loom.build.nesting.NestedJarProvider;
|
||||
import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor;
|
||||
import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider;
|
||||
import net.fabricmc.loom.util.Constants;
|
||||
import net.fabricmc.loom.util.LoggerFilter;
|
||||
import net.fabricmc.loom.util.SourceRemapper;
|
||||
import net.fabricmc.loom.util.TinyRemapperMappingsHelper;
|
||||
import net.fabricmc.loom.util.gradle.GradleSupport;
|
||||
import net.fabricmc.loom.util.ZipReprocessorUtil;
|
||||
@@ -114,7 +114,7 @@ public class RemapJarTask extends Jar {
|
||||
fromM = getProject().getObjects().property(String.class);
|
||||
toM = getProject().getObjects().property(String.class);
|
||||
fromM.set("named");
|
||||
toM.set("intermediary");
|
||||
toM.set(SourceRemapper.intermediary(getProject()));
|
||||
// false by default, I have no idea why I have to do it for this property and not the other one
|
||||
remapAccessWidener.set(false);
|
||||
addDefaultNestedDependencies.set(true);
|
||||
@@ -136,6 +136,72 @@ public class RemapJarTask extends Jar {
|
||||
}
|
||||
}
|
||||
|
||||
private ReferenceRemapper createReferenceRemapper(LoomGradleExtension extension, String fromM, String toM) throws IOException {
|
||||
TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
|
||||
|
||||
return new SimpleReferenceRemapper(new SimpleReferenceRemapper.Remapper() {
|
||||
@Override
|
||||
@Nullable
|
||||
public String mapClass(String value) {
|
||||
return mappings.getClasses().stream()
|
||||
.filter(classDef -> Objects.equals(classDef.getName(fromM), value))
|
||||
.findFirst()
|
||||
.map(classDef -> classDef.getName(toM))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public String mapMethod(@Nullable String className, String methodName, String methodDescriptor) {
|
||||
if (className != null) {
|
||||
Optional<ClassDef> classDef = mappings.getClasses().stream()
|
||||
.filter(c -> Objects.equals(c.getName(fromM), className))
|
||||
.findFirst();
|
||||
|
||||
if (classDef.isPresent()) {
|
||||
for (MethodDef methodDef : classDef.get().getMethods()) {
|
||||
if (Objects.equals(methodDef.getName(fromM), methodName) && Objects.equals(methodDef.getDescriptor(fromM), methodDescriptor)) {
|
||||
return methodDef.getName(toM);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mappings.getClasses().stream()
|
||||
.flatMap(classDef -> classDef.getMethods().stream())
|
||||
.filter(methodDef -> Objects.equals(methodDef.getName(fromM), methodName) && Objects.equals(methodDef.getDescriptor(fromM), methodDescriptor))
|
||||
.findFirst()
|
||||
.map(methodDef -> methodDef.getName(toM))
|
||||
.orElse(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Nullable
|
||||
public String mapField(@Nullable String className, String fieldName, String fieldDescriptor) {
|
||||
if (className != null) {
|
||||
Optional<ClassDef> classDef = mappings.getClasses().stream()
|
||||
.filter(c -> Objects.equals(c.getName(fromM), className))
|
||||
.findFirst();
|
||||
|
||||
if (classDef.isPresent()) {
|
||||
for (FieldDef fieldDef : classDef.get().getFields()) {
|
||||
if (Objects.equals(fieldDef.getName(fromM), fieldName) && Objects.equals(fieldDef.getDescriptor(fromM), fieldDescriptor)) {
|
||||
return fieldDef.getName(toM);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return mappings.getClasses().stream()
|
||||
.flatMap(classDef -> classDef.getFields().stream())
|
||||
.filter(fieldDef -> Objects.equals(fieldDef.getName(fromM), fieldName) && Objects.equals(fieldDef.getDescriptor(fromM), fieldDescriptor))
|
||||
.findFirst()
|
||||
.map(fieldDef -> fieldDef.getName(toM))
|
||||
.orElse(null);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void scheduleRemap(boolean isMainRemapTask) throws Throwable {
|
||||
Project project = getProject();
|
||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
@@ -154,19 +220,21 @@ public class RemapJarTask extends Jar {
|
||||
if (isMainRemapTask) {
|
||||
jarRemapper.addToClasspath(getRemapClasspath());
|
||||
|
||||
jarRemapper.addMappings(TinyRemapperMappingsHelper.create(extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false));
|
||||
jarRemapper.addMappings(TinyRemapperMappingsHelper.create(extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings(), fromM, toM, false));
|
||||
}
|
||||
|
||||
for (File mixinMapFile : extension.getAllMixinMappings()) {
|
||||
if (mixinMapFile.exists()) {
|
||||
IMappingProvider provider = TinyUtils.createTinyMappingProvider(mixinMapFile.toPath(), fromM, "intermediary");
|
||||
jarRemapper.addMappings(extension.isForge() ? remapToSrg(extension, provider) : provider);
|
||||
jarRemapper.addMappings(!toM.equals("intermediary") ? remapToSrg(extension, provider, fromM, toM) : provider);
|
||||
}
|
||||
}
|
||||
|
||||
// Add remap options to the jar remapper
|
||||
jarRemapper.addOptions(this.remapOptions);
|
||||
|
||||
project.getLogger().info(":scheduling remap " + input.getFileName() + " from " + fromM + " to " + toM);
|
||||
|
||||
NestedJarProvider nestedJarProvider = getNestedJarProvider();
|
||||
nestedJarProvider.prepare(getProject());
|
||||
|
||||
@@ -237,42 +305,42 @@ public class RemapJarTask extends Jar {
|
||||
);
|
||||
}
|
||||
|
||||
private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent) throws IOException {
|
||||
TinyTree srg = extension.getMappingsProvider().getMappingsWithSrg();
|
||||
private IMappingProvider remapToSrg(LoomGradleExtension extension, IMappingProvider parent, String fromM, String toM) throws IOException {
|
||||
TinyTree mappings = extension.shouldGenerateSrgTiny() ? extension.getMappingsProvider().getMappingsWithSrg() : extension.getMappingsProvider().getMappings();
|
||||
|
||||
return sink -> {
|
||||
parent.load(new IMappingProvider.MappingAcceptor() {
|
||||
@Override
|
||||
public void acceptClass(String srcName, String dstName) {
|
||||
String srgName = srg.getClasses()
|
||||
String srgName = mappings.getClasses()
|
||||
.stream()
|
||||
.filter(it -> Objects.equals(it.getName("intermediary"), dstName))
|
||||
.filter(it -> Objects.equals(it.getName(fromM), dstName))
|
||||
.findFirst()
|
||||
.map(it -> it.getName("srg"))
|
||||
.map(it -> it.getName(toM))
|
||||
.orElse(dstName);
|
||||
sink.acceptClass(srcName, srgName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptMethod(IMappingProvider.Member method, String dstName) {
|
||||
String srgName = srg.getClasses()
|
||||
String srgName = mappings.getClasses()
|
||||
.stream()
|
||||
.flatMap(it -> it.getMethods().stream())
|
||||
.filter(it -> Objects.equals(it.getName("intermediary"), dstName))
|
||||
.filter(it -> Objects.equals(it.getName(fromM), dstName))
|
||||
.findFirst()
|
||||
.map(it -> it.getName("srg"))
|
||||
.map(it -> it.getName(toM))
|
||||
.orElse(dstName);
|
||||
sink.acceptMethod(method, srgName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptField(IMappingProvider.Member field, String dstName) {
|
||||
String srgName = srg.getClasses()
|
||||
String srgName = mappings.getClasses()
|
||||
.stream()
|
||||
.flatMap(it -> it.getFields().stream())
|
||||
.filter(it -> Objects.equals(it.getName("intermediary"), dstName))
|
||||
.filter(it -> Objects.equals(it.getName(fromM), dstName))
|
||||
.findFirst()
|
||||
.map(it -> it.getName("srg"))
|
||||
.map(it -> it.getName(toM))
|
||||
.orElse(dstName);
|
||||
sink.acceptField(field, srgName);
|
||||
}
|
||||
|
||||
@@ -37,18 +37,25 @@ import net.fabricmc.loom.util.SourceRemapper;
|
||||
public class RemapSourcesJarTask extends AbstractLoomTask {
|
||||
private Object input;
|
||||
private Object output;
|
||||
private String direction = "intermediary";
|
||||
private String from = "named";
|
||||
private String direction;
|
||||
private SourceRemapper sourceRemapper = null;
|
||||
private boolean preserveFileTimestamps = true;
|
||||
private boolean reproducibleFileOrder = false;
|
||||
|
||||
public RemapSourcesJarTask() {
|
||||
this.direction = SourceRemapper.intermediary(getProject());
|
||||
}
|
||||
|
||||
@TaskAction
|
||||
public void remap() throws Exception {
|
||||
if (sourceRemapper == null) {
|
||||
SourceRemapper.remapSources(getProject(), getInput(), getOutput(), direction.equals("named"), reproducibleFileOrder, preserveFileTimestamps);
|
||||
if (from.equals(direction)) {
|
||||
SourceRemapper.remapSources(getProject(), getInput(), getOutput(),
|
||||
direction.equals("named") ? SourceRemapper.intermediary(getProject()) : "named", direction, reproducibleFileOrder, preserveFileTimestamps);
|
||||
} else {
|
||||
SourceRemapper.remapSources(getProject(), getInput(), getOutput(), from, direction, reproducibleFileOrder, preserveFileTimestamps);
|
||||
}
|
||||
} else {
|
||||
sourceRemapper.scheduleRemapSources(getInput(), getOutput(), reproducibleFileOrder, preserveFileTimestamps);
|
||||
}
|
||||
@@ -74,6 +81,11 @@ public class RemapSourcesJarTask extends AbstractLoomTask {
|
||||
return getProject().file(output == null ? input : output);
|
||||
}
|
||||
|
||||
@Input
|
||||
public String getSourceNamespace() {
|
||||
return from;
|
||||
}
|
||||
|
||||
@Input
|
||||
public String getTargetNamespace() {
|
||||
return direction;
|
||||
@@ -87,6 +99,10 @@ public class RemapSourcesJarTask extends AbstractLoomTask {
|
||||
this.output = output;
|
||||
}
|
||||
|
||||
public void setSourceNamespace(String value) {
|
||||
this.from = value;
|
||||
}
|
||||
|
||||
public void setTargetNamespace(String value) {
|
||||
this.direction = value;
|
||||
}
|
||||
|
||||
@@ -52,18 +52,29 @@ import net.fabricmc.stitch.util.StitchUtil;
|
||||
|
||||
public class SourceRemapper {
|
||||
private final Project project;
|
||||
private final boolean toNamed;
|
||||
private String from;
|
||||
private String to;
|
||||
private final List<Consumer<ProgressLogger>> remapTasks = new ArrayList<>();
|
||||
|
||||
private Mercury mercury;
|
||||
|
||||
public SourceRemapper(Project project, boolean toNamed) {
|
||||
this.project = project;
|
||||
this.toNamed = toNamed;
|
||||
public SourceRemapper(Project project, boolean named) {
|
||||
this(project, named ? intermediary(project) : "named", !named ? intermediary(project) : "named");
|
||||
}
|
||||
|
||||
public static void remapSources(Project project, File input, File output, boolean named, boolean reproducibleFileOrder, boolean preserveFileTimestamps) {
|
||||
SourceRemapper sourceRemapper = new SourceRemapper(project, named);
|
||||
public static String intermediary(Project project) {
|
||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
return extension.isForge() ? "srg" : "intermediary";
|
||||
}
|
||||
|
||||
public SourceRemapper(Project project, String from, String to) {
|
||||
this.project = project;
|
||||
this.from = from;
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
public static void remapSources(Project project, File input, File output, String from, String to, boolean reproducibleFileOrder, boolean preserveFileTimestamps) {
|
||||
SourceRemapper sourceRemapper = new SourceRemapper(project, from, to);
|
||||
sourceRemapper.scheduleRemapSources(input, output, reproducibleFileOrder, preserveFileTimestamps);
|
||||
sourceRemapper.remapAll();
|
||||
}
|
||||
@@ -104,7 +115,7 @@ public class SourceRemapper {
|
||||
}
|
||||
|
||||
private void remapSourcesInner(File source, File destination) throws Exception {
|
||||
project.getLogger().info(":remapping source jar");
|
||||
project.getLogger().info(":remapping source jar " + source.getName() + " from " + from + " to " + to);
|
||||
Mercury mercury = getMercuryInstance();
|
||||
|
||||
if (source.equals(destination)) {
|
||||
@@ -165,19 +176,27 @@ public class SourceRemapper {
|
||||
LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class);
|
||||
MappingsProvider mappingsProvider = extension.getMappingsProvider();
|
||||
|
||||
MappingSet mappings = extension.getOrCreateSrcMappingCache(toNamed ? 1 : 0, () -> {
|
||||
String intermediary = extension.isForge() ? "srg" : "intermediary";
|
||||
int id = -1;
|
||||
|
||||
if (from.equals(intermediary) && to.equals("named")) {
|
||||
id = 1;
|
||||
} else if (to.equals(intermediary) && from.equals("named")) {
|
||||
id = 0;
|
||||
}
|
||||
|
||||
MappingSet mappings = extension.getOrCreateSrcMappingCache(id, () -> {
|
||||
try {
|
||||
String intermediary = extension.isForge() ? "srg" : "intermediary";
|
||||
TinyTree m = extension.isForge() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings();
|
||||
project.getLogger().info(":loading " + (toNamed ? intermediary + " -> named" : "named -> " + intermediary) + " source mappings");
|
||||
return new TinyMappingsReader(m, toNamed ? intermediary : "named", toNamed ? "named" : intermediary).read();
|
||||
TinyTree m = extension.shouldGenerateSrgTiny() ? mappingsProvider.getMappingsWithSrg() : mappingsProvider.getMappings();
|
||||
project.getLogger().info(":loading " + from + " -> " + to + " source mappings");
|
||||
return new TinyMappingsReader(m, from, to).read();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
});
|
||||
|
||||
Mercury mercury = extension.getOrCreateSrcMercuryCache(toNamed ? 1 : 0, () -> {
|
||||
Mercury m = createMercuryWithClassPath(project, toNamed);
|
||||
Mercury mercury = extension.getOrCreateSrcMercuryCache(id, () -> {
|
||||
Mercury m = createMercuryWithClassPath(project, to.equals("named"));
|
||||
|
||||
for (File file : extension.getUnmappedModCollection()) {
|
||||
Path path = file.toPath();
|
||||
|
||||
@@ -245,23 +245,24 @@ public class MCPReader {
|
||||
}
|
||||
}
|
||||
|
||||
try (CSVReader reader = new CSVReader(Files.newBufferedReader(params, StandardCharsets.UTF_8))) {
|
||||
reader.readNext();
|
||||
String[] line;
|
||||
if (Files.exists(params)) {
|
||||
try (CSVReader reader = new CSVReader(Files.newBufferedReader(params, StandardCharsets.UTF_8))) {
|
||||
reader.readNext();
|
||||
String[] line;
|
||||
|
||||
while ((line = reader.readNext()) != null) {
|
||||
Matcher param = paramsPattern.matcher(line[0]);
|
||||
while ((line = reader.readNext()) != null) {
|
||||
Matcher param = paramsPattern.matcher(line[0]);
|
||||
|
||||
if (param.matches()) {
|
||||
String named = line[1];
|
||||
String srgMethodStartWith = "func_" + param.group(1);
|
||||
int lvIndex = Integer.parseInt(param.group(2));
|
||||
List<String> intermediaryMethod = simpleSrgToIntermediary.get(srgMethodStartWith);
|
||||
if (param.matches()) {
|
||||
String named = line[1];
|
||||
String srgMethodStartWith = "func_" + param.group(1);
|
||||
int lvIndex = Integer.parseInt(param.group(2));
|
||||
List<String> intermediaryMethod = simpleSrgToIntermediary.get(srgMethodStartWith);
|
||||
|
||||
if (intermediaryMethod != null) {
|
||||
for (String s : intermediaryMethod) {
|
||||
intermediaryToParamsMap.computeIfAbsent(s, s1 -> new HashMap<>())
|
||||
.put(lvIndex, named);
|
||||
if (intermediaryMethod != null) {
|
||||
for (String s : intermediaryMethod) {
|
||||
intermediaryToParamsMap.computeIfAbsent(s, s1 -> new HashMap<>()).put(lvIndex, named);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user