Skip to content

Commit

Permalink
Generate access transformer during Gradle configuration phase
Browse files Browse the repository at this point in the history
  • Loading branch information
Yeregorix committed Dec 24, 2024
1 parent 52c4d26 commit cd1052a
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,43 +32,27 @@
import net.fabricmc.accesswidener.AccessWidenerReader;
import net.fabricmc.accesswidener.AccessWidenerVisitor;
import org.cadixdev.bombe.type.signature.MethodSignature;
import org.gradle.api.DefaultTask;
import org.gradle.api.GradleException;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.file.RegularFileProperty;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Set;

public abstract class ConvertAWToAT extends DefaultTask {
public class AWToAT {
private static final Logger logger = Logging.getLogger(AWToAT.class);

@InputFiles
public abstract ConfigurableFileCollection getAccessWideners();

public void accessWideners(Object... paths) {
this.getAccessWideners().from(paths);
}

@OutputFile
public abstract RegularFileProperty getAccessTransformer();

@TaskAction
public void convert() {
final Set<File> awFiles = this.getAccessWideners().getFiles();
final File atFile = this.getAccessTransformer().get().getAsFile();
public static void convert(final Iterable<File> awFiles, final File atFile) {
AWToAT.logger.lifecycle("Converting AWs {} to AT {} ...", awFiles, atFile);

final AccessTransformSet at = AccessTransformSet.create();

for (final File awFile : awFiles) {
try (final BufferedReader reader = Files.newBufferedReader(awFile.toPath())) {
ConvertAWToAT.convert(reader, at);
AWToAT.convert(reader, at);
} catch (final IOException e) {
throw new GradleException("Failed to read access widener: " + awFile, e);
}
Expand All @@ -79,28 +63,30 @@ public void convert() {
} catch (IOException e) {
throw new GradleException("Failed to write access transformer: " + atFile, e);
}

AWToAT.logger.lifecycle("Converted AWs to AT.");
}

public static void convert(final BufferedReader reader, final AccessTransformSet at) throws IOException {
private static void convert(final BufferedReader reader, final AccessTransformSet at) throws IOException {
new AccessWidenerReader(new AccessWidenerVisitor() {
@Override
public void visitClass(final String name, final AccessWidenerReader.AccessType access, final boolean transitive) {
at.getOrCreateClass(name).merge(ConvertAWToAT.convertEntry(access));
at.getOrCreateClass(name).merge(AWToAT.convertEntry(access));
}

@Override
public void visitMethod(final String owner, final String name, final String descriptor, final AccessWidenerReader.AccessType access, final boolean transitive) {
at.getOrCreateClass(owner).mergeMethod(MethodSignature.of(name, descriptor), ConvertAWToAT.convertEntry(access));
at.getOrCreateClass(owner).mergeMethod(MethodSignature.of(name, descriptor), AWToAT.convertEntry(access));
}

@Override
public void visitField(final String owner, final String name, final String descriptor, final AccessWidenerReader.AccessType access, final boolean transitive) {
at.getOrCreateClass(owner).mergeField(name, ConvertAWToAT.convertEntry(access));
at.getOrCreateClass(owner).mergeField(name, AWToAT.convertEntry(access));
}
}).read(reader);
}

public static AccessTransform convertEntry(final AccessWidenerReader.AccessType access) {
private static AccessTransform convertEntry(final AccessWidenerReader.AccessType access) {
return switch (access) {
case ACCESSIBLE -> AccessTransform.of(AccessChange.PUBLIC);
case EXTENDABLE, MUTABLE -> AccessTransform.of(AccessChange.PUBLIC, ModifierChange.REMOVE);
Expand Down
15 changes: 5 additions & 10 deletions forge/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import net.minecraftforge.gradle.userdev.UserDevExtension
import org.spongepowered.gradle.impl.ConvertAWToAT
import org.spongepowered.gradle.impl.AWToAT

buildscript {
repositories {
Expand Down Expand Up @@ -206,30 +206,25 @@ dependencies {
}
}

val convertAWToAT = tasks.register("convertAWToAT", ConvertAWToAT::class) {
accessWideners(main.get().resources.filter { it.name.endsWith(".accesswidener") })
accessWideners(forgeMain.resources.filter { it.name.endsWith(".accesswidener") })
accessTransformer.set(project.layout.buildDirectory.file("generated/resources/at.cfg"))
}
val awFiles: Set<File> = files(main.get().resources, forgeMain.resources).filter { it.name.endsWith(".accesswidener") }.files
val atFile = project.layout.buildDirectory.file("generated/resources/at.cfg").get().asFile
AWToAT.convert(awFiles, atFile)

val mixinConfigs: MutableSet<String> = spongeImpl.mixinConfigurations

extensions.configure(UserDevExtension::class) {
mappings("official", "1.21.3")
accessTransformers.from(convertAWToAT.flatMap { it.accessTransformer })

accessTransformers.from(atFile)
reobf = false

runs {
configureEach {
ideaModule("Sponge.SpongeForge.main")

// property("forge.logging.console.level", "debug")

// jvmArgs("-Dbsl.debug=true") // Uncomment to debug bootstrap classpath

args(mixinConfigs.flatMap { sequenceOf("--mixin.config", it) })

environment("MOD_CLASSES", "nop")
}

Expand Down

0 comments on commit cd1052a

Please sign in to comment.