summaryrefslogtreecommitdiff
path: root/enigma/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'enigma/src/main/java')
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java4
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java61
-rw-r--r--enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java85
3 files changed, 149 insertions, 1 deletions
diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java
index ca275eb..062c877 100644
--- a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java
+++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/MappingFormat.java
@@ -6,6 +6,7 @@ import cuchaz.enigma.translation.mapping.MappingDelta;
6import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; 6import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader;
7import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsWriter; 7import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsWriter;
8import cuchaz.enigma.translation.mapping.serde.proguard.ProguardMappingsReader; 8import cuchaz.enigma.translation.mapping.serde.proguard.ProguardMappingsReader;
9import cuchaz.enigma.translation.mapping.serde.recaf.RecafMappingsReader;
9import cuchaz.enigma.translation.mapping.serde.srg.SrgMappingsWriter; 10import cuchaz.enigma.translation.mapping.serde.srg.SrgMappingsWriter;
10import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsReader; 11import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsReader;
11import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsWriter; 12import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsWriter;
@@ -24,7 +25,8 @@ public enum MappingFormat {
24 TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader()), 25 TINY_V2(new TinyV2Writer("intermediary", "named"), new TinyV2Reader()),
25 TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE), 26 TINY_FILE(TinyMappingsWriter.INSTANCE, TinyMappingsReader.INSTANCE),
26 SRG_FILE(SrgMappingsWriter.INSTANCE, null), 27 SRG_FILE(SrgMappingsWriter.INSTANCE, null),
27 PROGUARD(null, ProguardMappingsReader.INSTANCE); 28 PROGUARD(null, ProguardMappingsReader.INSTANCE),
29 RECAF(null, RecafMappingsReader.INSTANCE);
28 30
29 31
30 private final MappingsWriter writer; 32 private final MappingsWriter writer;
diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java
new file mode 100644
index 0000000..483e4e4
--- /dev/null
+++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsReader.java
@@ -0,0 +1,61 @@
1package cuchaz.enigma.translation.mapping.serde.recaf;
2
3import cuchaz.enigma.ProgressListener;
4import cuchaz.enigma.translation.mapping.EntryMapping;
5import cuchaz.enigma.translation.mapping.serde.MappingParseException;
6import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
7import cuchaz.enigma.translation.mapping.serde.MappingsReader;
8import cuchaz.enigma.translation.mapping.tree.EntryTree;
9import cuchaz.enigma.translation.mapping.tree.HashEntryTree;
10import cuchaz.enigma.translation.representation.MethodDescriptor;
11import cuchaz.enigma.translation.representation.TypeDescriptor;
12import cuchaz.enigma.translation.representation.entry.ClassEntry;
13import cuchaz.enigma.translation.representation.entry.FieldEntry;
14import cuchaz.enigma.translation.representation.entry.MethodEntry;
15
16import java.io.IOException;
17import java.nio.file.Files;
18import java.nio.file.Path;
19import java.util.List;
20import java.util.regex.Matcher;
21import java.util.regex.Pattern;
22
23public class RecafMappingsReader implements MappingsReader {
24
25 public static final RecafMappingsReader INSTANCE = new RecafMappingsReader();
26 private static final Pattern METHOD_PATTERN = Pattern.compile("(.*?)\\.(.*?)(\\(.*?) (.*)");
27 private static final Pattern FIELD_PATTERN = Pattern.compile("(.*?)\\.(.*?) (.*?) (.*)");
28 private static final Pattern CLASS_PATTERN = Pattern.compile("(.*?) (.*)");
29
30 @Override
31 public EntryTree<EntryMapping> read(Path path, ProgressListener progress, MappingSaveParameters saveParameters) throws MappingParseException, IOException {
32 EntryTree<EntryMapping> mappings = new HashEntryTree<>();
33 List<String> lines = Files.readAllLines(path);
34
35 for (String line : lines) {
36 Matcher methodMatcher = METHOD_PATTERN.matcher(line);
37 if (methodMatcher.find()) {
38 ClassEntry owner = new ClassEntry(methodMatcher.group(1));
39 String name = methodMatcher.group(2);
40 MethodDescriptor desc = new MethodDescriptor(methodMatcher.group(3));
41 mappings.insert(new MethodEntry(owner, name, desc), new EntryMapping(methodMatcher.group(4)));
42 continue;
43 }
44
45 Matcher fieldMatcher = FIELD_PATTERN.matcher(line);
46 if (fieldMatcher.find()) {
47 ClassEntry owner = new ClassEntry(fieldMatcher.group(1));
48 String name = fieldMatcher.group(2);
49 TypeDescriptor desc = new TypeDescriptor(fieldMatcher.group(3));
50 mappings.insert(new FieldEntry(owner, name, desc), new EntryMapping(fieldMatcher.group(4)));
51 continue;
52 }
53
54 Matcher classMatcher = CLASS_PATTERN.matcher(line);
55 if (classMatcher.find()) {
56 mappings.insert(new ClassEntry(classMatcher.group(1)), new EntryMapping(classMatcher.group(2)));
57 }
58 }
59 return mappings;
60 }
61}
diff --git a/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java
new file mode 100644
index 0000000..aa29ff6
--- /dev/null
+++ b/enigma/src/main/java/cuchaz/enigma/translation/mapping/serde/recaf/RecafMappingsWriter.java
@@ -0,0 +1,85 @@
1package cuchaz.enigma.translation.mapping.serde.recaf;
2
3import com.google.common.collect.Lists;
4import cuchaz.enigma.ProgressListener;
5import cuchaz.enigma.translation.mapping.EntryMapping;
6import cuchaz.enigma.translation.mapping.MappingDelta;
7import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters;
8import cuchaz.enigma.translation.mapping.serde.MappingsWriter;
9import cuchaz.enigma.translation.mapping.tree.EntryTree;
10import cuchaz.enigma.translation.mapping.tree.EntryTreeNode;
11import cuchaz.enigma.translation.representation.entry.ClassEntry;
12import cuchaz.enigma.translation.representation.entry.Entry;
13import cuchaz.enigma.translation.representation.entry.FieldEntry;
14import cuchaz.enigma.translation.representation.entry.MethodEntry;
15
16import java.io.BufferedWriter;
17import java.io.IOException;
18import java.io.Writer;
19import java.nio.file.Files;
20import java.nio.file.Path;
21
22public class RecafMappingsWriter implements MappingsWriter {
23
24 public static final RecafMappingsWriter INSTANCE = new RecafMappingsWriter();
25
26 @Override
27 public void write(EntryTree<EntryMapping> mappings, MappingDelta<EntryMapping> delta, Path path, ProgressListener progress, MappingSaveParameters saveParameters) {
28 try {
29 Files.deleteIfExists(path);
30 Files.createFile(path);
31 } catch (IOException e) {
32 e.printStackTrace();
33 }
34
35 try (BufferedWriter writer = Files.newBufferedWriter(path)) {
36 Lists.newArrayList(mappings)
37 .stream()
38 .map(EntryTreeNode::getEntry)
39 .forEach(entry -> writeEntry(writer, mappings, entry));
40 } catch (IOException e) {
41 e.printStackTrace();
42 }
43 }
44
45 private void writeEntry(Writer writer, EntryTree<EntryMapping> mappings, Entry<?> entry) {
46 EntryTreeNode<EntryMapping> node = mappings.findNode(entry);
47 if (node == null) {
48 return;
49 }
50
51 EntryMapping mapping = mappings.get(entry);
52
53 try {
54 if (mapping != null && mapping.targetName() != null) {
55 if (entry instanceof ClassEntry classEntry) {
56
57 writer.write(classEntry.getFullName());
58 writer.write(" ");
59 writer.write(mapping.targetName());
60
61 } else if (entry instanceof FieldEntry fieldEntry) {
62
63 writer.write(fieldEntry.getFullName());
64 writer.write(" ");
65 writer.write(fieldEntry.getDesc().toString());
66 writer.write(" ");
67 writer.write(mapping.targetName());
68
69 } else if (entry instanceof MethodEntry methodEntry) {
70
71 writer.write(methodEntry.getFullName());
72 writer.write(methodEntry.getDesc().toString());
73 writer.write(" ");
74 writer.write(mapping.targetName());
75
76 }
77 writer.write("\n");
78 }
79 } catch (IOException e) {
80 e.printStackTrace();
81 }
82
83 node.getChildren().forEach(child -> writeEntry(writer, mappings, child));
84 }
85}