aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/moe
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/moe')
-rw-r--r--src/main/java/moe/nea/zwirn/RenameTask.java84
-rw-r--r--src/main/java/moe/nea/zwirn/Zwirn.java18
2 files changed, 102 insertions, 0 deletions
diff --git a/src/main/java/moe/nea/zwirn/RenameTask.java b/src/main/java/moe/nea/zwirn/RenameTask.java
new file mode 100644
index 0000000..89c15c4
--- /dev/null
+++ b/src/main/java/moe/nea/zwirn/RenameTask.java
@@ -0,0 +1,84 @@
+package moe.nea.zwirn;
+
+import net.fabricmc.stitch.commands.tinyv2.*;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class RenameTask {
+ private final TinyFile tinyFile;
+ private final List<Zwirn.RenameCommand> newNamespaceOrder;
+ private final int[] namespaceRemapOrder;
+
+ public RenameTask(@NotNull TinyFile tinyFile, @NotNull List<Zwirn.RenameCommand> newNamespaceOrder) {
+ this.tinyFile = tinyFile;
+ this.newNamespaceOrder = newNamespaceOrder;
+ namespaceRemapOrder = newNamespaceOrder.stream().mapToInt(
+ it -> tinyFile.getHeader().getNamespaces().indexOf(it.oldNamespaceName())
+ ).toArray();
+ }
+
+
+ private List<String> rename(List<String> strings) {
+ List<String> newNames = new ArrayList<>(namespaceRemapOrder.length);
+ for (int j : namespaceRemapOrder) {
+ newNames.add(strings.get(j));
+ }
+ return newNames;
+ }
+
+ public TinyFile rename() {
+ return new TinyFile(
+ new TinyHeader(newNamespaceOrder.stream().map(it -> it.newNamespaceName()).collect(Collectors.toList()), 2, 0, tinyFile.getHeader().getProperties()),
+ tinyFile.getClassEntries().stream().map(this::renameClass).collect(Collectors.toList())
+ );
+ }
+
+ private TinyClass renameClass(TinyClass tinyClass) {
+ return new TinyClass(
+ rename(tinyClass.getClassNames()),
+ tinyClass.getMethods().stream().map(this::renameMethod).collect(Collectors.toList()),
+ tinyClass.getFields().stream().map(this::renameField).collect(Collectors.toList()),
+ tinyClass.getComments()
+ );
+ }
+
+ private TinyField renameField(TinyField tinyField) {
+ var names = rename(tinyField.getFieldNames());
+ return new TinyField(
+ names.get(0),
+ names,
+ tinyField.getComments()
+ );
+ }
+
+ private TinyMethod renameMethod(TinyMethod tinyMethod) {
+ var names = rename(tinyMethod.getMethodNames());
+ return new TinyMethod(
+ names.get(0),
+ names,
+ tinyMethod.getParameters().stream().map(this::renameMethodParameter).collect(Collectors.toList()),
+ tinyMethod.getLocalVariables().stream().map(this::renameVariable).collect(Collectors.toList()),
+ tinyMethod.getComments()
+ );
+ }
+
+ private TinyMethodParameter renameMethodParameter(TinyMethodParameter tinyMethodParameter) {
+ return new TinyMethodParameter(
+ tinyMethodParameter.getLvIndex(),
+ rename(tinyMethodParameter.getParameterNames()),
+ tinyMethodParameter.getComments()
+ );
+ }
+
+ private TinyLocalVariable renameVariable(TinyLocalVariable tinyLocalVariable) {
+ return new TinyLocalVariable(
+ tinyLocalVariable.getLvIndex(), tinyLocalVariable.getLvStartOffset(),
+ tinyLocalVariable.getLvTableIndex(),
+ rename(tinyLocalVariable.getLocalVariableNames()),
+ tinyLocalVariable.getComments()
+ );
+ }
+}
diff --git a/src/main/java/moe/nea/zwirn/Zwirn.java b/src/main/java/moe/nea/zwirn/Zwirn.java
index 3612007..b3a4956 100644
--- a/src/main/java/moe/nea/zwirn/Zwirn.java
+++ b/src/main/java/moe/nea/zwirn/Zwirn.java
@@ -21,6 +21,24 @@ public class Zwirn {
return new TinyMerger(base, overlay, sharedNamespace).merge();
}
+
+ public record RenameCommand(
+ String oldNamespaceName,
+ String newNamespaceName
+ ) {
+ }
+
+ public static @NotNull TinyFile renameNamespaces(
+ @NotNull TinyFile tinyFile,
+ @NotNull List<@NotNull RenameCommand> newNamespaceOrder
+ ) {
+ for (var renameCommand : newNamespaceOrder) {
+ if (!tinyFile.getHeader().getNamespaces().contains(renameCommand.oldNamespaceName()))
+ throw new IllegalArgumentException("Old namespace " + renameCommand.oldNamespaceName() + " not found");
+ }
+ return new RenameTask(tinyFile, newNamespaceOrder).rename();
+ }
+
public static @NotNull TinyFile enrichSeargeWithMCP(@NotNull TinyFile searge, @NotNull Path mcpArchiveRoot) throws IOException {
if (!searge.getHeader().getNamespaces().equals(Arrays.asList("left", "right")))
throw new IllegalArgumentException("Searge namespaces need to be left and right");