diff --git a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java index 45587d96..78584e11 100644 --- a/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java +++ b/src/main/java/net/fabricmc/loom/api/LoomGradleExtensionAPI.java @@ -35,6 +35,7 @@ import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; import org.gradle.api.publish.maven.MavenPublication; import org.gradle.api.tasks.SourceSet; import org.jetbrains.annotations.ApiStatus; @@ -129,6 +130,8 @@ public interface LoomGradleExtensionAPI { Property getCustomMinecraftManifest(); + SetProperty getKnownIndyBsms(); + /** * Disables the deprecated POM generation for a publication. * This is useful if you want to suppress deprecation warnings when you're not using software components. diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index f302600a..3ed36eef 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -133,6 +133,7 @@ public class ModProcessor { .stream().map(File::toPath).toArray(Path[]::new); TinyRemapper.Builder builder = TinyRemapper.newRemapper() + .withKnownIndyBsm(extension.getKnownIndyBsms().get()) .withMappings(TinyRemapperHelper.create(mappingConfiguration.getMappingsService(serviceManager).getMappingTree(), fromM, toM, false)) .renameInvalidLocals(false) .extraAnalyzeVisitor(AccessWidenerAnalyzeVisitorProvider.createFromMods(fromM, remapList)); diff --git a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java index 3060d0ef..f8d492ed 100644 --- a/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java +++ b/src/main/java/net/fabricmc/loom/extension/LoomGradleExtensionApiImpl.java @@ -25,6 +25,7 @@ package net.fabricmc.loom.extension; import java.io.File; +import java.util.Set; import org.gradle.api.Action; import org.gradle.api.NamedDomainObjectContainer; @@ -35,6 +36,7 @@ import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.RegularFileProperty; import org.gradle.api.provider.ListProperty; import org.gradle.api.provider.Property; +import org.gradle.api.provider.SetProperty; import org.gradle.api.publish.maven.MavenPublication; import org.gradle.api.tasks.SourceSet; @@ -71,6 +73,7 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA protected final ConfigurableFileCollection log4jConfigs; protected final RegularFileProperty accessWidener; protected final Property customManifest; + protected final SetProperty knownIndyBsms; protected final Property transitiveAccessWideners; protected final Property modProvidedJavadoc; protected final Property intermediary; @@ -98,6 +101,12 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA this.log4jConfigs = project.files(directories.getDefaultLog4jConfigFile()); this.accessWidener = project.getObjects().fileProperty(); this.customManifest = project.getObjects().property(String.class); + this.knownIndyBsms = project.getObjects().setProperty(String.class).convention(Set.of( + "java/lang/invoke/StringConcatFactory", + "java/lang/runtime/ObjectMethods", + "org/codehaus/groovy/vmplugin/v8/IndyInterface" + )); + this.knownIndyBsms.finalizeValueOnRead(); this.transitiveAccessWideners = project.getObjects().property(Boolean.class) .convention(true); this.transitiveAccessWideners.finalizeValueOnRead(); @@ -228,6 +237,11 @@ public abstract class LoomGradleExtensionApiImpl implements LoomGradleExtensionA return customManifest; } + @Override + public SetProperty getKnownIndyBsms() { + return knownIndyBsms; + } + @Override public String getModVersion() { return versionParser.getModVersion(); diff --git a/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java b/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java index 38f7ad7d..3e1eee87 100644 --- a/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java +++ b/src/main/java/net/fabricmc/loom/task/service/TinyRemapperService.java @@ -34,6 +34,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.StringJoiner; import org.gradle.api.Project; @@ -77,6 +78,8 @@ public class TinyRemapperService implements SharedService { joiner.add(project.getPath()); } + extension.getKnownIndyBsms().get().stream().sorted().forEach(joiner::add); + final String id = joiner.toString(); TinyRemapperService service = serviceManager.getOrCreateService(id, () -> { @@ -87,7 +90,7 @@ public class TinyRemapperService implements SharedService { mappings.add(gradleMixinMappingProvider(serviceManager, project.getGradle(), extension.getMappingConfiguration().mappingsIdentifier, from, to)); } - return new TinyRemapperService(mappings, !legacyMixin, kotlinClasspathService); + return new TinyRemapperService(mappings, !legacyMixin, kotlinClasspathService, extension.getKnownIndyBsms().get()); }); service.readClasspath(remapJarTask.getClasspath().getFiles().stream().map(File::toPath).filter(Files::exists).toList()); @@ -126,8 +129,8 @@ public class TinyRemapperService implements SharedService { // Set to true once remapping has started, once set no inputs can be read. private boolean isRemapping = false; - public TinyRemapperService(List mappings, boolean useMixinExtension, @Nullable KotlinClasspath kotlinClasspath) { - TinyRemapper.Builder builder = TinyRemapper.newRemapper(); + public TinyRemapperService(List mappings, boolean useMixinExtension, @Nullable KotlinClasspath kotlinClasspath, Set knownIndyBsms) { + TinyRemapper.Builder builder = TinyRemapper.newRemapper().withKnownIndyBsm(knownIndyBsms); for (IMappingProvider provider : mappings) { builder.withMappings(provider); diff --git a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java index 0b862108..648ba105 100644 --- a/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java +++ b/src/main/java/net/fabricmc/loom/util/TinyRemapperHelper.java @@ -82,6 +82,7 @@ public final class TinyRemapperHelper { .rebuildSourceFilenames(true) .invalidLvNamePattern(MC_LV_PATTERN) .inferNameFromSameLvIndex(true) + .withKnownIndyBsm(extension.getKnownIndyBsms().get()) .extraPreApplyVisitor((cls, next) -> { if (fixRecords && !cls.isRecord() && "java/lang/Record".equals(cls.getSuperName())) { return new RecordComponentFixVisitor(next, mappingTree, intermediaryNsId);