From 5ed46ac9657a2f94e7a70e3c62c6b5c6fc093bba Mon Sep 17 00:00:00 2001 From: Ramid Khan Date: Sat, 3 Oct 2020 06:32:19 +1000 Subject: [PATCH 1/2] Automatically propose field Codec names --- .../fabricmc/stitch/util/FieldNameFinder.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java b/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java index 8e3ef6d..eb5f3e9 100644 --- a/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java +++ b/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java @@ -155,6 +155,30 @@ public Map findNames(Map> allEnumFields } } + // For Codecs + for (Map.Entry> entry : classes.entrySet()) { + String owner = entry.getKey(); + + for (MethodNode node : entry.getValue()) { + // Codecs should be set in class initialization + if ("".equals(node.name)) { + for (AbstractInsnNode instruction : node.instructions) { + // Look for PUTSTATIC instructions + if (instruction instanceof FieldInsnNode + && instruction.getOpcode() == Opcodes.PUTSTATIC) { + FieldInsnNode fieldInsnNode = (FieldInsnNode) instruction; + + // Find PUTSTATIC which set to this class and use Codec as their descriptor + if (owner.equals(fieldInsnNode.owner) + && fieldInsnNode.desc.equals("Lcom/mojang/serialization/Codec;")) { + fieldNames.put(new EntryTriple(owner, fieldInsnNode.name, fieldInsnNode.desc), "CODEC"); + } + } + } + } + } + } + return fieldNames; } From e08aed5b28f2d58a5286467a8c7b4cd7b410a96b Mon Sep 17 00:00:00 2001 From: Ramid Khan Date: Sat, 3 Oct 2020 06:57:48 +1000 Subject: [PATCH 2/2] Don't duplicate names --- .../fabricmc/stitch/util/FieldNameFinder.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java b/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java index eb5f3e9..24165cc 100644 --- a/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java +++ b/src/main/java/net/fabricmc/stitch/util/FieldNameFinder.java @@ -160,6 +160,8 @@ public Map findNames(Map> allEnumFields String owner = entry.getKey(); for (MethodNode node : entry.getValue()) { + List names = new ArrayList<>(); + // Codecs should be set in class initialization if ("".equals(node.name)) { for (AbstractInsnNode instruction : node.instructions) { @@ -171,11 +173,24 @@ public Map findNames(Map> allEnumFields // Find PUTSTATIC which set to this class and use Codec as their descriptor if (owner.equals(fieldInsnNode.owner) && fieldInsnNode.desc.equals("Lcom/mojang/serialization/Codec;")) { - fieldNames.put(new EntryTriple(owner, fieldInsnNode.name, fieldInsnNode.desc), "CODEC"); + names.add(fieldInsnNode.name); } } } } + + if (names.isEmpty()) { + // Nothing was found + continue; + } + + if (names.size() == 1 && !fieldNamesUsed.computeIfAbsent(owner, (s) -> new HashSet<>()).contains("CODEC")) { + // No duplicates were found + fieldNames.put(new EntryTriple(owner, names.get(0), "Lcom/mojang/serialization/Codec;"), "CODEC"); + continue; + } + + System.err.println("Warning: Duplicate key: CODEC in " + owner); } }