Expose layered mappings as an API (#490)

* Expose layered mappings as an API

* Add FileSpec

* Cleanup and support DependencyFileSpec
dev/0.11
modmuss50 2021-09-13 17:58:52 +01:00 committed by GitHub
parent 4f2ead9f16
commit 08e548b6c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 552 additions and 131 deletions

View File

@ -38,9 +38,9 @@ import org.gradle.api.publish.maven.MavenPublication;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import net.fabricmc.loom.api.decompilers.LoomDecompiler; import net.fabricmc.loom.api.decompilers.LoomDecompiler;
import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder;
import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.ide.RunConfigSettings;
import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder;
import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.DeprecationHelper;
/** /**

View File

@ -22,16 +22,22 @@
* SOFTWARE. * SOFTWARE.
*/ */
package net.fabricmc.loom.configuration.providers.mappings; package net.fabricmc.loom.api.mappings.layered;
import java.io.File; import java.nio.file.Path;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logger;
import org.jetbrains.annotations.ApiStatus;
import net.fabricmc.loom.configuration.providers.MinecraftProvider; import net.fabricmc.loom.configuration.providers.MinecraftProvider;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider;
@ApiStatus.Experimental /* Very Experimental and not cleanly separated from the impl atm */
public interface MappingContext { public interface MappingContext {
File mavenFile(String mavenNotation); Path resolveDependency(Dependency dependency);
Path resolveMavenDependency(String mavenNotation);
MappingsProvider mappingsProvider(); MappingsProvider mappingsProvider();
@ -44,7 +50,7 @@ public interface MappingContext {
/** /**
* Creates a temporary working dir to be used to store working files. * Creates a temporary working dir to be used to store working files.
*/ */
File workingDirectory(String name); Path workingDirectory(String name);
Logger getLogger(); Logger getLogger();
} }

View File

@ -22,21 +22,28 @@
* SOFTWARE. * SOFTWARE.
*/ */
package net.fabricmc.loom.configuration.providers.mappings; package net.fabricmc.loom.api.mappings.layered;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.jetbrains.annotations.ApiStatus;
import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.MappingVisitor;
@ApiStatus.Experimental
public interface MappingLayer { public interface MappingLayer {
void visit(MappingVisitor mappingVisitor) throws IOException; void visit(MappingVisitor mappingVisitor) throws IOException;
default MappingNamespace getSourceNamespace() { default MappingsNamespace getSourceNamespace() {
return MappingNamespace.NAMED; return MappingsNamespace.NAMED;
} }
/**
* Provides a list of layer classes that this mapping layer depends on. If such a layer is not present an Exception will be thrown when trying to resolve the layer.
* @return A list of MappingLayer classes to depend on.
*/
default List<Class<? extends MappingLayer>> dependsOn() { default List<Class<? extends MappingLayer>> dependsOn() {
return Collections.emptyList(); return Collections.emptyList();
} }

View File

@ -0,0 +1,56 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2016-2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.api.mappings.layered;
import java.util.Locale;
/**
* The standard namespaces used by loom.
*/
public enum MappingsNamespace {
/**
* Official mappings are the names that are used in the vanilla Minecraft game jars, these are usually obfuscated.
*/
OFFICIAL,
/**
* Intermediary mappings have been generated to provide a stable set of names across minecraft versions.
*
* <p>Intermediary is used in a production runtime (outside a dev env) allowing mods to run across multiple versions of the game. Mods are remapped from "named" at build time.
*
* @see <a href="https://github.com/FabricMC/intermediary/">github.com/FabricMC/intermediary/</a>
*/
INTERMEDIARY,
/**
* Named mappings are the developer friendly names used to develop mods against.
*/
NAMED;
@Override
public String toString() {
return name().toLowerCase(Locale.ROOT);
}
}

View File

@ -0,0 +1,79 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.api.mappings.layered.spec;
import java.io.File;
import java.nio.file.Path;
import java.util.Objects;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.file.RegularFileProperty;
import org.jetbrains.annotations.ApiStatus;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.configuration.providers.mappings.utils.DependencyFileSpec;
import net.fabricmc.loom.configuration.providers.mappings.utils.LocalFileSpec;
import net.fabricmc.loom.configuration.providers.mappings.utils.MavenFileSpec;
/**
* FileSpec should be used in MappingsSpec's that take an input file. The input file can either be a local file or a gradle dep.
*/
@ApiStatus.Experimental
public interface FileSpec {
static FileSpec create(Object o) {
Objects.requireNonNull(o, "Object cannot be null");
if (o instanceof String s) {
return createFromMavenDependency(s);
} else if (o instanceof Dependency d) {
return createFromDependency(d);
} else if (o instanceof File f) {
return createFromFile(f);
} else if (o instanceof RegularFileProperty rfp) {
return createFromFile(rfp);
}
throw new UnsupportedOperationException("Cannot create FileSpec from object of type:" + o.getClass().getCanonicalName());
}
static FileSpec createFromMavenDependency(String dependencyNotation) {
return new MavenFileSpec(dependencyNotation);
}
static FileSpec createFromDependency(Dependency dependency) {
return new DependencyFileSpec(dependency);
}
static FileSpec createFromFile(File file) {
return new LocalFileSpec(file);
}
// Note resolved instantly, this is not lazy
static FileSpec createFromFile(RegularFileProperty regularFileProperty) {
return createFromFile(regularFileProperty.getAsFile().get());
}
Path get(MappingContext context);
}

View File

@ -0,0 +1,50 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.api.mappings.layered.spec;
import org.gradle.api.Action;
import org.jetbrains.annotations.ApiStatus;
/**
* Used to configure a layered mapping spec.
*/
@ApiStatus.Experimental
public interface LayeredMappingSpecBuilder {
/**
* Add a MappingsSpec layer.
*/
LayeredMappingSpecBuilder addLayer(MappingsSpec<?> mappingSpec);
/**
* Add a layer that uses the official mappings provided by Mojang.
*/
LayeredMappingSpecBuilder officialMojangMappings();
default LayeredMappingSpecBuilder parchment(Object object) {
return parchment(object, parchmentMappingsSpecBuilder -> parchmentMappingsSpecBuilder.setRemovePrefix(true));
}
LayeredMappingSpecBuilder parchment(Object object, Action<ParchmentMappingsSpecBuilder> action);
}

View File

@ -22,8 +22,21 @@
* SOFTWARE. * SOFTWARE.
*/ */
package net.fabricmc.loom.configuration.providers.mappings; package net.fabricmc.loom.api.mappings.layered.spec;
import org.jetbrains.annotations.ApiStatus;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.api.mappings.layered.MappingLayer;
/**
* A MappingsSpec is an immutable set of data used to create the MappingLayer.
*
* <p>The hashCode is used to generate a hash of the full layered mapping spec, used to cache.
*
* <p>Commonly implemented as a record
*/
@ApiStatus.Experimental
public interface MappingsSpec<L extends MappingLayer> { public interface MappingsSpec<L extends MappingLayer> {
L createLayer(MappingContext context); L createLayer(MappingContext context);
} }

View File

@ -1,7 +1,7 @@
/* /*
* This file is part of fabric-loom, licensed under the MIT License (MIT). * This file is part of fabric-loom, licensed under the MIT License (MIT).
* *
* Copyright (c) 2016-2021 FabricMC * Copyright (c) 2021 FabricMC
* *
* Permission is hereby granted, free of charge, to any person obtaining a copy * Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal * of this software and associated documentation files (the "Software"), to deal
@ -22,16 +22,14 @@
* SOFTWARE. * SOFTWARE.
*/ */
package net.fabricmc.loom.configuration.providers.mappings; package net.fabricmc.loom.api.mappings.layered.spec;
import java.util.Locale; import org.jetbrains.annotations.ApiStatus;
public enum MappingNamespace { @ApiStatus.Experimental
OFFICIAL, public interface ParchmentMappingsSpecBuilder {
INTERMEDIARY, /**
NAMED; * When enabled the "p" prefix will be stripped from parameter names.
*/
public String stringValue() { ParchmentMappingsSpecBuilder setRemovePrefix(boolean removePrefix);
return name().toLowerCase(Locale.ROOT);
}
} }

View File

@ -54,6 +54,7 @@ import net.fabricmc.accesswidener.AccessWidenerRemapper;
import net.fabricmc.accesswidener.AccessWidenerVisitor; import net.fabricmc.accesswidener.AccessWidenerVisitor;
import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.accesswidener.AccessWidenerWriter;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.util.Checksum; import net.fabricmc.loom.util.Checksum;
import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.Constants;
@ -92,7 +93,7 @@ public class AccessWidenerJarProcessor implements JarProcessor {
} }
//Remap accessWidener if its not named, allows for AE's to be written in intermediary //Remap accessWidener if its not named, allows for AE's to be written in intermediary
if (!accessWidener.getNamespace().equals("named")) { if (!accessWidener.getNamespace().equals(MappingsNamespace.NAMED.toString())) {
try { try {
List<String> validNamespaces = loomGradleExtension.getMappingsProvider().getMappings().getMetadata().getNamespaces(); List<String> validNamespaces = loomGradleExtension.getMappingsProvider().getMappings().getMetadata().getNamespaces();
@ -100,10 +101,10 @@ public class AccessWidenerJarProcessor implements JarProcessor {
throw new UnsupportedOperationException(String.format("Access Widener namespace '%s' is not a valid namespace, it must be one of: '%s'", accessWidener.getNamespace(), String.join(", ", validNamespaces))); throw new UnsupportedOperationException(String.format("Access Widener namespace '%s' is not a valid namespace, it must be one of: '%s'", accessWidener.getNamespace(), String.join(", ", validNamespaces)));
} }
TinyRemapper tinyRemapper = loomGradleExtension.getMinecraftMappedProvider().getTinyRemapper("official", "named"); TinyRemapper tinyRemapper = loomGradleExtension.getMinecraftMappedProvider().getTinyRemapper(MappingsNamespace.OFFICIAL.toString(), MappingsNamespace.NAMED.toString());
tinyRemapper.readClassPath(loomGradleExtension.getMinecraftMappedProvider().getRemapClasspath()); tinyRemapper.readClassPath(loomGradleExtension.getMinecraftMappedProvider().getRemapClasspath());
AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, tinyRemapper.getRemapper(), "named"); AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, tinyRemapper.getRemapper(), MappingsNamespace.NAMED.toString());
accessWidener = remapper.remap(); accessWidener = remapper.remap();
tinyRemapper.finish(); tinyRemapper.finish();
@ -160,7 +161,7 @@ public class AccessWidenerJarProcessor implements JarProcessor {
} }
public byte[] getRemappedAccessWidener(Remapper asmRemapper) throws IOException { public byte[] getRemappedAccessWidener(Remapper asmRemapper) throws IOException {
AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, asmRemapper, "intermediary"); AccessWidenerRemapper remapper = new AccessWidenerRemapper(accessWidener, asmRemapper, MappingsNamespace.INTERMEDIARY.toString());
AccessWidener remapped = remapper.remap(); AccessWidener remapped = remapper.remap();
AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped); AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped);

View File

@ -54,6 +54,7 @@ import net.fabricmc.accesswidener.AccessWidenerRemapper;
import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.accesswidener.AccessWidenerWriter;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.configuration.RemappedConfigurationEntry;
import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
@ -113,7 +114,7 @@ public class ModProcessor {
AccessWidenerReader accessWidenerReader = new AccessWidenerReader(accessWidener); AccessWidenerReader accessWidenerReader = new AccessWidenerReader(accessWidener);
accessWidenerReader.read(bufferedReader); accessWidenerReader.read(bufferedReader);
AccessWidenerRemapper accessWidenerRemapper = new AccessWidenerRemapper(accessWidener, remapper, "named"); AccessWidenerRemapper accessWidenerRemapper = new AccessWidenerRemapper(accessWidener, remapper, MappingsNamespace.NAMED.toString());
AccessWidener remapped = accessWidenerRemapper.remap(); AccessWidener remapped = accessWidenerRemapper.remap();
AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped); AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped);
@ -128,8 +129,8 @@ public class ModProcessor {
private static void remapJars(Project project, List<ModDependencyInfo> processList) throws IOException { private static void remapJars(Project project, List<ModDependencyInfo> processList) throws IOException {
LoomGradleExtension extension = LoomGradleExtension.get(project); LoomGradleExtension extension = LoomGradleExtension.get(project);
String fromM = "intermediary"; String fromM = MappingsNamespace.INTERMEDIARY.toString();
String toM = "named"; String toM = MappingsNamespace.NAMED.toString();
MinecraftMappedProvider mappedProvider = extension.getMinecraftMappedProvider(); MinecraftMappedProvider mappedProvider = extension.getMinecraftMappedProvider();
MappingsProviderImpl mappingsProvider = extension.getMappingsProvider(); MappingsProviderImpl mappingsProvider = extension.getMappingsProvider();

View File

@ -25,12 +25,15 @@
package net.fabricmc.loom.configuration.providers.mappings; package net.fabricmc.loom.configuration.providers.mappings;
import java.io.File; import java.io.File;
import java.nio.file.Path;
import org.gradle.api.Project; import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logger;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.configuration.providers.MinecraftProvider; import net.fabricmc.loom.configuration.providers.MinecraftProvider;
public class GradleMappingContext implements MappingContext { public class GradleMappingContext implements MappingContext {
@ -45,9 +48,14 @@ public class GradleMappingContext implements MappingContext {
} }
@Override @Override
public File mavenFile(String mavenNotation) { public Path resolveDependency(Dependency dependency) {
Configuration configuration = project.getConfigurations().detachedConfiguration(project.getDependencies().create(mavenNotation)); Configuration configuration = project.getConfigurations().detachedConfiguration(dependency);
return configuration.getSingleFile(); return configuration.getSingleFile().toPath();
}
@Override
public Path resolveMavenDependency(String mavenNotation) {
return resolveDependency(project.getDependencies().create(mavenNotation));
} }
@Override @Override
@ -61,8 +69,8 @@ public class GradleMappingContext implements MappingContext {
} }
@Override @Override
public File workingDirectory(String name) { public Path workingDirectory(String name) {
return new File(minecraftProvider().dir("layered/working_dir/" + workingDirName), name); return new File(minecraftProvider().dir("layered/working_dir/" + workingDirName), name).toPath();
} }
@Override @Override

View File

@ -26,6 +26,8 @@ package net.fabricmc.loom.configuration.providers.mappings;
import java.util.List; import java.util.List;
import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
public record LayeredMappingSpec(List<MappingsSpec<?>> layers) { public record LayeredMappingSpec(List<MappingsSpec<?>> layers) {
public String getVersion() { public String getVersion() {
// TODO something better? // TODO something better?

View File

@ -30,28 +30,33 @@ import java.util.List;
import org.gradle.api.Action; import org.gradle.api.Action;
import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder;
import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
import net.fabricmc.loom.api.mappings.layered.spec.ParchmentMappingsSpecBuilder;
import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec; import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec;
import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec; import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec;
import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpecBuilder; import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpecBuilderImpl;
public class LayeredMappingSpecBuilder { public class LayeredMappingSpecBuilderImpl implements LayeredMappingSpecBuilder {
private final List<MappingsSpec<?>> layers = new LinkedList<>(); private final List<MappingsSpec<?>> layers = new LinkedList<>();
@Override
public LayeredMappingSpecBuilder addLayer(MappingsSpec<?> mappingSpec) {
layers.add(mappingSpec);
return this;
}
@Override
public LayeredMappingSpecBuilder officialMojangMappings() { public LayeredMappingSpecBuilder officialMojangMappings() {
layers.add(new MojangMappingsSpec()); return addLayer(new MojangMappingsSpec());
return this;
} }
public LayeredMappingSpecBuilder parchment(String mavenNotation) { @Override
parchment(mavenNotation, parchmentMappingsSpecBuilder -> parchmentMappingsSpecBuilder.setRemovePrefix(true)); public LayeredMappingSpecBuilder parchment(Object object, Action<ParchmentMappingsSpecBuilder> action) {
return this; ParchmentMappingsSpecBuilderImpl builder = ParchmentMappingsSpecBuilderImpl.builder(FileSpec.create(object));
}
public LayeredMappingSpecBuilder parchment(String mavenNotation, Action<ParchmentMappingsSpecBuilder> action) {
ParchmentMappingsSpecBuilder builder = ParchmentMappingsSpecBuilder.builder(mavenNotation);
action.execute(builder); action.execute(builder);
layers.add(builder.build()); return addLayer(builder.build());
return this;
} }
public LayeredMappingSpec build() { public LayeredMappingSpec build() {

View File

@ -43,6 +43,8 @@ import org.zeroturnaround.zip.ZipEntrySource;
import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.mappingio.adapter.MappingDstNsReorder; import net.fabricmc.mappingio.adapter.MappingDstNsReorder;
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch;
import net.fabricmc.mappingio.format.Tiny2Writer; import net.fabricmc.mappingio.format.Tiny2Writer;
@ -75,8 +77,8 @@ public class LayeredMappingsDependency implements SelfResolvingDependency {
try (Writer writer = new StringWriter()) { try (Writer writer = new StringWriter()) {
Tiny2Writer tiny2Writer = new Tiny2Writer(writer, false); Tiny2Writer tiny2Writer = new Tiny2Writer(writer, false);
MappingDstNsReorder nsReorder = new MappingDstNsReorder(tiny2Writer, Collections.singletonList(MappingNamespace.NAMED.stringValue())); MappingDstNsReorder nsReorder = new MappingDstNsReorder(tiny2Writer, Collections.singletonList(MappingsNamespace.NAMED.toString()));
MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingNamespace.INTERMEDIARY.stringValue(), true); MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingsNamespace.INTERMEDIARY.toString(), true);
mappings.accept(nsSwitch); mappings.accept(nsSwitch);
Files.deleteIfExists(mappingsFile); Files.deleteIfExists(mappingsFile);

View File

@ -28,6 +28,10 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.api.mappings.layered.MappingLayer;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch; import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch;
import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.mappingio.tree.MemoryMappingTree;
@ -55,7 +59,7 @@ public class LayeredMappingsProcessor {
visitedLayers.add(layer.getClass()); visitedLayers.add(layer.getClass());
// We have to rebuild a new tree to work on when a layer doesnt merge into layered // We have to rebuild a new tree to work on when a layer doesnt merge into layered
boolean rebuild = layer.getSourceNamespace() != MappingNamespace.NAMED; boolean rebuild = layer.getSourceNamespace() != MappingsNamespace.NAMED;
MemoryMappingTree workingTree; MemoryMappingTree workingTree;
if (rebuild) { if (rebuild) {
@ -63,7 +67,7 @@ public class LayeredMappingsProcessor {
// This can be null on the first layer // This can be null on the first layer
if (mappingTree.getSrcNamespace() != null) { if (mappingTree.getSrcNamespace() != null) {
var sourceNsSwitch = new MappingSourceNsSwitch(tempTree, layer.getSourceNamespace().stringValue()); var sourceNsSwitch = new MappingSourceNsSwitch(tempTree, layer.getSourceNamespace().toString());
mappingTree.accept(sourceNsSwitch); mappingTree.accept(sourceNsSwitch);
} }
@ -80,7 +84,7 @@ public class LayeredMappingsProcessor {
if (rebuild) { if (rebuild) {
mappingTree = new MemoryMappingTree(); mappingTree = new MemoryMappingTree();
workingTree.accept(new MappingSourceNsSwitch(mappingTree, MappingNamespace.NAMED.stringValue())); workingTree.accept(new MappingSourceNsSwitch(mappingTree, MappingsNamespace.NAMED.toString()));
} }
} }

View File

@ -48,6 +48,7 @@ import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.DependencyProvider;
import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor; import net.fabricmc.loom.configuration.accesswidener.AccessWidenerJarProcessor;
import net.fabricmc.loom.configuration.processors.JarProcessorManager; import net.fabricmc.loom.configuration.processors.JarProcessorManager;
@ -276,7 +277,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
project.getLogger().info(":merging mappings"); project.getLogger().info(":merging mappings");
MemoryMappingTree tree = new MemoryMappingTree(); MemoryMappingTree tree = new MemoryMappingTree();
MappingSourceNsSwitch sourceNsSwitch = new MappingSourceNsSwitch(tree, MappingNamespace.OFFICIAL.stringValue()); MappingSourceNsSwitch sourceNsSwitch = new MappingSourceNsSwitch(tree, MappingsNamespace.OFFICIAL.toString());
readIntermediaryTree().accept(sourceNsSwitch); readIntermediaryTree().accept(sourceNsSwitch);
try (BufferedReader reader = Files.newBufferedReader(from, StandardCharsets.UTF_8)) { try (BufferedReader reader = Files.newBufferedReader(from, StandardCharsets.UTF_8)) {
@ -292,7 +293,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
private MemoryMappingTree readIntermediaryTree() throws IOException { private MemoryMappingTree readIntermediaryTree() throws IOException {
MemoryMappingTree tree = new MemoryMappingTree(); MemoryMappingTree tree = new MemoryMappingTree();
MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingNamespace.NAMED.stringValue(), MappingNamespace.INTERMEDIARY.stringValue()), true); MappingNsCompleter nsCompleter = new MappingNsCompleter(tree, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true);
try (BufferedReader reader = Files.newBufferedReader(getIntermediaryTiny(), StandardCharsets.UTF_8)) { try (BufferedReader reader = Files.newBufferedReader(getIntermediaryTiny(), StandardCharsets.UTF_8)) {
Tiny2Reader.read(reader, nsCompleter); Tiny2Reader.read(reader, nsCompleter);
@ -316,7 +317,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings
runCommand(command, intermediaryMappings.toAbsolutePath().toString(), runCommand(command, intermediaryMappings.toAbsolutePath().toString(),
yarnMappings.toAbsolutePath().toString(), yarnMappings.toAbsolutePath().toString(),
newMergedMappings.toAbsolutePath().toString(), newMergedMappings.toAbsolutePath().toString(),
"intermediary", "official"); MappingsNamespace.INTERMEDIARY.toString(), MappingsNamespace.OFFICIAL.toString());
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException("Could not merge mappings from " + intermediaryMappings.toString() throw new RuntimeException("Could not merge mappings from " + intermediaryMappings.toString()
+ " with mappings from " + yarnMappings, e); + " with mappings from " + yarnMappings, e);

View File

@ -31,22 +31,22 @@ import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.Collections; import java.util.Collections;
import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; import net.fabricmc.loom.api.mappings.layered.MappingLayer;
import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.MappingVisitor;
import net.fabricmc.mappingio.adapter.MappingNsCompleter; import net.fabricmc.mappingio.adapter.MappingNsCompleter;
import net.fabricmc.mappingio.format.Tiny2Reader; import net.fabricmc.mappingio.format.Tiny2Reader;
public record IntermediaryMappingLayer(File tinyFile) implements MappingLayer { public record IntermediaryMappingLayer(File tinyFile) implements MappingLayer {
@Override @Override
public MappingNamespace getSourceNamespace() { public MappingsNamespace getSourceNamespace() {
return MappingNamespace.OFFICIAL; return MappingsNamespace.OFFICIAL;
} }
@Override @Override
public void visit(MappingVisitor mappingVisitor) throws IOException { public void visit(MappingVisitor mappingVisitor) throws IOException {
// Populate named with intermediary and add Add a "named" namespace // Populate named with intermediary and add Add a "named" namespace
MappingNsCompleter nsCompleter = new MappingNsCompleter(mappingVisitor, Collections.singletonMap(MappingNamespace.NAMED.stringValue(), MappingNamespace.INTERMEDIARY.stringValue()), true); MappingNsCompleter nsCompleter = new MappingNsCompleter(mappingVisitor, Collections.singletonMap(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString()), true);
try (BufferedReader reader = Files.newBufferedReader(tinyFile().toPath(), StandardCharsets.UTF_8)) { try (BufferedReader reader = Files.newBufferedReader(tinyFile().toPath(), StandardCharsets.UTF_8)) {
Tiny2Reader.read(reader, nsCompleter); Tiny2Reader.read(reader, nsCompleter);

View File

@ -24,8 +24,8 @@
package net.fabricmc.loom.configuration.providers.mappings.intermediary; package net.fabricmc.loom.configuration.providers.mappings.intermediary;
import net.fabricmc.loom.configuration.providers.mappings.MappingContext; import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
public record IntermediaryMappingsSpec() implements MappingsSpec<IntermediaryMappingLayer> { public record IntermediaryMappingsSpec() implements MappingsSpec<IntermediaryMappingLayer> {
@Override @Override

View File

@ -25,7 +25,6 @@
package net.fabricmc.loom.configuration.providers.mappings.mojmap; package net.fabricmc.loom.configuration.providers.mappings.mojmap;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
@ -35,8 +34,8 @@ import java.util.List;
import org.gradle.api.logging.Logger; import org.gradle.api.logging.Logger;
import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; import net.fabricmc.loom.api.mappings.layered.MappingLayer;
import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta;
import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingLayer; import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingLayer;
import net.fabricmc.loom.util.HashedDownloadUtil; import net.fabricmc.loom.util.HashedDownloadUtil;
@ -46,30 +45,30 @@ import net.fabricmc.mappingio.format.ProGuardReader;
public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload, public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload,
MinecraftVersionMeta.Download serverDownload, MinecraftVersionMeta.Download serverDownload,
File workingDir, Path workingDir,
Logger logger) implements MappingLayer { Logger logger) implements MappingLayer {
@Override @Override
public void visit(MappingVisitor mappingVisitor) throws IOException { public void visit(MappingVisitor mappingVisitor) throws IOException {
var clientMappings = new File(workingDir(), "client.txt"); Path clientMappings = workingDir().resolve("client.txt");
var serverMappings = new File(workingDir(), "server.txt"); Path serverMappings = workingDir().resolve("server.txt");
download(clientMappings, serverMappings); download(clientMappings, serverMappings);
printMappingsLicense(clientMappings.toPath()); printMappingsLicense(clientMappings);
// Make official the source namespace // Make official the source namespace
MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(mappingVisitor, MappingNamespace.OFFICIAL.stringValue()); MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(mappingVisitor, MappingsNamespace.OFFICIAL.toString());
try (BufferedReader clientBufferedReader = Files.newBufferedReader(clientMappings.toPath(), StandardCharsets.UTF_8); try (BufferedReader clientBufferedReader = Files.newBufferedReader(clientMappings, StandardCharsets.UTF_8);
BufferedReader serverBufferedReader = Files.newBufferedReader(serverMappings.toPath(), StandardCharsets.UTF_8)) { BufferedReader serverBufferedReader = Files.newBufferedReader(serverMappings, StandardCharsets.UTF_8)) {
ProGuardReader.read(clientBufferedReader, MappingNamespace.NAMED.stringValue(), MappingNamespace.OFFICIAL.stringValue(), nsSwitch); ProGuardReader.read(clientBufferedReader, MappingsNamespace.NAMED.toString(), MappingsNamespace.OFFICIAL.toString(), nsSwitch);
ProGuardReader.read(serverBufferedReader, MappingNamespace.NAMED.stringValue(), MappingNamespace.OFFICIAL.stringValue(), nsSwitch); ProGuardReader.read(serverBufferedReader, MappingsNamespace.NAMED.toString(), MappingsNamespace.OFFICIAL.toString(), nsSwitch);
} }
} }
private void download(File clientMappings, File serverMappings) throws IOException { private void download(Path clientMappings, Path serverMappings) throws IOException {
HashedDownloadUtil.downloadIfInvalid(new URL(clientDownload().url()), clientMappings, clientDownload().sha1(), logger(), false); HashedDownloadUtil.downloadIfInvalid(new URL(clientDownload().url()), clientMappings.toFile(), clientDownload().sha1(), logger(), false);
HashedDownloadUtil.downloadIfInvalid(new URL(serverDownload().url()), serverMappings, serverDownload().sha1(), logger(), false); HashedDownloadUtil.downloadIfInvalid(new URL(serverDownload().url()), serverMappings.toFile(), serverDownload().sha1(), logger(), false);
} }
private void printMappingsLicense(Path clientMappings) { private void printMappingsLicense(Path clientMappings) {
@ -91,8 +90,8 @@ public record MojangMappingLayer(MinecraftVersionMeta.Download clientDownload,
} }
@Override @Override
public MappingNamespace getSourceNamespace() { public MappingsNamespace getSourceNamespace() {
return MappingNamespace.OFFICIAL; return MappingsNamespace.OFFICIAL;
} }
@Override @Override

View File

@ -24,8 +24,8 @@
package net.fabricmc.loom.configuration.providers.mappings.mojmap; package net.fabricmc.loom.configuration.providers.mappings.mojmap;
import net.fabricmc.loom.configuration.providers.mappings.MappingContext; import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta;
public record MojangMappingsSpec() implements MappingsSpec<MojangMappingLayer> { public record MojangMappingsSpec() implements MappingsSpec<MojangMappingLayer> {

View File

@ -24,19 +24,19 @@
package net.fabricmc.loom.configuration.providers.mappings.parchment; package net.fabricmc.loom.configuration.providers.mappings.parchment;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.nio.file.Path;
import java.util.Objects; import java.util.Objects;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.LoomGradlePlugin;
import net.fabricmc.loom.configuration.providers.mappings.MappingLayer; import net.fabricmc.loom.api.mappings.layered.MappingLayer;
import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace; import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.mappingio.MappingVisitor; import net.fabricmc.mappingio.MappingVisitor;
public record ParchmentMappingLayer(File parchmentFile, boolean removePrefix) implements MappingLayer { public record ParchmentMappingLayer(Path parchmentFile, boolean removePrefix) implements MappingLayer {
private static final String PARCHMENT_DATA_FILE_NAME = "parchment.json"; private static final String PARCHMENT_DATA_FILE_NAME = "parchment.json";
@Override @Override
@ -47,11 +47,11 @@ public record ParchmentMappingLayer(File parchmentFile, boolean removePrefix) im
mappingVisitor = new ParchmentPrefixStripingMappingVisitor(mappingVisitor); mappingVisitor = new ParchmentPrefixStripingMappingVisitor(mappingVisitor);
} }
parchmentData.visit(mappingVisitor, MappingNamespace.NAMED.stringValue()); parchmentData.visit(mappingVisitor, MappingsNamespace.NAMED.toString());
} }
private ParchmentTreeV1 getParchmentData() throws IOException { private ParchmentTreeV1 getParchmentData() throws IOException {
try (var zipFile = new ZipFile(parchmentFile())) { try (var zipFile = new ZipFile(parchmentFile().toFile())) {
ZipEntry zipFileEntry = zipFile.getEntry(PARCHMENT_DATA_FILE_NAME); ZipEntry zipFileEntry = zipFile.getEntry(PARCHMENT_DATA_FILE_NAME);
Objects.requireNonNull(zipFileEntry, "Could not find %s in parchment data file".formatted(PARCHMENT_DATA_FILE_NAME)); Objects.requireNonNull(zipFileEntry, "Could not find %s in parchment data file".formatted(PARCHMENT_DATA_FILE_NAME));

View File

@ -24,12 +24,13 @@
package net.fabricmc.loom.configuration.providers.mappings.parchment; package net.fabricmc.loom.configuration.providers.mappings.parchment;
import net.fabricmc.loom.configuration.providers.mappings.MappingContext; import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec; import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec;
public record ParchmentMappingsSpec(String mavenNotation, boolean removePrefix) implements MappingsSpec<ParchmentMappingLayer> { public record ParchmentMappingsSpec(FileSpec fileSpec, boolean removePrefix) implements MappingsSpec<ParchmentMappingLayer> {
@Override @Override
public ParchmentMappingLayer createLayer(MappingContext context) { public ParchmentMappingLayer createLayer(MappingContext context) {
return new ParchmentMappingLayer(context.mavenFile(mavenNotation()), removePrefix()); return new ParchmentMappingLayer(fileSpec.get(context), removePrefix());
} }
} }

View File

@ -24,25 +24,29 @@
package net.fabricmc.loom.configuration.providers.mappings.parchment; package net.fabricmc.loom.configuration.providers.mappings.parchment;
public class ParchmentMappingsSpecBuilder { import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
private final String mavenNotation; import net.fabricmc.loom.api.mappings.layered.spec.ParchmentMappingsSpecBuilder;
public class ParchmentMappingsSpecBuilderImpl implements ParchmentMappingsSpecBuilder {
private final FileSpec fileSpec;
private boolean removePrefix; private boolean removePrefix;
private ParchmentMappingsSpecBuilder(String mavenNotation) { private ParchmentMappingsSpecBuilderImpl(FileSpec fileSpec) {
this.mavenNotation = mavenNotation; this.fileSpec = fileSpec;
} }
public static ParchmentMappingsSpecBuilder builder(String depNotation) { public static ParchmentMappingsSpecBuilderImpl builder(FileSpec fileSpec) {
return new ParchmentMappingsSpecBuilder(depNotation); return new ParchmentMappingsSpecBuilderImpl(fileSpec);
} }
@Override
public ParchmentMappingsSpecBuilder setRemovePrefix(boolean removePrefix) { public ParchmentMappingsSpecBuilder setRemovePrefix(boolean removePrefix) {
this.removePrefix = removePrefix; this.removePrefix = removePrefix;
return this; return this;
} }
public ParchmentMappingsSpec build() { public ParchmentMappingsSpec build() {
return new ParchmentMappingsSpec(mavenNotation, removePrefix); return new ParchmentMappingsSpec(fileSpec, removePrefix);
} }
} }

View File

@ -0,0 +1,69 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.configuration.providers.mappings.utils;
import java.io.File;
import java.nio.file.Path;
import java.util.Objects;
import java.util.Set;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.SelfResolvingDependency;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
public record DependencyFileSpec(Dependency dependency) implements FileSpec {
@Override
public Path get(MappingContext context) {
if (dependency instanceof SelfResolvingDependency selfResolvingDependency) {
Set<File> files = selfResolvingDependency.resolve();
if (files.size() == 0) {
throw new RuntimeException("SelfResolvingDependency (%s) resolved no files".formatted(selfResolvingDependency.toString()));
} else if (files.size() > 1) {
throw new RuntimeException("SelfResolvingDependency (%s) resolved too many files (%d) only 1 is expected".formatted(selfResolvingDependency.toString(), files.size()));
}
return files.iterator().next().toPath();
}
return context.resolveDependency(dependency);
}
@Override
public int hashCode() {
return Objects.hash(dependency.getGroup(), dependency.getName(), dependency.getVersion());
}
@Override
public boolean equals(Object obj) {
if (obj instanceof DependencyFileSpec other) {
return other.dependency().contentEquals(this.dependency());
}
return false;
}
}

View File

@ -0,0 +1,63 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.configuration.providers.mappings.utils;
import java.io.File;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Objects;
import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
import net.fabricmc.loom.util.Checksum;
public class LocalFileSpec implements FileSpec {
private final File file;
private final int hash;
public LocalFileSpec(File file) {
this.file = file;
this.hash = calculateHashCode();
}
private int calculateHashCode() {
if (!file.exists()) {
throw new RuntimeException("Could not find %s, it must be present at spec creation time to calculate mappings hash".formatted(file.getAbsolutePath()));
}
// Use the file hash as part of the spec, this means if the input file changes the mappings will be re-generated.
return Objects.hash(Arrays.hashCode(Checksum.sha256(file)), file.getAbsolutePath());
}
@Override
public Path get(MappingContext context) {
return file.toPath();
}
@Override
public int hashCode() {
return hash;
}
}

View File

@ -0,0 +1,37 @@
/*
* This file is part of fabric-loom, licensed under the MIT License (MIT).
*
* Copyright (c) 2021 FabricMC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package net.fabricmc.loom.configuration.providers.mappings.utils;
import java.nio.file.Path;
import net.fabricmc.loom.api.mappings.layered.spec.FileSpec;
import net.fabricmc.loom.api.mappings.layered.MappingContext;
public record MavenFileSpec(String dependencyNotation) implements FileSpec {
@Override
public Path get(MappingContext context) {
return context.resolveMavenDependency(dependencyNotation);
}
}

View File

@ -35,6 +35,7 @@ import java.util.function.Consumer;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.gradle.api.Project; import org.gradle.api.Project;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.DependencyProvider; import net.fabricmc.loom.configuration.DependencyProvider;
import net.fabricmc.loom.configuration.providers.MinecraftProviderImpl; import net.fabricmc.loom.configuration.providers.MinecraftProviderImpl;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
@ -99,7 +100,7 @@ public class MinecraftMappedProvider extends DependencyProvider {
} }
private void mapMinecraftJar() throws IOException { private void mapMinecraftJar() throws IOException {
String fromM = "official"; String fromM = MappingsNamespace.OFFICIAL.toString();
MappingsProviderImpl mappingsProvider = getExtension().getMappingsProvider(); MappingsProviderImpl mappingsProvider = getExtension().getMappingsProvider();
@ -107,8 +108,8 @@ public class MinecraftMappedProvider extends DependencyProvider {
Path outputMapped = minecraftMappedJar.toPath(); Path outputMapped = minecraftMappedJar.toPath();
Path outputIntermediary = minecraftIntermediaryJar.toPath(); Path outputIntermediary = minecraftIntermediaryJar.toPath();
for (String toM : Arrays.asList("named", "intermediary")) { for (String toM : Arrays.asList(MappingsNamespace.NAMED.toString(), MappingsNamespace.INTERMEDIARY.toString())) {
Path output = "named".equals(toM) ? outputMapped : outputIntermediary; Path output = MappingsNamespace.NAMED.toString().equals(toM) ? outputMapped : outputIntermediary;
getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")"); getProject().getLogger().lifecycle(":remapping minecraft (TinyRemapper, " + fromM + " -> " + toM + ")");

View File

@ -37,12 +37,13 @@ import org.gradle.api.publish.maven.MavenPublication;
import net.fabricmc.loom.api.LoomGradleExtensionAPI; import net.fabricmc.loom.api.LoomGradleExtensionAPI;
import net.fabricmc.loom.api.MixinExtensionAPI; import net.fabricmc.loom.api.MixinExtensionAPI;
import net.fabricmc.loom.api.decompilers.LoomDecompiler; import net.fabricmc.loom.api.decompilers.LoomDecompiler;
import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder;
import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.ide.RunConfigSettings;
import net.fabricmc.loom.configuration.mods.ModVersionParser; import net.fabricmc.loom.configuration.mods.ModVersionParser;
import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext; import net.fabricmc.loom.configuration.providers.mappings.GradleMappingContext;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilderImpl;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency; import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency;
import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.DeprecationHelper;
@ -113,7 +114,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA
@Override @Override
public Dependency layered(Action<LayeredMappingSpecBuilder> action) { public Dependency layered(Action<LayeredMappingSpecBuilder> action) {
LayeredMappingSpecBuilder builder = new LayeredMappingSpecBuilder(); LayeredMappingSpecBuilderImpl builder = new LayeredMappingSpecBuilderImpl();
action.execute(builder); action.execute(builder);
LayeredMappingSpec builtSpec = builder.build(); LayeredMappingSpec builtSpec = builder.build();
return new LayeredMappingsDependency(new GradleMappingContext(getProject(), builtSpec.getVersion().replace("+", "_").replace(".", "_")), builtSpec, builtSpec.getVersion()); return new LayeredMappingsDependency(new GradleMappingContext(getProject(), builtSpec.getVersion().replace("+", "_").replace(".", "_")), builtSpec, builtSpec.getVersion());

View File

@ -36,9 +36,9 @@ import org.gradle.api.publish.maven.MavenPublication;
import net.fabricmc.loom.api.LoomGradleExtensionAPI; import net.fabricmc.loom.api.LoomGradleExtensionAPI;
import net.fabricmc.loom.api.MixinExtensionAPI; import net.fabricmc.loom.api.MixinExtensionAPI;
import net.fabricmc.loom.api.decompilers.LoomDecompiler; import net.fabricmc.loom.api.decompilers.LoomDecompiler;
import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder;
import net.fabricmc.loom.configuration.ide.RunConfigSettings; import net.fabricmc.loom.configuration.ide.RunConfigSettings;
import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.configuration.processors.JarProcessor;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder;
import net.fabricmc.loom.util.DeprecationHelper; import net.fabricmc.loom.util.DeprecationHelper;
public class MinecraftGradleExtension implements LoomGradleExtensionAPI { public class MinecraftGradleExtension implements LoomGradleExtensionAPI {

View File

@ -49,10 +49,11 @@ import org.gradle.api.tasks.TaskAction;
import org.gradle.api.tasks.options.Option; import org.gradle.api.tasks.options.Option;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.mappings.layered.spec.LayeredMappingSpecBuilder;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder;
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsDependency;
import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.SourceRemapper;
import net.fabricmc.lorenztiny.TinyMappingsJoiner; import net.fabricmc.lorenztiny.TinyMappingsJoiner;
import net.fabricmc.mapping.tree.TinyMappingFactory; import net.fabricmc.mapping.tree.TinyMappingFactory;
@ -166,9 +167,9 @@ public class MigrateMappingsTask extends AbstractLoomTask {
project.getLogger().info(":joining mappings"); project.getLogger().info(":joining mappings");
MappingSet mappingSet = new TinyMappingsJoiner( MappingSet mappingSet = new TinyMappingsJoiner(
currentMappings, "named", currentMappings, MappingsNamespace.NAMED.toString(),
targetMappings, "named", targetMappings, MappingsNamespace.NAMED.toString(),
"intermediary" MappingsNamespace.INTERMEDIARY.toString()
).read(); ).read();
project.getLogger().lifecycle(":remapping"); project.getLogger().lifecycle(":remapping");

View File

@ -57,6 +57,7 @@ import org.zeroturnaround.zip.transform.StreamZipEntryTransformer;
import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.build.JarRemapper; import net.fabricmc.loom.build.JarRemapper;
import net.fabricmc.loom.build.MixinRefmapHelper; import net.fabricmc.loom.build.MixinRefmapHelper;
import net.fabricmc.loom.build.nesting.JarNester; import net.fabricmc.loom.build.nesting.JarNester;
@ -130,8 +131,8 @@ public class RemapJarTask extends Jar {
MappingsProviderImpl mappingsProvider = extension.getMappingsProvider(); MappingsProviderImpl mappingsProvider = extension.getMappingsProvider();
String fromM = "named"; String fromM = MappingsNamespace.NAMED.toString();
String toM = "intermediary"; String toM = MappingsNamespace.INTERMEDIARY.toString();
if (isMainRemapTask) { if (isMainRemapTask) {
jarRemapper.addToClasspath(getRemapClasspath()); jarRemapper.addToClasspath(getRemapClasspath());

View File

@ -32,12 +32,13 @@ import org.gradle.api.tasks.Internal;
import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.TaskAction;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.util.SourceRemapper; import net.fabricmc.loom.util.SourceRemapper;
public class RemapSourcesJarTask extends AbstractLoomTask { public class RemapSourcesJarTask extends AbstractLoomTask {
private final RegularFileProperty input = getProject().getObjects().fileProperty(); private final RegularFileProperty input = getProject().getObjects().fileProperty();
private final RegularFileProperty output = getProject().getObjects().fileProperty().convention(input); private final RegularFileProperty output = getProject().getObjects().fileProperty().convention(input);
private final Property<String> targetNamespace = getProject().getObjects().property(String.class).convention("intermediary"); private final Property<String> targetNamespace = getProject().getObjects().property(String.class).convention(MappingsNamespace.INTERMEDIARY.toString());
private SourceRemapper sourceRemapper = null; private SourceRemapper sourceRemapper = null;
private final Property<Boolean> preserveFileTimestamps = getProject().getObjects().property(Boolean.class).convention(true); private final Property<Boolean> preserveFileTimestamps = getProject().getObjects().property(Boolean.class).convention(true);
private final Property<Boolean> reproducibleFileOrder = getProject().getObjects().property(Boolean.class).convention(false); private final Property<Boolean> reproducibleFileOrder = getProject().getObjects().property(Boolean.class).convention(false);
@ -49,7 +50,7 @@ public class RemapSourcesJarTask extends AbstractLoomTask {
public void remap() throws Exception { public void remap() throws Exception {
if (sourceRemapper == null) { if (sourceRemapper == null) {
String direction = targetNamespace.get(); String direction = targetNamespace.get();
SourceRemapper.remapSources(getProject(), input.get().getAsFile(), output.get().getAsFile(), direction.equals("named"), reproducibleFileOrder.get(), preserveFileTimestamps.get()); SourceRemapper.remapSources(getProject(), input.get().getAsFile(), output.get().getAsFile(), direction.equals(MappingsNamespace.NAMED.toString()), reproducibleFileOrder.get(), preserveFileTimestamps.get());
} else { } else {
sourceRemapper.scheduleRemapSources(input.get().getAsFile(), output.get().getAsFile(), reproducibleFileOrder.get(), preserveFileTimestamps.get()); sourceRemapper.scheduleRemapSources(input.get().getAsFile(), output.get().getAsFile(), reproducibleFileOrder.get(), preserveFileTimestamps.get());
} }

View File

@ -40,6 +40,7 @@ import org.gradle.api.Project;
import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.ZipUtil;
import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomGradleExtension;
import net.fabricmc.loom.api.mappings.layered.MappingsNamespace;
import net.fabricmc.loom.configuration.RemappedConfigurationEntry; import net.fabricmc.loom.configuration.RemappedConfigurationEntry;
import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl;
import net.fabricmc.loom.util.gradle.ProgressLogger; import net.fabricmc.loom.util.gradle.ProgressLogger;
@ -166,7 +167,7 @@ public class SourceRemapper {
try { try {
TinyTree m = mappingsProvider.getMappings(); TinyTree m = mappingsProvider.getMappings();
project.getLogger().info(":loading " + (toNamed ? "intermediary -> named" : "named -> intermediary") + " source mappings"); project.getLogger().info(":loading " + (toNamed ? "intermediary -> named" : "named -> intermediary") + " source mappings");
return new TinyMappingsReader(m, toNamed ? "intermediary" : "named", toNamed ? "named" : "intermediary").read(); return new TinyMappingsReader(m, toNamed ? MappingsNamespace.INTERMEDIARY.toString() : MappingsNamespace.NAMED.toString(), toNamed ? MappingsNamespace.NAMED.toString() : MappingsNamespace.INTERMEDIARY.toString()).read();
} catch (Exception e) { } catch (Exception e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }

View File

@ -24,8 +24,9 @@
package net.fabricmc.loom.test.unit.layeredmappings package net.fabricmc.loom.test.unit.layeredmappings
import net.fabricmc.loom.configuration.providers.mappings.utils.MavenFileSpec
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilder import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpecBuilderImpl
import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec
import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec
import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec
@ -61,7 +62,7 @@ class LayeredMappingSpecBuilderTest extends Specification {
layers[0].class == IntermediaryMappingsSpec layers[0].class == IntermediaryMappingsSpec
layers[1].class == MojangMappingsSpec layers[1].class == MojangMappingsSpec
layers[2].class == ParchmentMappingsSpec layers[2].class == ParchmentMappingsSpec
parchment.mavenNotation() == "I like cake" (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I like cake"
parchment.removePrefix() == true parchment.removePrefix() == true
} }
@ -81,7 +82,7 @@ class LayeredMappingSpecBuilderTest extends Specification {
layers[0].class == IntermediaryMappingsSpec layers[0].class == IntermediaryMappingsSpec
layers[1].class == MojangMappingsSpec layers[1].class == MojangMappingsSpec
layers[2].class == ParchmentMappingsSpec layers[2].class == ParchmentMappingsSpec
parchment.mavenNotation() == "I like cake" (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I like cake"
parchment.removePrefix() == false parchment.removePrefix() == false
} }
@ -101,17 +102,17 @@ class LayeredMappingSpecBuilderTest extends Specification {
layers[0].class == IntermediaryMappingsSpec layers[0].class == IntermediaryMappingsSpec
layers[1].class == MojangMappingsSpec layers[1].class == MojangMappingsSpec
layers[2].class == ParchmentMappingsSpec layers[2].class == ParchmentMappingsSpec
parchment.mavenNotation() == "I really like cake" (parchment.fileSpec() as MavenFileSpec).dependencyNotation() == "I really like cake"
parchment.removePrefix() == false parchment.removePrefix() == false
} }
// Gradle does this big of magic behind the scenes // Gradle does this big of magic behind the scenes
LayeredMappingSpec layered(@DelegatesTo(LayeredMappingSpecBuilder) Closure cl) { LayeredMappingSpec layered(@DelegatesTo(LayeredMappingSpecBuilderImpl) Closure cl) {
return layeredAction(ConfigureUtil.configureUsing(cl)) return layeredAction(ConfigureUtil.configureUsing(cl))
} }
LayeredMappingSpec layeredAction(Action<LayeredMappingSpecBuilder> action) { LayeredMappingSpec layeredAction(Action<LayeredMappingSpecBuilderImpl> action) {
LayeredMappingSpecBuilder builder = new LayeredMappingSpecBuilder() LayeredMappingSpecBuilderImpl builder = new LayeredMappingSpecBuilderImpl()
action.execute(builder) action.execute(builder)
return builder.build() return builder.build()
} }

View File

@ -28,18 +28,20 @@ import groovy.transform.CompileStatic
import net.fabricmc.loom.configuration.providers.MinecraftProvider import net.fabricmc.loom.configuration.providers.MinecraftProvider
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingSpec
import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsProcessor import net.fabricmc.loom.configuration.providers.mappings.LayeredMappingsProcessor
import net.fabricmc.loom.configuration.providers.mappings.MappingContext import net.fabricmc.loom.api.mappings.layered.MappingContext
import net.fabricmc.loom.configuration.providers.mappings.MappingLayer import net.fabricmc.loom.api.mappings.layered.MappingLayer
import net.fabricmc.loom.configuration.providers.mappings.MappingNamespace import net.fabricmc.loom.api.mappings.layered.MappingsNamespace
import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider
import net.fabricmc.loom.configuration.providers.mappings.MappingsSpec import net.fabricmc.loom.api.mappings.layered.spec.MappingsSpec
import net.fabricmc.mappingio.adapter.MappingDstNsReorder import net.fabricmc.mappingio.adapter.MappingDstNsReorder
import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch import net.fabricmc.mappingio.adapter.MappingSourceNsSwitch
import net.fabricmc.mappingio.format.Tiny2Writer import net.fabricmc.mappingio.format.Tiny2Writer
import net.fabricmc.mappingio.tree.MemoryMappingTree import net.fabricmc.mappingio.tree.MemoryMappingTree
import org.gradle.api.artifacts.Dependency
import org.gradle.api.logging.Logger import org.gradle.api.logging.Logger
import spock.lang.Specification import spock.lang.Specification
import java.nio.file.Path
import java.util.zip.ZipFile import java.util.zip.ZipFile
abstract class LayeredMappingsSpecification extends Specification implements LayeredMappingsTestConstants { abstract class LayeredMappingsSpecification extends Specification implements LayeredMappingsTestConstants {
@ -94,8 +96,8 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay
MemoryMappingTree reorder(MemoryMappingTree mappingTree) { MemoryMappingTree reorder(MemoryMappingTree mappingTree) {
def reorderedMappings = new MemoryMappingTree() def reorderedMappings = new MemoryMappingTree()
def nsReorder = new MappingDstNsReorder(reorderedMappings, Collections.singletonList(MappingNamespace.NAMED.stringValue())) def nsReorder = new MappingDstNsReorder(reorderedMappings, Collections.singletonList(MappingsNamespace.NAMED.toString()))
def nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingNamespace.INTERMEDIARY.stringValue(), true) def nsSwitch = new MappingSourceNsSwitch(nsReorder, MappingsNamespace.INTERMEDIARY.toString(), true)
mappingTree.accept(nsSwitch) mappingTree.accept(nsSwitch)
return reorderedMappings return reorderedMappings
} }
@ -103,9 +105,14 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay
@CompileStatic @CompileStatic
class TestMappingContext implements MappingContext { class TestMappingContext implements MappingContext {
@Override @Override
File mavenFile(String mavenNotation) { Path resolveDependency(Dependency dependency) {
throw new UnsupportedOperationException("TODO")
}
@Override
Path resolveMavenDependency(String mavenNotation) {
assert mavenFiles.containsKey(mavenNotation) assert mavenFiles.containsKey(mavenNotation)
return mavenFiles.get(mavenNotation) return mavenFiles.get(mavenNotation).toPath()
} }
@Override @Override
@ -119,8 +126,8 @@ abstract class LayeredMappingsSpecification extends Specification implements Lay
} }
@Override @Override
File workingDirectory(String name) { Path workingDirectory(String name) {
return new File(tempDir, name) return new File(tempDir, name).toPath()
} }
@Override @Override

View File

@ -24,6 +24,7 @@
package net.fabricmc.loom.test.unit.layeredmappings package net.fabricmc.loom.test.unit.layeredmappings
import net.fabricmc.loom.api.mappings.layered.spec.FileSpec
import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.intermediary.IntermediaryMappingsSpec
import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.mojmap.MojangMappingsSpec
import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec import net.fabricmc.loom.configuration.providers.mappings.parchment.ParchmentMappingsSpec
@ -38,7 +39,7 @@ class ParchmentMappingLayerTest extends LayeredMappingsSpecification {
def mappings = getLayeredMappings( def mappings = getLayeredMappings(
new IntermediaryMappingsSpec(), new IntermediaryMappingsSpec(),
new MojangMappingsSpec(), new MojangMappingsSpec(),
new ParchmentMappingsSpec(PARCHMENT_NOTATION, false) new ParchmentMappingsSpec(FileSpec.create(PARCHMENT_NOTATION), false)
) )
def tiny = getTiny(mappings) def tiny = getTiny(mappings)
def reorderedMappings = reorder(mappings) def reorderedMappings = reorder(mappings)
@ -61,7 +62,7 @@ class ParchmentMappingLayerTest extends LayeredMappingsSpecification {
def mappings = getLayeredMappings( def mappings = getLayeredMappings(
new IntermediaryMappingsSpec(), new IntermediaryMappingsSpec(),
new MojangMappingsSpec(), new MojangMappingsSpec(),
new ParchmentMappingsSpec(PARCHMENT_NOTATION, true) new ParchmentMappingsSpec(FileSpec.create(PARCHMENT_NOTATION), true)
) )
def tiny = getTiny(mappings) def tiny = getTiny(mappings)
def reorderedMappings = reorder(mappings) def reorderedMappings = reorder(mappings)