diff --git a/.editorconfig b/.editorconfig index 3cf20d90..996493f3 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,2 +1,4 @@ [*.{gradle,java}] indent_style = tab +ij_continuation_indent_size = 8 +ij_java_imports_layout = $*,|,java.**,|,javax.**,|,*,|,net.fabricmc.** diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5614635e..da4fdb45 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -3,7 +3,7 @@ name: Java CI on: push: branches: - - 'dev/0.5-forge' + - 'dev/0.6-forge' jobs: build: diff --git a/README.md b/README.md index 343917a0..df34c1aa 100644 --- a/README.md +++ b/README.md @@ -4,14 +4,27 @@ Talk to us on [Discord](https://discord.gg/C2RdJDpRBP)! A fork of [Juuxel's Loom fork]("https://github.com/Juuxel/fabric-loom") that is a fork of [Fabric Loom](https://github.com/FabricMC/fabric-loom) that supports the Forge modding toolchain. -Note that if ForgeGradle works fine for you, *use it*. -This is not meant to be a complete replacement for ForgeGradle, -and there are probably many bugs and limitations here that FG doesn't have. +A [Gradle](https://gradle.org/) plugin to setup a deobfuscated development environment for Minecraft mods. Primarily used in the Fabric toolchain. + +* Has built in support for tiny mappings (Used by [Yarn](https://github.com/FabricMC/yarn)) +* Utilises the Fernflower and CFR decompilers to generate source code with comments. +* Designed to support modern versions of Minecraft (Tested with 1.14.4 and upwards) +* ~~Built in support for IntelliJ IDEA, Eclipse and Visual Studio Code to generate run configurations for Minecraft.~~ +* Loom targets a wide range of Gradle versions. _Tested with 4.9 up to 6.7_ +* Supports the latest version of Java all the way down to Java 8 ## Usage Starting with a Fabric project similar to the example mod, +## Use Loom to develop mods + +To get started developing your own mods please follow the guide on [Setting up a mod development environment](https://fabricmc.net/wiki/tutorial:setup). + +## Debugging Loom (Only needed if you want to work on Loom itself) + +_This guide assumes you are using IntelliJ IDEA, other IDE's have not been tested; your experience may vary._ + Then you need to set `loom.forge = true` in your `gradle.properties`, and add the Forge dependency: diff --git a/build.gradle b/build.gradle index dbeffef8..19294519 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ targetCompatibility = 1.8 group = 'me.shedaniel' archivesBaseName = project.name -def baseVersion = '0.5' +def baseVersion = '0.6' def build = "release #${System.getenv("GITHUB_RUN_NUMBER") == null ? "custom" : System.getenv("GITHUB_RUN_NUMBER")}" version = baseVersion + "." + (System.getenv("GITHUB_RUN_NUMBER") == null ? (((short) new Random().nextInt()).abs() + 1000).toString() : System.getenv("GITHUB_RUN_NUMBER")) @@ -67,7 +67,7 @@ dependencies { // decompilers implementation ('net.fabricmc:procyon-fabric-compilertools:0.5.35.13') - implementation ('org.jetbrains:intellij-fernflower:1.2.1.16') + implementation ('net.fabricmc:fabric-fernflower:1.3.0') implementation ('org.benf:cfr:0.150') // source code remapping @@ -96,6 +96,9 @@ dependencies { testImplementation('org.spockframework:spock-core:1.3-groovy-2.4') { exclude module: 'groovy-all' } + + compileOnly 'org.jetbrains:annotations:20.1.0' + } task forgeInjectJar(type: com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar, dependsOn: [compileForgeInjectJava, processForgeInjectResources]) { diff --git a/src/forgeInject/java/net/fabricmc/loom/inject/mixin/ForgeLoomMixinRemapperInjectorService.java b/src/forgeInject/java/net/fabricmc/loom/inject/mixin/ForgeLoomMixinRemapperInjectorService.java index fe0cc378..d6345d5a 100644 --- a/src/forgeInject/java/net/fabricmc/loom/inject/mixin/ForgeLoomMixinRemapperInjectorService.java +++ b/src/forgeInject/java/net/fabricmc/loom/inject/mixin/ForgeLoomMixinRemapperInjectorService.java @@ -1,16 +1,5 @@ package net.fabricmc.loom.inject.mixin; -import cpw.mods.modlauncher.api.IEnvironment; -import cpw.mods.modlauncher.api.ITransformationService; -import cpw.mods.modlauncher.api.ITransformer; -import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; -import net.fabricmc.mapping.tree.TinyMappingFactory; -import net.fabricmc.mapping.tree.TinyTree; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.MixinEnvironment; - -import javax.annotation.Nonnull; import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Path; @@ -20,6 +9,19 @@ import java.util.List; import java.util.Objects; import java.util.Set; +import javax.annotation.Nonnull; + +import cpw.mods.modlauncher.api.IEnvironment; +import cpw.mods.modlauncher.api.ITransformationService; +import cpw.mods.modlauncher.api.ITransformer; +import cpw.mods.modlauncher.api.IncompatibleEnvironmentException; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.spongepowered.asm.mixin.MixinEnvironment; + +import net.fabricmc.mapping.tree.TinyMappingFactory; +import net.fabricmc.mapping.tree.TinyTree; + public class ForgeLoomMixinRemapperInjectorService implements ITransformationService { private static final Logger LOGGER = LogManager.getLogger("ForgeLoomRemapperInjector"); @@ -31,12 +33,12 @@ public class ForgeLoomMixinRemapperInjectorService implements ITransformationSer @Override public void initialize(IEnvironment environment) { - } @Override public void beginScanning(IEnvironment environment) { LOGGER.debug("We will be injecting our remapper."); + try { MixinEnvironment.getDefaultEnvironment().getRemappers().add(new MixinIntermediaryDevRemapper(Objects.requireNonNull(resolveMappings()), "intermediary", "named")); LOGGER.debug("We have successfully injected our remapper."); @@ -47,7 +49,6 @@ public class ForgeLoomMixinRemapperInjectorService implements ITransformationSer @Override public void onLoad(IEnvironment env, Set otherServices) throws IncompatibleEnvironmentException { - } @Nonnull @@ -60,6 +61,7 @@ public class ForgeLoomMixinRemapperInjectorService implements ITransformationSer try { String srgNamedProperty = System.getProperty("mixin.forgeloom.inject.mappings.srg-named"); Path path = Paths.get(srgNamedProperty); + try (BufferedReader reader = Files.newBufferedReader(path)) { return TinyMappingFactory.loadWithDetection(reader); } diff --git a/src/forgeInject/java/net/fabricmc/loom/inject/mixin/MixinIntermediaryDevRemapper.java b/src/forgeInject/java/net/fabricmc/loom/inject/mixin/MixinIntermediaryDevRemapper.java index a09c3036..ef5724dc 100644 --- a/src/forgeInject/java/net/fabricmc/loom/inject/mixin/MixinIntermediaryDevRemapper.java +++ b/src/forgeInject/java/net/fabricmc/loom/inject/mixin/MixinIntermediaryDevRemapper.java @@ -16,13 +16,20 @@ package net.fabricmc.loom.inject.mixin; +import java.util.ArrayDeque; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Queue; +import java.util.Set; + +import org.spongepowered.asm.mixin.transformer.ClassInfo; + import net.fabricmc.mapping.tree.ClassDef; import net.fabricmc.mapping.tree.Descriptored; import net.fabricmc.mapping.tree.TinyTree; import net.fabricmc.mapping.util.MixinRemapper; -import org.spongepowered.asm.mixin.transformer.ClassInfo; - -import java.util.*; public class MixinIntermediaryDevRemapper extends MixinRemapper { private static final String ambiguousName = ""; // dummy value for ambiguous mappings - needs querying with additional owner and/or desc info @@ -72,6 +79,7 @@ public class MixinIntermediaryDevRemapper extends MixinRemapper { private String mapMethodNameInner(String owner, String name, String desc) { String result = super.mapMethodName(owner, name, desc); + if (result.equals(name)) { String otherClass = unmap(owner); return super.mapMethodName(otherClass, name, unmapDesc(desc)); @@ -82,6 +90,7 @@ public class MixinIntermediaryDevRemapper extends MixinRemapper { private String mapFieldNameInner(String owner, String name, String desc) { String result = super.mapFieldName(owner, name, desc); + if (result.equals(name)) { String otherClass = unmap(owner); return super.mapFieldName(otherClass, name, unmapDesc(desc)); @@ -136,12 +145,14 @@ public class MixinIntermediaryDevRemapper extends MixinRemapper { ClassInfo c = classInfos.remove(); String ownerO = unmap(c.getName()); String s; + if (!(s = mapMethodNameInner(ownerO, name, desc)).equals(name)) { return s; } if (!c.getSuperName().startsWith("java/")) { ClassInfo cSuper = c.getSuperClass(); + if (cSuper != null) { classInfos.add(cSuper); } @@ -153,6 +164,7 @@ public class MixinIntermediaryDevRemapper extends MixinRemapper { } ClassInfo cItf = ClassInfo.forName(itf); + if (cItf != null) { classInfos.add(cItf); } @@ -200,6 +212,7 @@ public class MixinIntermediaryDevRemapper extends MixinRemapper { while (c != null) { String nextOwner = unmap(c.getName()); String s; + if (!(s = mapFieldNameInner(nextOwner, name, desc)).equals(name)) { return s; } diff --git a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java index 3edffd42..f6d1eeb9 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradleExtension.java +++ b/src/main/java/net/fabricmc/loom/LoomGradleExtension.java @@ -38,10 +38,7 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collectors; -import javax.annotation.Nullable; - import com.google.gson.JsonObject; -import net.fabricmc.loom.providers.*; import org.cadixdev.lorenz.MappingSet; import org.cadixdev.mercury.Mercury; import org.gradle.api.Project; @@ -49,13 +46,23 @@ import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.Dependency; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.plugins.BasePluginConvention; +import org.jetbrains.annotations.Nullable; import net.fabricmc.loom.api.decompilers.LoomDecompiler; -import net.fabricmc.loom.processors.JarProcessor; -import net.fabricmc.loom.processors.JarProcessorManager; +import net.fabricmc.loom.configuration.LoomDependencyManager; +import net.fabricmc.loom.configuration.processors.JarProcessor; +import net.fabricmc.loom.configuration.processors.JarProcessorManager; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeUniversalProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeUserdevProvider; +import net.fabricmc.loom.configuration.providers.forge.McpConfigProvider; +import net.fabricmc.loom.configuration.providers.forge.PatchProvider; +import net.fabricmc.loom.configuration.providers.forge.SrgProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.configuration.providers.mappings.MojangMappingsDependency; +import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.function.LazyBool; -import net.fabricmc.loom.util.LoomDependencyManager; -import net.fabricmc.loom.util.mappings.MojangMappingsDependency; public class LoomGradleExtension { private static final String FORGE_PROPERTY = "loom.forge"; @@ -117,32 +124,32 @@ public class LoomGradleExtension { public Mercury getOrCreateSrcMercuryCache(int id, Supplier factory) { return srcMercuryCache[id] != null ? srcMercuryCache[id] : (srcMercuryCache[id] = factory.get()); } - + public void addTaskBeforeRun(String task) { - synchronized(this.tasksBeforeRun) { + synchronized (this.tasksBeforeRun) { this.tasksBeforeRun.add(task); } } - + public List getTasksBeforeRun() { return tasksBeforeRun; } - + public void silentMojangMappingsLicense() { this.silentMojangMappingsLicense = true; } - + public boolean isSilentMojangMappingsLicenseEnabled() { return silentMojangMappingsLicense; } - + public Dependency officialMojangMappings() { return new MojangMappingsDependency(project, this); } public LoomGradleExtension(Project project) { this.project = project; - this.autoGenIDERuns = AbstractPlugin.isRootProject(project); + this.autoGenIDERuns = isRootProject(); this.unmappedMods = project.files(); this.forge = new LazyBool(() -> Boolean.parseBoolean(Objects.toString(project.findProperty(FORGE_PROPERTY)))); } @@ -162,8 +169,8 @@ public class LoomGradleExtension { @Deprecated public List getUnmappedMods() { return unmappedMods.getFiles().stream() - .map(File::toPath) - .collect(Collectors.toList()); + .map(File::toPath) + .collect(Collectors.toList()); } public ConfigurableFileCollection getUnmappedModCollection() { @@ -263,10 +270,8 @@ public class LoomGradleExtension { } public File getNativesDirectory() { - Object customNativesDir = project.getProperties().get("fabric.loom.natives.dir"); - - if (customNativesDir != null) { - return new File((String) customNativesDir); + if (project.hasProperty("fabric.loom.natives.dir")) { + return new File((String) project.property("fabric.loom.natives.dir")); } File natives = new File(getUserCache(), "natives/" + getMinecraftProvider().getMinecraftVersion()); @@ -308,7 +313,7 @@ public class LoomGradleExtension { Project p = this.project; T result; - while (!AbstractPlugin.isRootProject(p)) { + while (p != p.getRootProject()) { if ((result = projectTFunction.apply(p)) != null) { return result; } @@ -392,7 +397,7 @@ public class LoomGradleExtension { public McpConfigProvider getMcpConfigProvider() { return getDependencyManager().getProvider(McpConfigProvider.class); } - + public SrgProvider getSrgProvider() { return getDependencyManager().getProvider(SrgProvider.class); } @@ -428,11 +433,13 @@ public class LoomGradleExtension { public String getRefmapName() { if (refmapName == null || refmapName.isEmpty()) { String defaultRefmapName; + if (isRootProject()) { defaultRefmapName = project.getConvention().getPlugin(BasePluginConvention.class).getArchivesBaseName() + "-refmap.json"; } else { defaultRefmapName = project.getConvention().getPlugin(BasePluginConvention.class).getArchivesBaseName() + "-" + project.getPath().replaceFirst(":", "") + "-refmap.json"; } + project.getLogger().info("Could not find refmap definition, will be using default name: " + defaultRefmapName); refmapName = defaultRefmapName; } @@ -473,12 +480,12 @@ public class LoomGradleExtension { public boolean isForge() { return forge.getAsBoolean(); } - + public boolean shouldGenerateSrgTiny() { if (generateSrgTiny != null) { return generateSrgTiny; } - + return isForge(); } @@ -493,4 +500,8 @@ public class LoomGradleExtension { public Set getAllMixinMappings() { return Collections.unmodifiableSet(mixinMappings); } + + public List getDecompilers() { + return decompilers; + } } diff --git a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java index 735f2799..cac0b324 100644 --- a/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java +++ b/src/main/java/net/fabricmc/loom/LoomGradlePlugin.java @@ -24,118 +24,50 @@ package net.fabricmc.loom; -import java.io.File; -import java.util.Locale; - +import com.google.common.collect.ImmutableMap; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.tasks.TaskContainer; -import net.fabricmc.loom.api.decompilers.LoomDecompiler; -import net.fabricmc.loom.decompilers.cfr.FabricCFRDecompiler; -import net.fabricmc.loom.decompilers.fernflower.FabricFernFlowerDecompiler; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.task.CleanEclipseRunsTask; -import net.fabricmc.loom.task.CleanLoomBinaries; -import net.fabricmc.loom.task.CleanLoomMappings; -import net.fabricmc.loom.task.DownloadAssetsTask; -import net.fabricmc.loom.task.GenEclipseRunsTask; -import net.fabricmc.loom.task.GenIdeaProjectTask; -import net.fabricmc.loom.task.GenVsCodeProjectTask; -import net.fabricmc.loom.task.GenerateSourcesTask; -import net.fabricmc.loom.task.MigrateMappingsTask; -import net.fabricmc.loom.task.RemapJarTask; -import net.fabricmc.loom.task.RemapSourcesJarTask; -import net.fabricmc.loom.task.RunClientTask; -import net.fabricmc.loom.task.RunServerTask; +import net.fabricmc.loom.configuration.CompileConfiguration; +import net.fabricmc.loom.configuration.FabricApiExtension; +import net.fabricmc.loom.configuration.MavenPublication; +import net.fabricmc.loom.configuration.ide.IdeConfiguration; +import net.fabricmc.loom.configuration.providers.mappings.MappingsCache; +import net.fabricmc.loom.decompilers.DecompilerConfiguration; +import net.fabricmc.loom.task.LoomTasks; -public class LoomGradlePlugin extends AbstractPlugin { - public static File getMappedByproduct(Project project, String suffix) { - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - MappingsProvider mappingsProvider = extension.getMappingsProvider(); - File mappedJar = mappingsProvider.mappedProvider.getMappedJar(); - String path = mappedJar.getAbsolutePath(); - - if (!path.toLowerCase(Locale.ROOT).endsWith(".jar")) { - throw new RuntimeException("Invalid mapped JAR path: " + path); - } - - return new File(path.substring(0, path.length() - 4) + suffix); - } +public class LoomGradlePlugin implements Plugin { + public static boolean refreshDeps; + public static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); @Override - public void apply(Project target) { - super.apply(target); + public void apply(Project project) { + project.getLogger().lifecycle("Fabric Loom: " + LoomGradlePlugin.class.getPackage().getImplementationVersion()); - TaskContainer tasks = target.getTasks(); + refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); - tasks.register("cleanLoomBinaries", CleanLoomBinaries.class, t -> t.setDescription("Removes binary jars created by Loom.")); - tasks.register("cleanLoomMappings", CleanLoomMappings.class, t -> t.setDescription("Removes mappings downloaded by Loom.")); + if (refreshDeps) { + MappingsCache.INSTANCE.invalidate(); + project.getLogger().lifecycle("Refresh dependencies is in use, loom will be significantly slower."); + } - tasks.register("cleanLoom").configure(task -> { - task.setGroup("fabric"); - task.setDescription("Runs all Loom cleanup tasks."); - task.dependsOn(tasks.getByName("cleanLoomBinaries")); - task.dependsOn(tasks.getByName("cleanLoomMappings")); - }); + // Apply default plugins + project.apply(ImmutableMap.of("plugin", "java")); + project.apply(ImmutableMap.of("plugin", "eclipse")); + project.apply(ImmutableMap.of("plugin", "idea")); - tasks.register("migrateMappings", MigrateMappingsTask.class, t -> { - t.setDescription("Migrates mappings to a new version."); - t.getOutputs().upToDateWhen((o) -> false); - }); + // Setup extensions, loom shadows minecraft + project.getExtensions().create("minecraft", LoomGradleExtension.class, project); + project.getExtensions().add("loom", project.getExtensions().getByName("minecraft")); + project.getExtensions().create("fabricApi", FabricApiExtension.class, project); - tasks.register("remapJar", RemapJarTask.class, t -> { - t.setDescription("Remaps the built project jar to intermediary mappings."); - t.setGroup("fabric"); - }); - - tasks.register("downloadAssets", DownloadAssetsTask.class, t -> t.setDescription("Downloads required assets for Fabric.")); - - tasks.register("genIdeaWorkspace", GenIdeaProjectTask.class, t -> { - t.setDescription("Generates an IntelliJ IDEA workspace from this project."); - t.dependsOn("idea", "downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("genEclipseRuns", GenEclipseRunsTask.class, t -> { - t.setDescription("Generates Eclipse run configurations for this project."); - t.dependsOn("downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("cleanEclipseRuns", CleanEclipseRunsTask.class, t -> { - t.setDescription("Removes Eclipse run configurations for this project."); - t.setGroup("ide"); - }); - - tasks.register("vscode", GenVsCodeProjectTask.class, t -> { - t.setDescription("Generates VSCode launch configurations."); - t.dependsOn("downloadAssets"); - t.setGroup("ide"); - }); - - tasks.register("remapSourcesJar", RemapSourcesJarTask.class, t -> t.setDescription("Remaps the project sources jar to intermediary names.")); - - tasks.register("runClient", RunClientTask.class, t -> { - t.setDescription("Starts a development version of the Minecraft client."); - t.dependsOn("downloadAssets"); - t.setGroup("fabric"); - }); - - tasks.register("runServer", RunServerTask.class, t -> { - t.setDescription("Starts a development version of the Minecraft server."); - t.setGroup("fabric"); - }); - - LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); - extension.addDecompiler(new FabricFernFlowerDecompiler(project)); - extension.addDecompiler(new FabricCFRDecompiler(project)); - - project.afterEvaluate((p) -> { - for (LoomDecompiler decompiler : extension.decompilers) { - String taskName = (decompiler instanceof FabricFernFlowerDecompiler) ? "genSources" : "genSourcesWith" + decompiler.name(); - // decompiler will be passed to the constructor of GenerateSourcesTask - tasks.register(taskName, GenerateSourcesTask.class, decompiler); - } - }); + CompileConfiguration.setupConfigurations(project); + IdeConfiguration.setup(project); + CompileConfiguration.configureCompile(project); + MavenPublication.configure(project); + LoomTasks.registerTasks(project); + DecompilerConfiguration.setup(project); } } diff --git a/src/main/java/net/fabricmc/loom/util/JarRemapper.java b/src/main/java/net/fabricmc/loom/build/JarRemapper.java similarity index 91% rename from src/main/java/net/fabricmc/loom/util/JarRemapper.java rename to src/main/java/net/fabricmc/loom/build/JarRemapper.java index 2c5a83a1..fab51e2d 100644 --- a/src/main/java/net/fabricmc/loom/util/JarRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/JarRemapper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.IOException; import java.nio.file.Path; @@ -34,8 +34,10 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.BiFunction; +import org.gradle.api.Action; import org.objectweb.asm.commons.Remapper; +import net.fabricmc.loom.util.LoggerFilter; import net.fabricmc.stitch.util.Pair; import net.fabricmc.tinyremapper.IMappingProvider; import net.fabricmc.tinyremapper.InputTag; @@ -46,6 +48,7 @@ public class JarRemapper { private final List mappingProviders = new ArrayList<>(); private final Set classPath = new HashSet<>(); private final List remapData = new ArrayList<>(); + private List> remapOptions; public void addMappings(IMappingProvider mappingProvider) { mappingProviders.add(mappingProvider); @@ -66,6 +69,12 @@ public class JarRemapper { TinyRemapper.Builder remapperBuilder = TinyRemapper.newRemapper(); mappingProviders.forEach(remapperBuilder::withMappings); + if (remapOptions != null) { + for (Action remapOption : remapOptions) { + remapOption.execute(remapperBuilder); + } + } + TinyRemapper remapper = remapperBuilder.build(); Path[] remapClasspath = classPath.stream() @@ -103,6 +112,10 @@ public class JarRemapper { remapData.forEach(RemapData::complete); } + public void addOptions(List> remapOptions) { + this.remapOptions = remapOptions; + } + public static class RemapData { public final Path input; public final Path output; diff --git a/src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java similarity index 91% rename from src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java rename to src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java index a48cc2d8..dace6895 100644 --- a/src/main/java/net/fabricmc/loom/util/MixinRefmapHelper.java +++ b/src/main/java/net/fabricmc/loom/build/MixinRefmapHelper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; @@ -32,16 +32,14 @@ import java.util.HashSet; import java.util.Set; import java.util.zip.ZipEntry; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; -public final class MixinRefmapHelper { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); +import net.fabricmc.loom.LoomGradlePlugin; +public final class MixinRefmapHelper { private MixinRefmapHelper() { } public static boolean addRefmapName(String filename, String mixinVersion, Path outputPath) { @@ -52,7 +50,7 @@ public final class MixinRefmapHelper { return ZipUtil.transformEntries(output, mixinFilenames.stream().map((f) -> new ZipEntryTransformerEntry(f, new StringZipEntryTransformer("UTF-8") { @Override protected String transform(ZipEntry zipEntry, String input) throws IOException { - JsonObject json = GSON.fromJson(input, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); if (!json.has("refmap")) { json.addProperty("refmap", filename); @@ -62,7 +60,7 @@ public final class MixinRefmapHelper { json.addProperty("minVersion", mixinVersion); } - return GSON.toJson(json); + return LoomGradlePlugin.GSON.toJson(json); } })).toArray(ZipEntryTransformerEntry[]::new)); } else { @@ -78,7 +76,7 @@ public final class MixinRefmapHelper { if (!entry.isDirectory() && entry.getName().endsWith(".json") && !entry.getName().contains("/") && !entry.getName().contains("\\")) { // JSON file in root directory try (InputStreamReader inputStreamReader = new InputStreamReader(stream)) { - JsonObject json = GSON.fromJson(inputStreamReader, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(inputStreamReader, JsonObject.class); if (json != null) { boolean hasMixins = json.has("mixins") && json.get("mixins").isJsonArray(); diff --git a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java similarity index 80% rename from src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java rename to src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 607944c1..69cc71ee 100644 --- a/src/main/java/net/fabricmc/loom/util/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; @@ -45,9 +45,14 @@ import org.gradle.jvm.JvmLibrary; import org.gradle.language.base.artifact.SourcesArtifact; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.processors.dependency.ModDependencyInfo; -import net.fabricmc.loom.processors.dependency.RemapData; +import net.fabricmc.loom.configuration.RemappedConfigurationEntry; +import net.fabricmc.loom.configuration.mods.ModProcessor; +import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; +import net.fabricmc.loom.configuration.processors.dependency.RemapData; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.SourceRemapper; +@SuppressWarnings("UnstableApiUsage") public class ModCompileRemapper { public static void remapDependencies(Project project, String mappingsSuffix, LoomGradleExtension extension, SourceRemapper sourceRemapper) { Logger logger = project.getLogger(); @@ -71,16 +76,13 @@ public class ModCompileRemapper { String group = artifact.getModuleVersion().getId().getGroup(); String name = artifact.getModuleVersion().getId().getName(); String version = artifact.getModuleVersion().getId().getVersion(); - String classifierSuffix = artifact.getClassifier() == null ? "" : (":" + artifact.getClassifier()); if (!shouldRemapMod(logger, artifact, extension.isForge(), sourceConfig.getName())) { addToRegularCompile(project, regularConfig, artifact); continue; } - File sources = findSources(dependencies, artifact); - - ModDependencyInfo info = new ModDependencyInfo(group, name, version, classifierSuffix, artifact.getFile(), sources, remappedConfig, remapData); + ModDependencyInfo info = new ModDependencyInfo(group, name, version, artifact.getClassifier(), artifact.getFile(), remappedConfig, remapData); if (refreshDeps) { info.forceRemap(); @@ -88,24 +90,32 @@ public class ModCompileRemapper { modDependencies.add(info); - String remappedLog = group + ":" + name + ":" + version + classifierSuffix + " (" + mappingsSuffix + ")" + (info.requiresRemapping() ? " requires remapping" : " already remapped in " + info.getRemappedOutput().getAbsolutePath()); + String remappedLog = group + ":" + name + ":" + version + (artifact.getClassifier() == null ? "" : ":" + artifact.getClassifier()) + " (" + mappingsSuffix + ")" + (info.requiresRemapping() ? " requires remapping" : " already remapped in " + info.getRemappedOutput().getAbsolutePath()); project.getLogger().info(":providing " + remappedLog); - if (sources != null) { - scheduleSourcesRemapping(project, sourceRemapper, info.sourcesFile, info.getRemappedNotation(), info.getRemappedFilename(), modStore); + File remappedSources = info.getRemappedOutput("sources"); + + if (!remappedSources.exists() || refreshDeps) { + File sources = findSources(dependencies, artifact); + + if (sources != null) { + scheduleSourcesRemapping(project, sourceRemapper, sources, info.getRemappedNotation(), remappedSources); + } } } try { ModProcessor.processMods(project, modDependencies); } catch (IOException e) { + // Failed to remap, lets clean up to ensure we try again next time + modDependencies.forEach(info -> info.getRemappedOutput().delete()); throw new RuntimeException("Failed to remap mods", e); } // Add all of the remapped mods onto the config for (ModDependencyInfo info : modDependencies) { project.getLogger().info(":adding " + info.toString() + " into " + info.targetConfig.getName()); - project.getDependencies().add(info.targetConfig.getName(), project.getDependencies().module(info.getRemappedNotation())); + project.getDependencies().add(info.targetConfig.getName(), info.getRemappedNotation()); } } } @@ -122,6 +132,7 @@ public class ModCompileRemapper { logger.info("Found Forge mod in " + config + ": {}", artifact.getId()); return true; } + logger.lifecycle(":could not find forge mod in " + config + " but forcing: {}", artifact.getId()); return true; } else { @@ -151,8 +162,8 @@ public class ModCompileRemapper { } public static File findSources(DependencyHandler dependencies, ResolvedArtifact artifact) { - @SuppressWarnings("unchecked") ArtifactResolutionQuery query = dependencies.createArtifactResolutionQuery()// - .forComponents(artifact.getId().getComponentIdentifier())// + @SuppressWarnings("unchecked") ArtifactResolutionQuery query = dependencies.createArtifactResolutionQuery() + .forComponents(artifact.getId().getComponentIdentifier()) .withArtifacts(JvmLibrary.class, SourcesArtifact.class); for (ComponentArtifactsResult result : query.execute().getResolvedComponents()) { @@ -166,21 +177,13 @@ public class ModCompileRemapper { return null; } - private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, String remappedFilename, File modStore) { + private static void scheduleSourcesRemapping(Project project, SourceRemapper sourceRemapper, File sources, String remappedLog, File remappedSources) { project.getLogger().debug(":providing " + remappedLog + " sources"); - File remappedSources = new File(modStore, remappedFilename + "-sources.jar"); boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); if (!remappedSources.exists() || sources.lastModified() <= 0 || sources.lastModified() > remappedSources.lastModified() || refreshDeps) { - try { - sourceRemapper.scheduleRemapSources(sources, remappedSources); - - // Set the remapped sources creation date to match the sources if we're likely succeeded in making it - remappedSources.setLastModified(sources.lastModified()); - } catch (Exception e) { - e.printStackTrace(); - } + sourceRemapper.scheduleRemapSources(sources, remappedSources, false, true); // Depenedency sources are used in ide only so don't need to be reproducable } else { project.getLogger().info(remappedSources.getName() + " is up to date with " + sources.getName()); } diff --git a/src/main/java/net/fabricmc/loom/util/NestedJars.java b/src/main/java/net/fabricmc/loom/build/NestedJars.java similarity index 96% rename from src/main/java/net/fabricmc/loom/util/NestedJars.java rename to src/main/java/net/fabricmc/loom/build/NestedJars.java index 2d57c8c0..172efca9 100644 --- a/src/main/java/net/fabricmc/loom/util/NestedJars.java +++ b/src/main/java/net/fabricmc/loom/build/NestedJars.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.build; import java.io.File; import java.io.IOException; @@ -36,33 +36,31 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.zip.ZipEntry; -import com.google.gson.Gson; -import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import org.apache.commons.io.FileUtils; -import org.gradle.api.artifacts.ResolvedConfiguration; +import org.gradle.api.Project; +import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ResolvedDependency; import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.DependencySet; import org.gradle.api.artifacts.ProjectDependency; import org.gradle.api.artifacts.ResolvedArtifact; -import org.gradle.api.artifacts.DependencySet; +import org.gradle.api.artifacts.ResolvedConfiguration; +import org.gradle.api.artifacts.ResolvedDependency; +import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.zeroturnaround.zip.FileSource; import org.zeroturnaround.zip.ZipEntrySource; import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; -import org.gradle.api.Project; -import org.gradle.api.Task; -import org.gradle.api.tasks.bundling.AbstractArchiveTask; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.task.RemapJarTask; +import net.fabricmc.loom.util.Constants; public class NestedJars { - private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); - public static boolean addNestedJars(Project project, Path modJarPath) { List containedJars = getContainedJars(project); @@ -77,7 +75,7 @@ public class NestedJars { return ZipUtil.transformEntries(modJar, single(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { @Override protected String transform(ZipEntry zipEntry, String input) { - JsonObject json = GSON.fromJson(input, JsonObject.class); + JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); JsonArray nestedJars = json.getAsJsonArray("jars"); if (nestedJars == null || !json.has("jars")) { @@ -92,7 +90,7 @@ public class NestedJars { json.add("jars", nestedJars); - return GSON.toJson(json); + return LoomGradlePlugin.GSON.toJson(json); } }))); } @@ -228,7 +226,7 @@ public class NestedJars { custom.addProperty("fabric-loom:generated", true); jsonObject.add("custom", custom); - return GSON.toJson(jsonObject); + return LoomGradlePlugin.GSON.toJson(jsonObject); } private static ZipEntryTransformerEntry[] single(ZipEntryTransformerEntry element) { diff --git a/src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java similarity index 99% rename from src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java index 8feba505..02714ab2 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/AnnotationProcessorInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/AnnotationProcessorInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.io.IOException; diff --git a/src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java index 8ec52158..2e52d0d7 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/JavaApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/JavaApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.util.List; diff --git a/src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java similarity index 86% rename from src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java index 8d6d1d17..41d6d0ba 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/KaptApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/KaptApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; import java.io.IOException; @@ -35,9 +35,9 @@ import java.util.stream.Collectors; import kotlin.Unit; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.compile.JavaCompile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.gradle.internal.Kapt3KotlinGradleSubplugin; import org.jetbrains.kotlin.gradle.plugin.KaptExtension; import net.fabricmc.loom.LoomGradleExtension; @@ -92,10 +92,19 @@ public class KaptApInvoker extends AnnotationProcessorInvoker { // Kapt generates an AP configuration for every source set based off of the getKaptConfigurationName method. return AnnotationProcessorInvoker.getNonTestSourceSets(project) .map(sourceSet -> project.getConfigurations() - .getByName(Kapt3KotlinGradleSubplugin.Companion.getKaptConfigurationName(sourceSet.getName())) + .getByName(getKaptConfigurationName(sourceSet.getName())) ).collect(Collectors.toList()); } + // Pulled out from the internal class: https://github.com/JetBrains/kotlin/blob/33a0ec9b4f40f3d6f1f96b2db504ade4c2fafe03/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/internal/kapt/Kapt3KotlinGradleSubplugin.kt#L92 + private static String getKaptConfigurationName(String sourceSetName) { + if (!sourceSetName.equals(SourceSet.MAIN_SOURCE_SET_NAME)) { + return "kapt" + (sourceSetName.substring(0, 1).toUpperCase() + sourceSetName.substring(1)); + } + + return "kapt"; + } + @Override protected void passArgument(JavaCompile compileTask, String key, String value) { // Note: this MUST be run early on, before kapt uses this data, and there is only a point to setting the value once since diff --git a/src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java b/src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java rename to src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java index ba1ad823..7fed5610 100644 --- a/src/main/java/net/fabricmc/loom/util/mixin/ScalaApInvoker.java +++ b/src/main/java/net/fabricmc/loom/build/mixin/ScalaApInvoker.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.mixin; +package net.fabricmc.loom.build.mixin; import java.io.File; diff --git a/src/main/java/net/fabricmc/loom/AbstractPlugin.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java similarity index 63% rename from src/main/java/net/fabricmc/loom/AbstractPlugin.java rename to src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index b3923234..5123755e 100644 --- a/src/main/java/net/fabricmc/loom/AbstractPlugin.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -22,79 +22,59 @@ * SOFTWARE. */ -package net.fabricmc.loom; +package net.fabricmc.loom.configuration; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import com.google.common.collect.ImmutableMap; -import groovy.util.Node; -import net.fabricmc.loom.providers.*; -import net.fabricmc.loom.task.AbstractLoomTask; -import net.fabricmc.loom.task.RemapAllSourcesTask; -import net.fabricmc.loom.task.RemapJarTask; -import net.fabricmc.loom.task.RemapSourcesJarTask; -import net.fabricmc.loom.util.*; -import net.fabricmc.loom.util.mixin.JavaApInvoker; -import net.fabricmc.loom.util.mixin.KaptApInvoker; -import net.fabricmc.loom.util.mixin.ScalaApInvoker; -import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.UnknownTaskException; import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.Dependency; -import org.gradle.api.artifacts.ExcludeRule; -import org.gradle.api.artifacts.ModuleDependency; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.publish.Publication; -import org.gradle.api.publish.PublishingExtension; -import org.gradle.api.publish.maven.MavenPublication; import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.bundling.AbstractArchiveTask; import org.gradle.api.tasks.bundling.Jar; import org.gradle.api.tasks.javadoc.Javadoc; -import org.gradle.plugins.ide.idea.model.IdeaModel; -import java.io.IOException; -import java.util.*; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.build.JarRemapper; +import net.fabricmc.loom.build.NestedJars; +import net.fabricmc.loom.build.mixin.JavaApInvoker; +import net.fabricmc.loom.build.mixin.KaptApInvoker; +import net.fabricmc.loom.build.mixin.ScalaApInvoker; +import net.fabricmc.loom.configuration.ide.SetupIntelijRunConfigs; +import net.fabricmc.loom.configuration.providers.LaunchProvider; +import net.fabricmc.loom.configuration.providers.MinecraftProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeUniversalProvider; +import net.fabricmc.loom.configuration.providers.forge.ForgeUserdevProvider; +import net.fabricmc.loom.configuration.providers.forge.McpConfigProvider; +import net.fabricmc.loom.configuration.providers.forge.PatchProvider; +import net.fabricmc.loom.configuration.providers.forge.SrgProvider; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.task.AbstractLoomTask; +import net.fabricmc.loom.task.RemapAllSourcesTask; +import net.fabricmc.loom.task.RemapJarTask; +import net.fabricmc.loom.task.RemapSourcesJarTask; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.SourceRemapper; -public class AbstractPlugin implements Plugin { - protected Project project; - - public static boolean isRootProject(Project project) { - return project.getRootProject() == project; +/** + * Add Minecraft dependencies to compile time. + */ +public final class CompileConfiguration { + private CompileConfiguration() { } - private void extendsFrom(String a, String b) { - project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); - } - - @Override - public void apply(Project target) { - this.project = target; - - project.getLogger().lifecycle("Fabric Loom: " + AbstractPlugin.class.getPackage().getImplementationVersion()); - - boolean refreshDeps = project.getGradle().getStartParameter().isRefreshDependencies(); - DownloadUtil.refreshDeps = refreshDeps; - - if (refreshDeps) { - MappingsCache.INSTANCE.invalidate(); - project.getLogger().lifecycle("Refresh dependencies is in use, loom will be significantly slower."); - } - - // Apply default plugins - project.apply(ImmutableMap.of("plugin", "java")); - project.apply(ImmutableMap.of("plugin", "eclipse")); - project.apply(ImmutableMap.of("plugin", "idea")); - - project.getExtensions().create("minecraft", LoomGradleExtension.class, project); - project.getExtensions().add("loom", project.getExtensions().getByName("minecraft")); - project.getExtensions().create("fabricApi", FabricApiExtension.class, project); - + public static void setupConfigurations(Project project) { // Force add Mojang and Forge repositories - addMavenRepo(target, "Mojang", "https://libraries.minecraft.net/"); - addMavenRepo(target, "Forge", "https://files.minecraftforge.net/maven/"); + addMavenRepo(project, "Mojang", "https://libraries.minecraft.net/"); + addMavenRepo(project, "Forge", "https://files.minecraftforge.net/maven/"); Configuration modCompileClasspathConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MOD_COMPILE_CLASSPATH); modCompileClasspathConfig.setTransitive(true); @@ -105,6 +85,8 @@ public class AbstractPlugin implements Plugin { minecraftNamedConfig.setTransitive(false); // The launchers do not recurse dependencies Configuration minecraftDependenciesConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MINECRAFT_DEPENDENCIES); minecraftDependenciesConfig.setTransitive(false); + Configuration loaderDependenciesConfig = project.getConfigurations().maybeCreate(Constants.Configurations.LOADER_DEPENDENCIES); + loaderDependenciesConfig.setTransitive(false); Configuration minecraftConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MINECRAFT); minecraftConfig.setTransitive(false); @@ -129,7 +111,7 @@ public class AbstractPlugin implements Plugin { Configuration mcpConfig = project.getConfigurations().maybeCreate(Constants.Configurations.MCP_CONFIG); mcpConfig.setTransitive(false); - extendsFrom(Constants.Configurations.MINECRAFT_DEPENDENCIES, Constants.Configurations.FORGE_DEPENDENCIES); + extendsFrom(Constants.Configurations.MINECRAFT_DEPENDENCIES, Constants.Configurations.FORGE_DEPENDENCIES, project); } Configuration includeConfig = project.getConfigurations().maybeCreate(Constants.Configurations.INCLUDE); @@ -144,30 +126,23 @@ public class AbstractPlugin implements Plugin { Configuration compileModsMappedConfig = project.getConfigurations().maybeCreate(entry.getRemappedConfiguration()); compileModsMappedConfig.setTransitive(false); // Don't get transitive deps of already remapped mods - extendsFrom(entry.getTargetConfiguration(project.getConfigurations()), entry.getRemappedConfiguration()); + extendsFrom(entry.getTargetConfiguration(project.getConfigurations()), entry.getRemappedConfiguration(), project); if (entry.isOnModCompileClasspath()) { - extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.getSourceConfiguration()); - extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration()); + extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH, entry.getSourceConfiguration(), project); + extendsFrom(Constants.Configurations.MOD_COMPILE_CLASSPATH_MAPPED, entry.getRemappedConfiguration(), project); } } - extendsFrom("compileClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("runtimeClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("testCompileClasspath", Constants.Configurations.MINECRAFT_NAMED); - extendsFrom("testRuntimeClasspath", Constants.Configurations.MINECRAFT_NAMED); + extendsFrom(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.TEST_COMPILE_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); + extendsFrom(JavaPlugin.TEST_RUNTIME_CLASSPATH_CONFIGURATION_NAME, Constants.Configurations.MINECRAFT_NAMED, project); - extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.MINECRAFT_DEPENDENCIES); + extendsFrom(Constants.Configurations.LOADER_DEPENDENCIES, Constants.Configurations.MINECRAFT_DEPENDENCIES, project); + extendsFrom(Constants.Configurations.MINECRAFT_NAMED, Constants.Configurations.LOADER_DEPENDENCIES, project); - extendsFrom("compile", Constants.Configurations.MAPPINGS_FINAL); - - configureIDEs(); - configureCompile(); - configureMaven(); - } - - public Project getProject() { - return project; + extendsFrom(JavaPlugin.COMPILE_CONFIGURATION_NAME, Constants.Configurations.MAPPINGS_FINAL, project); } /** @@ -178,30 +153,14 @@ public class AbstractPlugin implements Plugin { * @param url The URL of the repository * @return An object containing the name and the URL of the repository that can be modified later */ - public MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) { + public static MavenArtifactRepository addMavenRepo(Project target, final String name, final String url) { return target.getRepositories().maven(repo -> { repo.setName(name); repo.setUrl(url); }); } - /** - * Add Minecraft dependencies to IDE dependencies. - */ - protected void configureIDEs() { - // IDEA - IdeaModel ideaModel = (IdeaModel) project.getExtensions().getByName("idea"); - - ideaModel.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles()); - ideaModel.getModule().setDownloadJavadoc(true); - ideaModel.getModule().setDownloadSources(true); - ideaModel.getModule().setInheritOutputDirs(true); - } - - /** - * Add Minecraft dependencies to compile time. - */ - protected void configureCompile() { + public static void configureCompile(Project project) { JavaPluginConvention javaModule = (JavaPluginConvention) project.getConvention().getPlugins().get("java"); SourceSet main = javaModule.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); @@ -217,9 +176,9 @@ public class AbstractPlugin implements Plugin { flatDirectoryArtifactRepository.setName("UserLocalCacheFiles"); }); - project1.getRepositories().flatDir(flatDirectoryArtifactRepository -> { - flatDirectoryArtifactRepository.dir(extension.getRemappedModCache()); - flatDirectoryArtifactRepository.setName("UserLocalRemappedMods"); + project1.getRepositories().maven(mavenArtifactRepository -> { + mavenArtifactRepository.setUrl(extension.getRemappedModCache()); + mavenArtifactRepository.setName("UserLocalRemappedMods"); }); project1.getRepositories().maven(mavenArtifactRepository -> { @@ -238,30 +197,29 @@ public class AbstractPlugin implements Plugin { }); project1.getRepositories().mavenCentral(); - project1.getRepositories().jcenter(); LoomDependencyManager dependencyManager = new LoomDependencyManager(); extension.setDependencyManager(dependencyManager); - dependencyManager.addProvider(new MinecraftProvider(getProject())); + dependencyManager.addProvider(new MinecraftProvider(project)); if (extension.isForge()) { - dependencyManager.addProvider(new ForgeProvider(getProject())); - dependencyManager.addProvider(new ForgeUserdevProvider(getProject())); + dependencyManager.addProvider(new ForgeProvider(project)); + dependencyManager.addProvider(new ForgeUserdevProvider(project)); } if (extension.shouldGenerateSrgTiny()) { - dependencyManager.addProvider(new SrgProvider(getProject())); + dependencyManager.addProvider(new SrgProvider(project)); } if (extension.isForge()) { - dependencyManager.addProvider(new McpConfigProvider(getProject())); - dependencyManager.addProvider(new PatchProvider(getProject())); - dependencyManager.addProvider(new ForgeUniversalProvider(getProject())); + dependencyManager.addProvider(new McpConfigProvider(project)); + dependencyManager.addProvider(new PatchProvider(project)); + dependencyManager.addProvider(new ForgeUniversalProvider(project)); } - - dependencyManager.addProvider(new MappingsProvider(getProject())); - dependencyManager.addProvider(new LaunchProvider(getProject())); + + dependencyManager.addProvider(new MappingsProvider(project)); + dependencyManager.addProvider(new LaunchProvider(project)); dependencyManager.handleDependencies(project1); @@ -290,12 +248,15 @@ public class AbstractPlugin implements Plugin { remapJarTask.getToM().set("srg"); ((Jar) jarTask).manifest(manifest -> { List configs = new ArrayList<>(); + if (extension.mixinConfig != null) { configs.add(extension.mixinConfig); } + if (extension.mixinConfigs != null) { configs.addAll(extension.mixinConfigs); } + manifest.attributes(ImmutableMap.of("MixinConfigs", String.join(",", configs))); }); } @@ -308,18 +269,11 @@ public class AbstractPlugin implements Plugin { remapJarTask.dependsOn(jarTask); project1.getTasks().getByName("build").dependsOn(remapJarTask); - Map> taskMap = project.getAllTasks(true); - - for (Map.Entry> entry : taskMap.entrySet()) { - Set taskSet = entry.getValue(); - - for (Task task : taskSet) { - if (task instanceof RemapJarTask && ((RemapJarTask) task).getAddNestedDependencies().getOrElse(false)) { - //Run all the sub project remap jars tasks before the root projects jar, this is to allow us to include projects - NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); - } + project.getTasks().withType(RemapJarTask.class).forEach(task -> { + if (task.getAddNestedDependencies().getOrElse(false)) { + NestedJars.getRequiredTasks(project1).forEach(task::dependsOn); } - } + }); SourceRemapper remapper = null; Task parentTask = project1.getTasks().getByName("build"); @@ -407,66 +361,7 @@ public class AbstractPlugin implements Plugin { } } - protected void configureMaven() { - project.afterEvaluate((p) -> { - for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { - if (!entry.hasMavenScope()) { - continue; - } - - Configuration compileModsConfig = p.getConfigurations().getByName(entry.getSourceConfiguration()); - - // add modsCompile to maven-publish - PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class); - - if (mavenPublish != null) { - mavenPublish.publications((publications) -> { - for (Publication publication : publications) { - if (publication instanceof MavenPublication) { - ((MavenPublication) publication).pom((pom) -> pom.withXml((xml) -> { - Node dependencies = GroovyXmlUtil.getOrCreateNode(xml.asNode(), "dependencies"); - Set foundArtifacts = new HashSet<>(); - - GroovyXmlUtil.childrenNodesStream(dependencies).filter((n) -> "dependency".equals(n.name())).forEach((n) -> { - Optional groupId = GroovyXmlUtil.getNode(n, "groupId"); - Optional artifactId = GroovyXmlUtil.getNode(n, "artifactId"); - - if (groupId.isPresent() && artifactId.isPresent()) { - foundArtifacts.add(groupId.get().text() + ":" + artifactId.get().text()); - } - }); - - for (Dependency dependency : compileModsConfig.getAllDependencies()) { - if (foundArtifacts.contains(dependency.getGroup() + ":" + dependency.getName())) { - continue; - } - - Node depNode = dependencies.appendNode("dependency"); - depNode.appendNode("groupId", dependency.getGroup()); - depNode.appendNode("artifactId", dependency.getName()); - depNode.appendNode("version", dependency.getVersion()); - depNode.appendNode("scope", entry.getMavenScope()); - - if (dependency instanceof ModuleDependency) { - final Set exclusions = ((ModuleDependency) dependency).getExcludeRules(); - - if (!exclusions.isEmpty()) { - Node exclusionsNode = depNode.appendNode("exclusions"); - - for (ExcludeRule rule : exclusions) { - Node exclusionNode = exclusionsNode.appendNode("exclusion"); - exclusionNode.appendNode("groupId", rule.getGroup() == null ? "*" : rule.getGroup()); - exclusionNode.appendNode("artifactId", rule.getModule() == null ? "*" : rule.getModule()); - } - } - } - } - })); - } - } - }); - } - } - }); + private static void extendsFrom(String a, String b, Project project) { + project.getConfigurations().getByName(a).extendsFrom(project.getConfigurations().getByName(b)); } } diff --git a/src/main/java/net/fabricmc/loom/util/DependencyProvider.java b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java similarity index 96% rename from src/main/java/net/fabricmc/loom/util/DependencyProvider.java rename to src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java index 536fafb9..9d12f01e 100644 --- a/src/main/java/net/fabricmc/loom/util/DependencyProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/DependencyProvider.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.nio.charset.StandardCharsets; @@ -100,6 +100,8 @@ public abstract class DependencyProvider { final Dependency dependency; final Configuration sourceConfiguration; + private String resolvedVersion = null; + public static DependencyInfo create(Project project, Dependency dependency, Configuration sourceConfiguration) { if (dependency instanceof SelfResolvingDependency) { return new FileDependencyInfo(project, (SelfResolvingDependency) dependency, sourceConfiguration); @@ -119,13 +121,19 @@ public abstract class DependencyProvider { } public String getResolvedVersion() { + if (resolvedVersion != null) { + return resolvedVersion; + } + for (ResolvedDependency rd : sourceConfiguration.getResolvedConfiguration().getFirstLevelModuleDependencies()) { if (rd.getModuleGroup().equals(dependency.getGroup()) && rd.getModuleName().equals(dependency.getName())) { - return rd.getModuleVersion(); + resolvedVersion = rd.getModuleVersion(); + return resolvedVersion; } } - return dependency.getVersion(); + resolvedVersion = dependency.getVersion(); + return resolvedVersion; } public Configuration getSourceConfiguration() { diff --git a/src/main/java/net/fabricmc/loom/util/FabricApiExtension.java b/src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/FabricApiExtension.java rename to src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java index 71cf0e62..a09262cd 100644 --- a/src/main/java/net/fabricmc/loom/util/FabricApiExtension.java +++ b/src/main/java/net/fabricmc/loom/configuration/FabricApiExtension.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.io.IOException; @@ -40,6 +40,7 @@ import org.w3c.dom.Element; import org.w3c.dom.NodeList; import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.DownloadUtil; public class FabricApiExtension { private final Project project; diff --git a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java similarity index 88% rename from src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java rename to src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java index f660b335..920b5982 100644 --- a/src/main/java/net/fabricmc/loom/util/LoomDependencyManager.java +++ b/src/main/java/net/fabricmc/loom/configuration/LoomDependencyManager.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import java.io.File; import java.util.ArrayList; @@ -39,8 +39,12 @@ import org.gradle.api.artifacts.ExternalModuleDependency; import org.gradle.api.artifacts.repositories.MavenArtifactRepository; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MappingsProvider; -import net.fabricmc.loom.util.DependencyProvider.DependencyInfo; +import net.fabricmc.loom.build.ModCompileRemapper; +import net.fabricmc.loom.configuration.DependencyProvider.DependencyInfo; +import net.fabricmc.loom.configuration.mods.ModProcessor; +import net.fabricmc.loom.configuration.providers.mappings.MappingsProvider; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.SourceRemapper; public class LoomDependencyManager { private static class ProviderList { @@ -54,7 +58,7 @@ public class LoomDependencyManager { private final List dependencyProviderList = new ArrayList<>(); - public void addProvider(DependencyProvider provider) { + public T addProvider(T provider) { if (dependencyProviderList.contains(provider)) { throw new RuntimeException("Provider is already registered"); } @@ -65,6 +69,7 @@ public class LoomDependencyManager { provider.register(this); dependencyProviderList.add(provider); + return provider; } public T getProvider(Class clazz) { @@ -82,7 +87,7 @@ public class LoomDependencyManager { MappingsProvider mappingsProvider = null; - project.getLogger().lifecycle(":setting up loom dependencies"); + project.getLogger().info(":setting up loom dependencies"); LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); Map providerListMap = new HashMap<>(); List targetProviders = new ArrayList<>(); @@ -133,9 +138,7 @@ public class LoomDependencyManager { SourceRemapper sourceRemapper = new SourceRemapper(project, true); String platformSuffix = extension.isForge() ? "_forge" : ""; - String mappingsKey = mappingsProvider.mappingsName + "." + mappingsProvider.minecraftVersion.replace(' ', '_').replace('.', '_').replace('-', '_') + platformSuffix + "." + mappingsProvider.mappingsVersion; - - ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); + String mappingsKey = mappingsProvider.getMappingsKey(); if (extension.getInstallerJson() == null) { //If we've not found the installer JSON we've probably skipped remapping Fabric loader, let's go looking @@ -153,16 +156,17 @@ public class LoomDependencyManager { project.getLogger().info("Found installer JSON in " + input); extension.setInstallerJson(jsonObject); + handleInstallerJson(extension.getInstallerJson(), project); } } } - if (extension.getInstallerJson() != null) { - handleInstallerJson(extension.getInstallerJson(), project); - } else if (!extension.isForge()) { + if (extension.getInstallerJson() == null && !extension.isForge()) { project.getLogger().warn("fabric-installer.json not found in classpath!"); } + ModCompileRemapper.remapDependencies(project, mappingsKey, extension, sourceRemapper); + sourceRemapper.remapAll(); for (Runnable runnable : afterTasks) { @@ -174,7 +178,7 @@ public class LoomDependencyManager { LoomGradleExtension extension = project.getExtensions().getByType(LoomGradleExtension.class); JsonObject libraries = jsonObject.get("libraries").getAsJsonObject(); - Configuration mcDepsConfig = project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES); + Configuration loaderDepsConfig = project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES); Configuration apDepsConfig = project.getConfigurations().getByName("annotationProcessor"); libraries.get("common").getAsJsonArray().forEach(jsonElement -> { @@ -182,7 +186,7 @@ public class LoomDependencyManager { ExternalModuleDependency modDep = (ExternalModuleDependency) project.getDependencies().create(name); modDep.setTransitive(false); - mcDepsConfig.getDependencies().add(modDep); + loaderDepsConfig.getDependencies().add(modDep); if (!extension.ideSync()) { apDepsConfig.getDependencies().add(modDep); diff --git a/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java b/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java new file mode 100644 index 00000000..92acad95 --- /dev/null +++ b/src/main/java/net/fabricmc/loom/configuration/MavenPublication.java @@ -0,0 +1,119 @@ +/* + * This file is part of fabric-loom, licensed under the MIT License (MIT). + * + * Copyright (c) 2016, 2017, 2018 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; + +import java.util.HashSet; +import java.util.Optional; +import java.util.Set; + +import groovy.util.Node; +import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.ExcludeRule; +import org.gradle.api.artifacts.ModuleDependency; +import org.gradle.api.publish.Publication; +import org.gradle.api.publish.PublishingExtension; + +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.GroovyXmlUtil; + +public final class MavenPublication { + private MavenPublication() { + } + + public static void configure(Project project) { + project.afterEvaluate((p) -> { + for (RemappedConfigurationEntry entry : Constants.MOD_COMPILE_ENTRIES) { + if (!entry.hasMavenScope()) { + continue; + } + + Configuration compileModsConfig = p.getConfigurations().getByName(entry.getSourceConfiguration()); + + // add modsCompile to maven-publish + PublishingExtension mavenPublish = p.getExtensions().findByType(PublishingExtension.class); + + if (mavenPublish != null) { + processEntry(entry, compileModsConfig, mavenPublish); + } + } + }); + } + + private static void processEntry(RemappedConfigurationEntry entry, Configuration compileModsConfig, PublishingExtension mavenPublish) { + mavenPublish.publications((publications) -> { + for (Publication publication : publications) { + if (!(publication instanceof org.gradle.api.publish.maven.MavenPublication)) { + continue; + } + + ((org.gradle.api.publish.maven.MavenPublication) publication).pom((pom) -> pom.withXml((xml) -> { + Node dependencies = GroovyXmlUtil.getOrCreateNode(xml.asNode(), "dependencies"); + Set foundArtifacts = new HashSet<>(); + + GroovyXmlUtil.childrenNodesStream(dependencies).filter((n) -> "dependency".equals(n.name())).forEach((n) -> { + Optional groupId = GroovyXmlUtil.getNode(n, "groupId"); + Optional artifactId = GroovyXmlUtil.getNode(n, "artifactId"); + + if (groupId.isPresent() && artifactId.isPresent()) { + foundArtifacts.add(groupId.get().text() + ":" + artifactId.get().text()); + } + }); + + for (Dependency dependency : compileModsConfig.getAllDependencies()) { + if (foundArtifacts.contains(dependency.getGroup() + ":" + dependency.getName())) { + continue; + } + + Node depNode = dependencies.appendNode("dependency"); + depNode.appendNode("groupId", dependency.getGroup()); + depNode.appendNode("artifactId", dependency.getName()); + depNode.appendNode("version", dependency.getVersion()); + depNode.appendNode("scope", entry.getMavenScope()); + + if (!(dependency instanceof ModuleDependency)) { + continue; + } + + final Set exclusions = ((ModuleDependency) dependency).getExcludeRules(); + + if (exclusions.isEmpty()) { + continue; + } + + Node exclusionsNode = depNode.appendNode("exclusions"); + + for (ExcludeRule rule : exclusions) { + Node exclusionNode = exclusionsNode.appendNode("exclusion"); + exclusionNode.appendNode("groupId", rule.getGroup() == null ? "*" : rule.getGroup()); + exclusionNode.appendNode("artifactId", rule.getModule() == null ? "*" : rule.getModule()); + } + } + })); + } + }); + } +} diff --git a/src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java b/src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java rename to src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java index 767c3a85..2b0949d5 100644 --- a/src/main/java/net/fabricmc/loom/util/RemappedConfigurationEntry.java +++ b/src/main/java/net/fabricmc/loom/configuration/RemappedConfigurationEntry.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration; import org.gradle.api.artifacts.ConfigurationContainer; diff --git a/src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java similarity index 98% rename from src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java rename to src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java index 6258e374..9ce530b8 100644 --- a/src/main/java/net/fabricmc/loom/util/accesswidener/AccessWidenerJarProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/accesswidener/AccessWidenerJarProcessor.java @@ -22,7 +22,7 @@ * SOFTWARE. */ -package net.fabricmc.loom.util.accesswidener; +package net.fabricmc.loom.configuration.accesswidener; import java.io.BufferedReader; import java.io.File; @@ -48,14 +48,14 @@ import org.zeroturnaround.zip.transform.ZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; import net.fabricmc.accesswidener.AccessWidener; -import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerReader; +import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerVisitor; import net.fabricmc.accesswidener.AccessWidenerWriter; import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.processors.JarProcessor; -import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.configuration.processors.JarProcessor; import net.fabricmc.loom.util.Checksum; +import net.fabricmc.loom.util.Constants; import net.fabricmc.tinyremapper.TinyRemapper; public class AccessWidenerJarProcessor implements JarProcessor { diff --git a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java b/src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java similarity index 50% rename from src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java rename to src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java index 2981a6ec..364981c1 100644 --- a/src/main/java/net/fabricmc/loom/task/CleanLoomBinaries.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/IdeConfiguration.java @@ -22,40 +22,21 @@ * SOFTWARE. */ -package net.fabricmc.loom.task; +package net.fabricmc.loom.configuration.ide; -import net.fabricmc.loom.LoomGradleExtension; -import net.fabricmc.loom.providers.MinecraftPatchedProvider; -import org.apache.commons.io.FileUtils; -import org.gradle.api.tasks.TaskAction; +import org.gradle.api.Project; +import org.gradle.plugins.ide.idea.model.IdeaModel; -import java.io.File; -import java.io.IOException; -import java.util.Optional; +public final class IdeConfiguration { + private IdeConfiguration() { + } -public class CleanLoomBinaries extends AbstractLoomTask { - @TaskAction - public void run() { - LoomGradleExtension extension = getExtension(); - extension.getMinecraftProvider().getMergedJar().delete(); - extension.getMinecraftMappedProvider().getIntermediaryJar().delete(); - extension.getMinecraftMappedProvider().getMappedJar().delete(); - Optional.ofNullable(extension.getMinecraftMappedProvider().getSrgJar()).ifPresent(File::delete); - if (extension.isForge()) { - try { - MinecraftPatchedProvider provider = new MinecraftPatchedProvider(extension.getMappingsProvider(), getProject()); - provider.initFiles(); - provider.cleanAllCache(); - } catch (IOException e) { - e.printStackTrace(); - } - } + public static void setup(Project project) { + IdeaModel ideaModel = (IdeaModel) project.getExtensions().getByName("idea"); - try { - FileUtils.deleteDirectory(extension.getNativesDirectory()); - FileUtils.deleteDirectory(extension.getNativesJarStore()); - } catch (IOException e) { - e.printStackTrace(); - } + ideaModel.getModule().getExcludeDirs().addAll(project.files(".gradle", "build", ".idea", "out").getFiles()); + ideaModel.getModule().setDownloadJavadoc(true); + ideaModel.getModule().setDownloadSources(true); + ideaModel.getModule().setInheritOutputDirs(true); } } diff --git a/src/main/java/net/fabricmc/loom/util/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java similarity index 95% rename from src/main/java/net/fabricmc/loom/util/RunConfig.java rename to src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java index 93ce61b5..8553b18a 100644 --- a/src/main/java/net/fabricmc/loom/util/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java @@ -22,14 +22,26 @@ * SOFTWARE. */ -package net.fabricmc.loom.util; +package net.fabricmc.loom.configuration.ide; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import net.fabricmc.loom.LoomGradleExtension; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.gradle.api.Project; @@ -40,16 +52,9 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -import static net.fabricmc.loom.AbstractPlugin.isRootProject; +import net.fabricmc.loom.LoomGradleExtension; +import net.fabricmc.loom.util.Constants; +import net.fabricmc.loom.util.OperatingSystem; public class RunConfig { public String configName; @@ -85,11 +90,12 @@ public class RunConfig { this.addXml(envs, "env", ImmutableMap.of("name", envEntry.getKey(), "value", envEntry.getValue())); } } - + if (!tasksBeforeRun.isEmpty()) { Element methodElement = this.addXml(root, "method", ImmutableMap.of("v", "2")); - + this.addXml(methodElement, "option", ImmutableMap.of("name", "Make", "enabled", "true")); + for (String s : tasksBeforeRun) { String project = s.substring(0, s.lastIndexOf(':')); String task = s.substring(s.lastIndexOf(':') + 1); @@ -103,7 +109,7 @@ public class RunConfig { .build()); } } - + return root; } @@ -135,7 +141,7 @@ public class RunConfig { } private static void populate(Project project, LoomGradleExtension extension, RunConfig runConfig, String mode) { - runConfig.configName += isRootProject(project) ? "" : " (" + project.getPath() + ")"; + runConfig.configName += extension.isRootProject() ? "" : " (" + project.getPath() + ")"; runConfig.eclipseProjectName = project.getExtensions().getByType(EclipseModel.class).getProject().getName(); runConfig.ideaModuleName = getIdeaModuleName(project); runConfig.runDir = "file://$PROJECT_DIR$/" + extension.runDir; @@ -143,10 +149,9 @@ public class RunConfig { if ("launchwrapper".equals(extension.getLoaderLaunchMethod())) { runConfig.mainClass = "net.minecraft.launchwrapper.Launch"; - runConfig.programArgs = "--tweakClass " + ("client".equals(mode) ? Constants.LaunchWrapper.DEFAULT_FABRIC_CLIENT_TWEAKER : Constants.LaunchWrapper.DEFAULT_FABRIC_SERVER_TWEAKER); + runConfig.programArgs += "--tweakClass " + ("client".equals(mode) ? Constants.LaunchWrapper.DEFAULT_FABRIC_CLIENT_TWEAKER : Constants.LaunchWrapper.DEFAULT_FABRIC_SERVER_TWEAKER); } else { runConfig.mainClass = "net.fabricmc.devlaunchinjector.Main"; - runConfig.programArgs = ""; runConfig.vmArgs = "-Dfabric.dli.config=" + encodeEscaped(extension.getDevLauncherConfig().getAbsolutePath()) + " -Dfabric.dli.env=" + mode.toLowerCase(); } @@ -198,6 +203,7 @@ public class RunConfig { RunConfig ideaClient = new RunConfig(); ideaClient.configName = "Minecraft Client"; + ideaClient.programArgs = ""; populate(project, extension, ideaClient, "client"); ideaClient.vmArgs += getOSClientJVMArgs(); ideaClient.vmArgs += " -Dfabric.dli.main=" + getMainClass("client", extension); @@ -211,6 +217,7 @@ public class RunConfig { RunConfig ideaServer = new RunConfig(); ideaServer.configName = "Minecraft Server"; + ideaServer.programArgs = "nogui "; populate(project, extension, ideaServer, "server"); ideaServer.vmArgs += " -Dfabric.dli.main=" + getMainClass("server", extension); ideaServer.tasksBeforeRun = new ArrayList<>(extension.getTasksBeforeRun()); @@ -256,13 +263,15 @@ public class RunConfig { } dummyConfig = dummyConfig.replace("%ENVS%", envs); - + StringBuilder tasksToRun = new StringBuilder(); + for (String s : tasksBeforeRun) { String project = s.substring(0, s.lastIndexOf(':')); String task = s.substring(s.lastIndexOf(':') + 1); tasksToRun.append("