Add extension option to configure known INVOKEDYNAMIC BSMs (#945)

* Set up configuration for known indy bsms

* Make ignoredIndyBsms apply to service remapper

* Add groovy indy instruction to default known BSMs

* Address feedback

---------

Co-authored-by: modmuss <modmuss50@gmail.com>
This commit is contained in:
Luke Bemish
2023-09-09 06:21:14 -06:00
committed by GitHub
parent 777a05457c
commit 0dc2d67317
5 changed files with 25 additions and 3 deletions

View File

@@ -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<String> getCustomMinecraftManifest();
SetProperty<String> 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.

View File

@@ -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));

View File

@@ -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<String> customManifest;
protected final SetProperty<String> knownIndyBsms;
protected final Property<Boolean> transitiveAccessWideners;
protected final Property<Boolean> modProvidedJavadoc;
protected final Property<String> 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<String> getKnownIndyBsms() {
return knownIndyBsms;
}
@Override
public String getModVersion() {
return versionParser.getModVersion();

View File

@@ -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<IMappingProvider> mappings, boolean useMixinExtension, @Nullable KotlinClasspath kotlinClasspath) {
TinyRemapper.Builder builder = TinyRemapper.newRemapper();
public TinyRemapperService(List<IMappingProvider> mappings, boolean useMixinExtension, @Nullable KotlinClasspath kotlinClasspath, Set<String> knownIndyBsms) {
TinyRemapper.Builder builder = TinyRemapper.newRemapper().withKnownIndyBsm(knownIndyBsms);
for (IMappingProvider provider : mappings) {
builder.withMappings(provider);

View File

@@ -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);