diff options
author | shartte <shartte@users.noreply.github.com> | 2021-09-14 23:40:47 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-14 22:40:47 +0100 |
commit | d48c74161e1a17fd5c8464605f9eb1e45d6e359a (patch) | |
tree | 7042da87cdafd52ead9b2ac3a6e703f4e8c9e26b /src/main/java/net/fabricmc/loom/configuration/mods | |
parent | 08e548b6c62815bf4b75593cb9a499951a4f564e (diff) | |
download | architectury-loom-d48c74161e1a17fd5c8464605f9eb1e45d6e359a.tar.gz architectury-loom-d48c74161e1a17fd5c8464605f9eb1e45d6e359a.tar.bz2 architectury-loom-d48c74161e1a17fd5c8464605f9eb1e45d6e359a.zip |
Access Widener 2.0 with support for Transitive Access Wideners (#484)
* Added global access widener support.
* Adapt loom to changed API of latest AW PR.
* Fix expected access widener to fix the test. Since the access widener is now streamed directly into the writer, the expanded rules (i.e. accessible field makes the owning class also accessible) are no longer found in the remapped file.
* Add basic transitive accesswidener test
* Extracted applying transitive access wideners into their own jar processor since they also need to be applied if there is no AW in the mod itself.
* Misc assortment of fixes
* Set up the processor lazily to allow for adding the intermediary MC jar, which is needed to correctly remap intermediary AWs to named.
* Rework to setup the tiny remapper classpath with the mc jar
Add an extension prop to disable
* Add TransitiveDetectorVisitor
* Minor refactoring.
* Use release-version of access-widener.
Co-authored-by: modmuss50 <modmuss50@gmail.com>
Diffstat (limited to 'src/main/java/net/fabricmc/loom/configuration/mods')
-rw-r--r-- | src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java | 48 |
1 files changed, 21 insertions, 27 deletions
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 7cdc6670..2cd519f9 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -24,13 +24,9 @@ package net.fabricmc.loom.configuration.mods; -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.ArrayList; @@ -48,7 +44,6 @@ import org.zeroturnaround.zip.ZipUtil; import org.zeroturnaround.zip.transform.StringZipEntryTransformer; import org.zeroturnaround.zip.transform.ZipEntryTransformerEntry; -import net.fabricmc.accesswidener.AccessWidener; import net.fabricmc.accesswidener.AccessWidenerReader; import net.fabricmc.accesswidener.AccessWidenerRemapper; import net.fabricmc.accesswidener.AccessWidenerWriter; @@ -60,7 +55,7 @@ import net.fabricmc.loom.configuration.processors.dependency.ModDependencyInfo; import net.fabricmc.loom.configuration.providers.mappings.MappingsProviderImpl; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftMappedProvider; import net.fabricmc.loom.util.Constants; -import net.fabricmc.loom.util.TinyRemapperMappingsHelper; +import net.fabricmc.loom.util.TinyRemapperHelper; import net.fabricmc.tinyremapper.InputTag; import net.fabricmc.tinyremapper.OutputConsumerPath; import net.fabricmc.tinyremapper.TinyRemapper; @@ -98,7 +93,7 @@ public class ModProcessor { private static void stripNestedJars(File file) { // Strip out all contained jar info as we dont want loader to try and load the jars contained in dev. - ZipUtil.transformEntries(file, new ZipEntryTransformerEntry[] {(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { + ZipUtil.transformEntries(file, new ZipEntryTransformerEntry[]{(new ZipEntryTransformerEntry("fabric.mod.json", new StringZipEntryTransformer() { @Override protected String transform(ZipEntry zipEntry, String input) { JsonObject json = LoomGradlePlugin.GSON.fromJson(input, JsonObject.class); @@ -108,23 +103,22 @@ public class ModProcessor { }))}); } + /** + * Remap another mod's access widener from intermediary to named, so that loader can apply it in our dev-env. + */ private static byte[] remapAccessWidener(byte[] input, Remapper remapper) { - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(input), StandardCharsets.UTF_8))) { - AccessWidener accessWidener = new AccessWidener(); - AccessWidenerReader accessWidenerReader = new AccessWidenerReader(accessWidener); - accessWidenerReader.read(bufferedReader); - - AccessWidenerRemapper accessWidenerRemapper = new AccessWidenerRemapper(accessWidener, remapper, MappingsNamespace.NAMED.toString()); - AccessWidener remapped = accessWidenerRemapper.remap(); - AccessWidenerWriter accessWidenerWriter = new AccessWidenerWriter(remapped); - - try (StringWriter writer = new StringWriter()) { - accessWidenerWriter.write(writer); - return writer.toString().getBytes(StandardCharsets.UTF_8); - } - } catch (IOException e) { - throw new RuntimeException(e); - } + int version = AccessWidenerReader.readVersion(input); + + AccessWidenerWriter writer = new AccessWidenerWriter(version); + AccessWidenerRemapper awRemapper = new AccessWidenerRemapper( + writer, + remapper, + MappingsNamespace.INTERMEDIARY.toString(), + MappingsNamespace.NAMED.toString() + ); + AccessWidenerReader reader = new AccessWidenerReader(awRemapper); + reader.read(input); + return writer.write(); } private static void remapJars(Project project, List<ModDependencyInfo> processList) throws IOException { @@ -137,16 +131,16 @@ public class ModProcessor { Path mc = mappedProvider.getIntermediaryJar().toPath(); Path[] mcDeps = project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES).getFiles() - .stream().map(File::toPath).toArray(Path[]::new); + .stream().map(File::toPath).toArray(Path[]::new); List<ModDependencyInfo> remapList = processList.stream().filter(ModDependencyInfo::requiresRemapping).collect(Collectors.toList()); project.getLogger().lifecycle(":remapping " + remapList.size() + " mods (TinyRemapper, " + fromM + " -> " + toM + ")"); TinyRemapper remapper = TinyRemapper.newRemapper() - .withMappings(TinyRemapperMappingsHelper.create(mappingsProvider.getMappings(), fromM, toM, false)) - .renameInvalidLocals(false) - .build(); + .withMappings(TinyRemapperHelper.create(mappingsProvider.getMappings(), fromM, toM, false)) + .renameInvalidLocals(false) + .build(); remapper.readClassPathAsync(mc); remapper.readClassPathAsync(mcDeps); |