Skip to content

Commit 28b13e6

Browse files
committed
inline TransformTask
separate caching for it is pointless ...and some other stuff, because I'm bad at scoping commits
1 parent 299e6e4 commit 28b13e6

File tree

15 files changed

+378
-425
lines changed

15 files changed

+378
-425
lines changed

build.gradle.kts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@ repositories {
1717
}
1818

1919
val mc by minecraft.creating {
20-
version = "1.21.5"
21-
distribution = Distribution.CLIENT
20+
version = "1.21.7"
21+
distribution = Distribution.SERVER
2222

2323
runs {
24-
register("client") {
25-
client()
24+
register("server") {
25+
server()
2626
}
2727
}
2828
}

plugin/src/main/java/fish/cichlidmc/cichlid_gradle/cache/CichlidCache.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import fish.cichlidmc.cichlid_gradle.cache.storage.DecompiledClassStorage;
55
import fish.cichlidmc.cichlid_gradle.cache.storage.PomTemplateStorage;
66
import fish.cichlidmc.cichlid_gradle.cache.storage.ReassembledJarStorage;
7-
import fish.cichlidmc.cichlid_gradle.cache.storage.TransformedClassStorage;
87
import fish.cichlidmc.cichlid_gradle.cache.storage.VersionStorage;
98
import org.gradle.api.Project;
109
import org.gradle.api.invocation.Gradle;
@@ -29,15 +28,13 @@ public final class CichlidCache {
2928
public final AssetStorage assets;
3029
public final ReassembledJarStorage reassembledJars;
3130
public final DecompiledClassStorage decompiledClasses;
32-
public final TransformedClassStorage transformedClasses;
3331
public final PomTemplateStorage pomTemplates;
3432

3533
private CichlidCache(Path root) {
3634
this.root = root;
3735
this.assets = new AssetStorage(root.resolve("assets"));
3836
this.reassembledJars = new ReassembledJarStorage(root.resolve("reassembled"));
3937
this.decompiledClasses = new DecompiledClassStorage(root.resolve("decompiled"));
40-
this.transformedClasses = new TransformedClassStorage(root.resolve("transformed"));
4138
this.pomTemplates = new PomTemplateStorage(root.resolve("poms"));
4239
}
4340

plugin/src/main/java/fish/cichlidmc/cichlid_gradle/cache/mcmaven/JarProcessor.java

Lines changed: 0 additions & 146 deletions
This file was deleted.

plugin/src/main/java/fish/cichlidmc/cichlid_gradle/cache/task/impl/CacheResultSaver.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package fish.cichlidmc.cichlid_gradle.cache.task.impl;
22

3-
import fish.cichlidmc.cichlid_gradle.cache.mcmaven.JarProcessor;
43
import fish.cichlidmc.cichlid_gradle.cache.storage.DecompiledClassStorage;
4+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.ClassGroup;
55
import fish.cichlidmc.cichlid_gradle.util.io.FileUtils;
66
import org.jetbrains.java.decompiler.main.extern.IResultSaver;
77

@@ -15,12 +15,12 @@
1515

1616
public final class CacheResultSaver implements IResultSaver {
1717
private final DecompiledClassStorage storage;
18-
private final Map<String, JarProcessor.ClassGroup> groups;
18+
private final Map<String, ClassGroup> groups;
1919

2020
private int totalClasses;
2121
private int savedClasses;
2222

23-
public CacheResultSaver(DecompiledClassStorage storage, Map<String, JarProcessor.ClassGroup> groups) {
23+
public CacheResultSaver(DecompiledClassStorage storage, Map<String, ClassGroup> groups) {
2424
this.storage = storage;
2525
this.groups = groups;
2626
}
@@ -35,7 +35,7 @@ public int savedClasses() {
3535

3636
@Override
3737
public void saveClassEntry(String path, String archiveName, String qualifiedName, String entryName, String content, int[] mapping) {
38-
JarProcessor.ClassGroup group = this.groups.get(qualifiedName);
38+
ClassGroup group = this.groups.get(qualifiedName);
3939
if (group == null) {
4040
throw new IllegalStateException("Class " + qualifiedName + " has no ClassGroup");
4141
}
Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package fish.cichlidmc.cichlid_gradle.cache.task.impl;
2+
3+
import fish.cichlidmc.cichlid_gradle.cache.task.CacheTaskEnvironment;
4+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.ClassEntry;
5+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.ClassGroup;
6+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.JarProcessor;
7+
import fish.cichlidmc.cichlid_gradle.extension.def.TransformersImpl;
8+
import fish.cichlidmc.cichlid_gradle.util.ConfigurationPair;
9+
import fish.cichlidmc.cichlid_gradle.util.Utils;
10+
import fish.cichlidmc.cichlid_gradle.util.io.FileUtils;
11+
import fish.cichlidmc.sushi.api.TransformerManager;
12+
import fish.cichlidmc.sushi.api.util.Id;
13+
import fish.cichlidmc.tinyjson.JsonException;
14+
import fish.cichlidmc.tinyjson.TinyJson;
15+
import fish.cichlidmc.tinyjson.value.JsonValue;
16+
import fish.cichlidmc.tinyjson.value.composite.JsonObject;
17+
import org.objectweb.asm.ClassReader;
18+
import org.objectweb.asm.ClassWriter;
19+
import org.objectweb.asm.tree.ClassNode;
20+
21+
import java.io.File;
22+
import java.io.IOException;
23+
import java.nio.file.FileSystem;
24+
import java.nio.file.FileSystems;
25+
import java.nio.file.Files;
26+
import java.nio.file.Path;
27+
import java.util.Map;
28+
29+
public record ClassTransformer(TransformerManager manager) implements JarProcessor.ClassProcessor {
30+
@Override
31+
public ClassGroup apply(ClassGroup group) throws IOException {
32+
return new ClassGroup(this.transform(group.main()), Utils.map(group.inner(), this::transform));
33+
}
34+
35+
private ClassEntry transform(ClassEntry entry) throws IOException {
36+
if (entry.fileName().endsWith("package-info.class"))
37+
return entry;
38+
39+
byte[] bytes = entry.content().bytes();
40+
ClassReader reader = new ClassReader(bytes);
41+
ClassNode node = new ClassNode();
42+
reader.accept(node, 0);
43+
44+
if (this.manager.transform(node, reader)) {
45+
ClassWriter writer = new ClassWriter(reader, 0);
46+
node.accept(writer);
47+
return entry.withContent(writer.toByteArray());
48+
}
49+
50+
return entry;
51+
}
52+
53+
public static ClassTransformer create(CacheTaskEnvironment env) throws IOException {
54+
TransformerManager manager = prepareTransformers(env.transformers);
55+
return new ClassTransformer(manager);
56+
}
57+
58+
private static TransformerManager prepareTransformers(TransformersImpl transformers) throws IOException {
59+
TransformerManager.Builder builder = TransformerManager.builder();
60+
61+
for (File file : transformers.mods.resolve().getFiles()) {
62+
Path path = file.toPath();
63+
if (Files.isDirectory(path)) {
64+
readTransformersFromMod(path, builder);
65+
continue;
66+
}
67+
68+
if (path.getFileName().toString().endsWith(".cld")) {
69+
try (FileSystem fs = FileSystems.newFileSystem(path)) {
70+
Path root = FileUtils.getSingleRoot(fs);
71+
readTransformersFromMod(root, builder);
72+
}
73+
74+
continue;
75+
}
76+
77+
throw new IllegalArgumentException("Transformer-providing mod is not in a valid format: " + file);
78+
}
79+
80+
for (Map.Entry<String, ConfigurationPair> entry : transformers.namespaced.entrySet()) {
81+
String namespace = entry.getKey();
82+
for (File file : entry.getValue().resolve().getFiles()) {
83+
readTransformersFromTree(namespace, file.toPath(), builder);
84+
}
85+
}
86+
87+
return builder.build();
88+
}
89+
90+
private static void readTransformersFromMod(Path root, TransformerManager.Builder builder) throws IOException {
91+
Path transformers = root.resolve("transformers");
92+
if (!Files.exists(transformers))
93+
return;
94+
95+
Path metadata = root.resolve("cichlid.mod.json");
96+
if (!Files.exists(metadata)) {
97+
throw new IllegalArgumentException("Mod root does not contain metadata: " + root);
98+
}
99+
100+
try {
101+
JsonObject json = TinyJson.parse(metadata).asObject();
102+
String id = json.get("id").asString().value();
103+
readTransformersFromTree(id, transformers, builder);
104+
} catch (JsonException e) {
105+
throw new IllegalArgumentException("Mod root contains malformed metadata: " + root, e);
106+
}
107+
}
108+
109+
private static void readTransformersFromTree(String namespace, Path root, TransformerManager.Builder builder) throws IOException {
110+
FileUtils.walkFiles(root, file -> {
111+
String relative = root.relativize(file).toString();
112+
if (!relative.endsWith(".sushi"))
113+
return;
114+
115+
String path = relative.substring(0, relative.length() - ".sushi".length());
116+
if (!Id.isValidPath(path)) {
117+
throw new IllegalArgumentException("Mod '" + namespace + "' has a transformer with an invalid ID: " + path);
118+
}
119+
120+
Id id = new Id(namespace, path);
121+
122+
try {
123+
JsonValue json = TinyJson.parse(file);
124+
125+
builder.parseAndRegister(id, json).ifPresent(error -> {
126+
throw new IllegalArgumentException("Transformer " + id + " could not be registered: " + error);
127+
});
128+
} catch (JsonException e) {
129+
throw new IllegalArgumentException("Transformer " + id + " is not valid JSON", e);
130+
}
131+
});
132+
}
133+
}

plugin/src/main/java/fish/cichlidmc/cichlid_gradle/cache/task/impl/DecompileTask.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package fish.cichlidmc.cichlid_gradle.cache.task.impl;
22

3-
import fish.cichlidmc.cichlid_gradle.cache.mcmaven.JarProcessor;
43
import fish.cichlidmc.cichlid_gradle.cache.task.CacheTask;
54
import fish.cichlidmc.cichlid_gradle.cache.task.CacheTaskEnvironment;
5+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.ClassGroup;
6+
import fish.cichlidmc.cichlid_gradle.cache.task.processor.JarProcessor;
67
import fish.cichlidmc.cichlid_gradle.util.Utils;
78
import fish.cichlidmc.cichlid_gradle.util.io.FileUtils;
89
import org.jetbrains.java.decompiler.main.Fernflower;
@@ -45,7 +46,7 @@ protected String run() throws FileNotFoundException {
4546

4647
try (FileSystem fs = FileSystems.newFileSystem(input)) {
4748
Path root = FileUtils.getSingleRoot(fs);
48-
Map<String, JarProcessor.ClassGroup> groups = JarProcessor.collectInput(root).groups();
49+
Map<String, ClassGroup> groups = JarProcessor.collectInput(root).groups();
4950

5051
CacheResultSaver saver = new CacheResultSaver(this.env.cache.decompiledClasses, groups);
5152
Fernflower decompiler = new Fernflower(saver, PREFERENCES, IFernflowerLogger.NO_OP);

0 commit comments

Comments
 (0)