Allow transitive access wideners to be declared through architectury.common.json

Signed-off-by: shedaniel <daniel@shedaniel.me>
This commit is contained in:
shedaniel
2021-12-05 18:55:51 +08:00
parent ae383b8d4b
commit 3c8e1f8b31
2 changed files with 39 additions and 1 deletions

View File

@@ -45,6 +45,44 @@ public record AccessWidenerFile(
* Reads the access-widener contained in a mod jar, or returns null if there is none.
*/
public static AccessWidenerFile fromModJar(Path modJarPath) {
if (ZipUtils.contains(modJarPath, "architectury.common.json")) {
String awPath = null;
byte[] commonJsonBytes;
try {
commonJsonBytes = ZipUtils.unpackNullable(modJarPath, "architectury.common.json");
} catch (IOException e) {
throw new UncheckedIOException("Failed to read access-widener file from: " + modJarPath.toAbsolutePath(), e);
}
if (commonJsonBytes != null) {
JsonObject jsonObject = new Gson().fromJson(new String(commonJsonBytes, StandardCharsets.UTF_8), JsonObject.class);
if (jsonObject.has("accessWidener")) {
awPath = jsonObject.get("accessWidener").getAsString();
} else {
throw new IllegalArgumentException("The architectury.common.json file does not contain an accessWidener field.");
}
} else {
// ???????????
throw new IllegalArgumentException("The architectury.common.json file does not exist.");
}
byte[] content;
try {
content = ZipUtils.unpack(modJarPath, awPath);
} catch (IOException e) {
throw new UncheckedIOException("Could not find access widener file (%s) defined in the architectury.common.json file of %s".formatted(awPath, modJarPath.toAbsolutePath()), e);
}
return new AccessWidenerFile(
awPath,
modJarPath.getFileName().toString(),
content
);
}
byte[] modJsonBytes;
try {

View File

@@ -198,7 +198,7 @@ public class RemapJarTask extends Jar {
}
AccessWidenerFile awFile = AccessWidenerFile.fromModJar(remapData.input);
Preconditions.checkNotNull(awFile, "Failed to find accessWidener in fabric.mod.json: " + remapData.input);
Preconditions.checkNotNull(awFile, "Failed to find accessWidener in fabric.mod.json / architectury.common.json: " + remapData.input);
return Pair.of(awFile.name(), data);
}