From b2228e3175653beb3d5c3c2c382140e29797bd5c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Tue, 9 Nov 2021 22:07:43 +0000 Subject: [PATCH 1/5] Fix unobfuscated names not having params or docs. (#532) --- .../mappings/MappingsProviderImpl.java | 40 +++++-------------- .../loom/util/RecordComponentFixVisitor.java | 4 +- .../loom/test/LoomTestConstants.groovy | 2 +- .../projects/java16/gradle.properties | 8 ++-- 4 files changed, 18 insertions(+), 36 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java index 09ffb377..6b5c4694 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java @@ -73,8 +73,6 @@ import net.fabricmc.mappingio.tree.MappingTree; import net.fabricmc.mappingio.tree.MemoryMappingTree; import net.fabricmc.stitch.Command; import net.fabricmc.stitch.commands.CommandProposeFieldNames; -import net.fabricmc.stitch.commands.tinyv2.CommandMergeTinyV2; -import net.fabricmc.stitch.commands.tinyv2.CommandReorderTinyV2; public class MappingsProviderImpl extends DependencyProvider implements MappingsProvider { public MinecraftMappedProvider mappedProvider; @@ -312,18 +310,22 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings Stopwatch stopwatch = Stopwatch.createStarted(); project.getLogger().info(":merging mappings"); - MemoryMappingTree tree = new MemoryMappingTree(); - MappingSourceNsSwitch sourceNsSwitch = new MappingSourceNsSwitch(tree, MappingsNamespace.OFFICIAL.toString()); - readIntermediaryTree().accept(sourceNsSwitch); + MemoryMappingTree intermediaryTree = new MemoryMappingTree(); + readIntermediaryTree().accept(new MappingSourceNsSwitch(intermediaryTree, MappingsNamespace.INTERMEDIARY.toString())); try (BufferedReader reader = Files.newBufferedReader(from, StandardCharsets.UTF_8)) { - Tiny2Reader.read(reader, tree); + Tiny2Reader.read(reader, intermediaryTree); } - inheritMappedNamesOfEnclosingClasses(tree); + MemoryMappingTree officialTree = new MemoryMappingTree(); + MappingNsCompleter nsCompleter = new MappingNsCompleter(officialTree, Map.of(MappingsNamespace.OFFICIAL.toString(), MappingsNamespace.INTERMEDIARY.toString())); + MappingSourceNsSwitch nsSwitch = new MappingSourceNsSwitch(nsCompleter, MappingsNamespace.OFFICIAL.toString()); + intermediaryTree.accept(nsSwitch); + + inheritMappedNamesOfEnclosingClasses(officialTree); try (Tiny2Writer writer = new Tiny2Writer(Files.newBufferedWriter(out, StandardCharsets.UTF_8), false)) { - tree.accept(writer); + officialTree.accept(writer); } project.getLogger().info(":merged mappings in " + stopwatch.stop()); @@ -374,28 +376,6 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings return tree; } - private void reorderMappings(Path oldMappings, Path newMappings, String... newOrder) { - Command command = new CommandReorderTinyV2(); - String[] args = new String[2 + newOrder.length]; - args[0] = oldMappings.toAbsolutePath().toString(); - args[1] = newMappings.toAbsolutePath().toString(); - System.arraycopy(newOrder, 0, args, 2, newOrder.length); - runCommand(command, args); - } - - private void mergeMappings(Path intermediaryMappings, Path yarnMappings, Path newMergedMappings) { - try { - Command command = new CommandMergeTinyV2(); - runCommand(command, intermediaryMappings.toAbsolutePath().toString(), - yarnMappings.toAbsolutePath().toString(), - newMergedMappings.toAbsolutePath().toString(), - MappingsNamespace.INTERMEDIARY.toString(), MappingsNamespace.OFFICIAL.toString()); - } catch (Exception e) { - throw new RuntimeException("Could not merge mappings from " + intermediaryMappings.toString() - + " with mappings from " + yarnMappings, e); - } - } - private void suggestFieldNames(MinecraftProviderImpl minecraftProvider, Path oldMappings, Path newMappings) { Command command = new CommandProposeFieldNames(); runCommand(command, minecraftProvider.getMergedJar().getAbsolutePath(), diff --git a/src/main/java/net/fabricmc/loom/util/RecordComponentFixVisitor.java b/src/main/java/net/fabricmc/loom/util/RecordComponentFixVisitor.java index 14b26e20..fecab246 100644 --- a/src/main/java/net/fabricmc/loom/util/RecordComponentFixVisitor.java +++ b/src/main/java/net/fabricmc/loom/util/RecordComponentFixVisitor.java @@ -24,6 +24,8 @@ package net.fabricmc.loom.util; +import java.util.Objects; + import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.RecordComponentVisitor; @@ -60,7 +62,7 @@ public class RecordComponentFixVisitor extends ClassVisitor { @Override public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { - String intermediaryName = mappings.getField(owner, name, descriptor).getName(intermediaryNsId); + String intermediaryName = Objects.requireNonNull(mappings.getField(owner, name, descriptor), "Could not get field for %s:%s%s".formatted(owner, name, descriptor)).getName(intermediaryNsId); if (!hasExistingComponents && intermediaryName != null && intermediaryName.startsWith("comp_")) { super.visitRecordComponent(name, descriptor, signature); diff --git a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy index 5329c9fe..643cee8d 100644 --- a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy @@ -28,7 +28,7 @@ import org.gradle.util.GradleVersion class LoomTestConstants { public final static String DEFAULT_GRADLE = GradleVersion.current().getVersion() - public final static String PRE_RELEASE_GRADLE = "7.4-20211023222429+0000" + public final static String PRE_RELEASE_GRADLE = "7.4-20211108233000+0000" public final static String[] STANDARD_TEST_VERSIONS = [DEFAULT_GRADLE, PRE_RELEASE_GRADLE] } diff --git a/src/test/resources/projects/java16/gradle.properties b/src/test/resources/projects/java16/gradle.properties index 753673c4..24d25281 100644 --- a/src/test/resources/projects/java16/gradle.properties +++ b/src/test/resources/projects/java16/gradle.properties @@ -1,9 +1,9 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=21w39a -yarn_mappings=21w39a+build.1 -loader_version=0.11.7 -fabric_version=0.40.4+1.18 +minecraft_version=21w44a +yarn_mappings=21w44a+build.8 +loader_version=0.12.5 +fabric_version=0.42.1+1.18 mod_version = 1.0.0 maven_group = com.example From ba4b9289e211def2a3bb78ace3049724704921d9 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 10 Nov 2021 14:23:32 +0000 Subject: [PATCH 2/5] Ensure that the encoding is set to UTF-8 --- .../loom/configuration/CompileConfiguration.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index a37bb9a0..789983be 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -24,10 +24,14 @@ package net.fabricmc.loom.configuration; +import java.nio.charset.StandardCharsets; + import org.gradle.api.Project; import org.gradle.api.plugins.JavaPlugin; import org.gradle.api.plugins.JavaPluginConvention; +import org.gradle.api.tasks.AbstractCopyTask; import org.gradle.api.tasks.SourceSet; +import org.gradle.api.tasks.compile.JavaCompile; import org.gradle.api.tasks.javadoc.Javadoc; import org.gradle.jvm.tasks.Jar; @@ -156,6 +160,12 @@ public final class CompileConfiguration { // Add the "dev" jar to the "namedElements" configuration p.artifacts(artifactHandler -> artifactHandler.add(Constants.Configurations.NAMED_ELEMENTS, p.getTasks().getByName("jar"))); + // Ensure that the encoding is set to UTF-8, no matter what the system default is + // this fixes some edge cases with special characters not displaying correctly + // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html + p.getTasks().withType(AbstractCopyTask.class).configureEach(abstractCopyTask -> abstractCopyTask.setFilteringCharset(StandardCharsets.UTF_8.name())); + p.getTasks().withType(JavaCompile.class).configureEach(javaCompile -> javaCompile.getOptions().setEncoding(StandardCharsets.UTF_8.name())); + if (p.getPluginManager().hasPlugin("org.jetbrains.kotlin.kapt")) { // If loom is applied after kapt, then kapt will use the AP arguments too early for loom to pass the arguments we need for mixin. throw new IllegalArgumentException("fabric-loom must be applied BEFORE kapt in the plugins { } block."); From e2b4bc89858d4796ac48e0b7692e95fe3d9ed5f1 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Wed, 10 Nov 2021 17:42:41 +0000 Subject: [PATCH 3/5] Reduce log level of "Using project based jar storage". This will be used on a lot more projects now as transitive access wideners becomes more widely used. --- .../configuration/providers/mappings/MappingsProviderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java index 6b5c4694..3f851425 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/mappings/MappingsProviderImpl.java @@ -166,7 +166,7 @@ public class MappingsProviderImpl extends DependencyProvider implements Mappings if (processorManager.active()) { mappedProvider = new MinecraftProcessedProvider(getProject(), processorManager); - getProject().getLogger().lifecycle("Using project based jar storage"); + getProject().getLogger().info("Using project based jar storage"); } else { mappedProvider = new MinecraftMappedProvider(getProject()); } From 2994c2d4883b4740ed0e86a82c00843b65708baa Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 11 Nov 2021 18:28:15 +0000 Subject: [PATCH 4/5] Fix for 1.18-pre1 server bundler. In the bundler its called 1.18 Pre-release 1 not 1.18-pre1, so we just assume there is only ever going to be 1 version per jar. --- .../providers/MinecraftProviderImpl.java | 14 +++++++++----- .../resources/projects/java16/gradle.properties | 4 ++-- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java index 466543b1..4cda3be7 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/MinecraftProviderImpl.java @@ -281,8 +281,13 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra } String jarPath = null; + String[] versions = versionsList.split("\n"); - for (String version : versionsList.split("\n")) { + if (versions.length != 1) { + throw new UnsupportedOperationException("Expected only 1 version in META-INF/versions.list, but got %d".formatted(versions.length)); + } + + for (String version : versions) { if (version.isBlank()) continue; String[] split = version.split("\t"); @@ -293,10 +298,9 @@ public class MinecraftProviderImpl extends DependencyProvider implements Minecra final String id = split[1]; final String path = split[2]; - if (minecraftVersion().equals(id)) { - jarPath = path; - break; - } + // Take the first (only) version we find. + jarPath = path; + break; } Objects.requireNonNull(jarPath, "Could not find minecraft server jar for " + minecraftVersion()); diff --git a/src/test/resources/projects/java16/gradle.properties b/src/test/resources/projects/java16/gradle.properties index 24d25281..cdc647ce 100644 --- a/src/test/resources/projects/java16/gradle.properties +++ b/src/test/resources/projects/java16/gradle.properties @@ -1,7 +1,7 @@ org.gradle.jvmargs=-Xmx1G -minecraft_version=21w44a -yarn_mappings=21w44a+build.8 +minecraft_version=1.18-pre1 +yarn_mappings=1.18-pre1+build.2 loader_version=0.12.5 fabric_version=0.42.1+1.18 From 35afda4398c61d2c816e02a827231308e3b58bae Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Fri, 12 Nov 2021 10:46:23 +0000 Subject: [PATCH 5/5] Fix `namedElements` not extending from api (#533) * Fix `namedElements` not extending from api Fix artifact not waiting for remapAllJars with shared caches * Use apiElements * Add a better test for this. * Also add remapped api mods to namedElements --- .../loom/build/ModCompileRemapper.java | 6 +++++ .../configuration/CompileConfiguration.java | 1 + .../configuration/RemapConfiguration.java | 10 ++++++++- .../loom/test/LoomTestConstants.groovy | 2 +- .../test/integration/FabricAPITest.groovy | 8 +++---- src/test/resources/patches/fabric_api.patch | 22 ------------------- .../projects/multiproject/core/build.gradle | 7 +++++- .../java/net/fabricmc/example/ExampleMod.java | 9 ++++++++ 8 files changed, 36 insertions(+), 29 deletions(-) delete mode 100644 src/test/resources/patches/fabric_api.patch diff --git a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java index 0a3dca03..4b922cd6 100644 --- a/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java +++ b/src/main/java/net/fabricmc/loom/build/ModCompileRemapper.java @@ -45,6 +45,7 @@ import org.gradle.api.artifacts.result.ComponentArtifactsResult; import org.gradle.api.artifacts.result.ResolvedArtifactResult; import org.gradle.api.file.FileCollection; import org.gradle.api.logging.Logger; +import org.gradle.api.plugins.JavaPlugin; import org.gradle.jvm.JvmLibrary; import org.gradle.language.base.artifact.SourcesArtifact; import org.jetbrains.annotations.Nullable; @@ -156,6 +157,11 @@ public class ModCompileRemapper { if (entry.replacedWith() != null && !modDependencies.isEmpty()) { extension.getDeprecationHelper().replaceWithInLoom0_11(entry.sourceConfiguration(), entry.replacedWith()); } + + // Export to other projects + if (entry.targetConfiguration().equals(JavaPlugin.API_CONFIGURATION_NAME)) { + project.getConfigurations().getByName(Constants.Configurations.NAMED_ELEMENTS).extendsFrom(remappedConfig); + } }); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index 789983be..e39634af 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -64,6 +64,7 @@ public final class CompileConfiguration { extension.createLazyConfiguration(Constants.Configurations.NAMED_ELEMENTS).configure(configuration -> { configuration.setCanBeConsumed(true); configuration.setCanBeResolved(false); + configuration.extendsFrom(project.getConfigurations().getByName(JavaPlugin.API_CONFIGURATION_NAME)); }); extendsFrom(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME, Constants.Configurations.MAPPING_CONSTANTS, project); diff --git a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java index 03d19e30..1a9ac21c 100644 --- a/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/RemapConfiguration.java @@ -73,7 +73,15 @@ public class RemapConfiguration { return; } - PublishArtifact artifact = artifacts.add(JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME, task.getOutput()); + PublishArtifact artifact = artifacts.add(JavaPlugin.SOURCES_ELEMENTS_CONFIGURATION_NAME, task.getOutput(), configurablePublishArtifact -> { + Task remapJarTask = task; + + if (extension.getShareRemapCaches().get()) { + remapJarTask = project.getRootProject().getTasks().getByName(DEFAULT_REMAP_ALL_JARS_TASK_NAME); + } + + configurablePublishArtifact.builtBy(remapJarTask); + }); // Remove the existing artifact that does not run remapSourcesJar. // It doesn't seem to hurt, but I'm not sure if the file-level duplicates cause issues. diff --git a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy index 643cee8d..8156fce6 100644 --- a/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/LoomTestConstants.groovy @@ -28,7 +28,7 @@ import org.gradle.util.GradleVersion class LoomTestConstants { public final static String DEFAULT_GRADLE = GradleVersion.current().getVersion() - public final static String PRE_RELEASE_GRADLE = "7.4-20211108233000+0000" + public final static String PRE_RELEASE_GRADLE = "7.4-20211110232442+0000" public final static String[] STANDARD_TEST_VERSIONS = [DEFAULT_GRADLE, PRE_RELEASE_GRADLE] } diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy index 893817ec..49db69b9 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/FabricAPITest.groovy @@ -43,14 +43,14 @@ class FabricAPITest extends Specification implements GradleProjectTestTrait { def "build and run (gradle #version)"() { setup: def gradle = gradleProject( - repo: "https://github.com/FabricMC/fabric.git", - commit: "46582230fb580d4c1f71e4b0737df27417ec9cb1", + repo: "https://github.com/modmuss50/fabric.git", + commit: "e954edb6069e36139fd70428cfe4cddb5826c498", version: version, - patch: "fabric_api" +// patch: "fabric_api" ) // Set the version to something constant - gradle.buildGradle.text = gradle.buildGradle.text.replace('Globals.baseVersion + "+" + (ENV.GITHUB_RUN_NUMBER ? "" : "local-") + getBranch()', "\"$API_VERSION\"") + gradle.buildGradle.text = gradle.buildGradle.text.replace('project.version + "+" + (ENV.GITHUB_RUN_NUMBER ? "" : "local-") + getBranch()', "\"$API_VERSION\"") def server = ServerRunner.create(gradle.projectDir, "1.17.1") .withMod(gradle.getOutputFile("fabric-api-${API_VERSION}.jar")) diff --git a/src/test/resources/patches/fabric_api.patch b/src/test/resources/patches/fabric_api.patch deleted file mode 100644 index cce2c1a8..00000000 --- a/src/test/resources/patches/fabric_api.patch +++ /dev/null @@ -1,22 +0,0 @@ -diff --git a/build.gradle b/build.gradle ---- a/build.gradle (revision fc40aa9d88e9457957bdf3f8cec9698846828cd3) -+++ b/build.gradle (date 1631009569915) -@@ -257,6 +257,9 @@ - setupRepositories(repositories) - } - -+ // Required as moduleDependencies modifies the pom -+ loom.disableDeprecatedPomGeneration(publishing.publications.mavenJava) -+ - javadoc.enabled = false - } - -@@ -296,6 +299,8 @@ - setupRepositories(repositories) - } - -+loom.disableDeprecatedPomGeneration(publishing.publications.mavenJava) -+ - void setupRepositories(RepositoryHandler repositories) { - //repositories.mavenLocal() // uncomment for testing - def ENV = System.getenv() diff --git a/src/test/resources/projects/multiproject/core/build.gradle b/src/test/resources/projects/multiproject/core/build.gradle index 8a09f64b..652eb359 100644 --- a/src/test/resources/projects/multiproject/core/build.gradle +++ b/src/test/resources/projects/multiproject/core/build.gradle @@ -1 +1,6 @@ -archivesBaseName = "core" \ No newline at end of file +archivesBaseName = "core" + +dependencies { + // An example api dep to be used by the other sub project. + modApi "TechReborn:TechReborn-1.16:3.8.4+build.236" +} \ No newline at end of file diff --git a/src/test/resources/projects/multiproject/example/src/main/java/net/fabricmc/example/ExampleMod.java b/src/test/resources/projects/multiproject/example/src/main/java/net/fabricmc/example/ExampleMod.java index e5ed082e..2afebd00 100644 --- a/src/test/resources/projects/multiproject/example/src/main/java/net/fabricmc/example/ExampleMod.java +++ b/src/test/resources/projects/multiproject/example/src/main/java/net/fabricmc/example/ExampleMod.java @@ -1,6 +1,9 @@ package net.fabricmc.example; import net.fabricmc.api.ModInitializer; +import net.minecraft.block.BlockState; +import techreborn.blocks.cable.CableShapeUtil; +import net.minecraft.util.shape.VoxelShape; public class ExampleMod implements ModInitializer { @Override @@ -10,5 +13,11 @@ public class ExampleMod implements ModInitializer { // Proceed with mild caution. System.out.println("Hello Fabric world!"); + + if (false) { + // Just here to make sure it compiles as named, not to test it runs + BlockState state = null; + VoxelShape shape = new CableShapeUtil(null).getShape(state); + } } }