diff options
| author | 2022-06-12 21:24:41 +0900 | |
|---|---|---|
| committer | 2022-06-12 14:24:41 +0200 | |
| commit | 72176117bf75866fc702bbb094e7adc6661f2b01 (patch) | |
| tree | df721ed738be8dbf184bb167a8712e8d6088d530 /enigma/src/main/java/cuchaz | |
| parent | Update ja_jp.json (#450) (diff) | |
| download | enigma-fork-72176117bf75866fc702bbb094e7adc6661f2b01.tar.gz enigma-fork-72176117bf75866fc702bbb094e7adc6661f2b01.tar.xz enigma-fork-72176117bf75866fc702bbb094e7adc6661f2b01.zip | |
Add Recaf format support (#451)
* Add Recaf format support
* Update language files
Co-authored-by: 2xsaiko <me@dblsaiko.net>
Diffstat (limited to 'enigma/src/main/java/cuchaz')
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; | |||
| 6 | import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; | 6 | import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsReader; |
| 7 | import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsWriter; | 7 | import cuchaz.enigma.translation.mapping.serde.enigma.EnigmaMappingsWriter; |
| 8 | import cuchaz.enigma.translation.mapping.serde.proguard.ProguardMappingsReader; | 8 | import cuchaz.enigma.translation.mapping.serde.proguard.ProguardMappingsReader; |
| 9 | import cuchaz.enigma.translation.mapping.serde.recaf.RecafMappingsReader; | ||
| 9 | import cuchaz.enigma.translation.mapping.serde.srg.SrgMappingsWriter; | 10 | import cuchaz.enigma.translation.mapping.serde.srg.SrgMappingsWriter; |
| 10 | import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsReader; | 11 | import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsReader; |
| 11 | import cuchaz.enigma.translation.mapping.serde.tiny.TinyMappingsWriter; | 12 | import 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 @@ | |||
| 1 | package cuchaz.enigma.translation.mapping.serde.recaf; | ||
| 2 | |||
| 3 | import cuchaz.enigma.ProgressListener; | ||
| 4 | import cuchaz.enigma.translation.mapping.EntryMapping; | ||
| 5 | import cuchaz.enigma.translation.mapping.serde.MappingParseException; | ||
| 6 | import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; | ||
| 7 | import cuchaz.enigma.translation.mapping.serde.MappingsReader; | ||
| 8 | import cuchaz.enigma.translation.mapping.tree.EntryTree; | ||
| 9 | import cuchaz.enigma.translation.mapping.tree.HashEntryTree; | ||
| 10 | import cuchaz.enigma.translation.representation.MethodDescriptor; | ||
| 11 | import cuchaz.enigma.translation.representation.TypeDescriptor; | ||
| 12 | import cuchaz.enigma.translation.representation.entry.ClassEntry; | ||
| 13 | import cuchaz.enigma.translation.representation.entry.FieldEntry; | ||
| 14 | import cuchaz.enigma.translation.representation.entry.MethodEntry; | ||
| 15 | |||
| 16 | import java.io.IOException; | ||
| 17 | import java.nio.file.Files; | ||
| 18 | import java.nio.file.Path; | ||
| 19 | import java.util.List; | ||
| 20 | import java.util.regex.Matcher; | ||
| 21 | import java.util.regex.Pattern; | ||
| 22 | |||
| 23 | public 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 @@ | |||
| 1 | package cuchaz.enigma.translation.mapping.serde.recaf; | ||
| 2 | |||
| 3 | import com.google.common.collect.Lists; | ||
| 4 | import cuchaz.enigma.ProgressListener; | ||
| 5 | import cuchaz.enigma.translation.mapping.EntryMapping; | ||
| 6 | import cuchaz.enigma.translation.mapping.MappingDelta; | ||
| 7 | import cuchaz.enigma.translation.mapping.serde.MappingSaveParameters; | ||
| 8 | import cuchaz.enigma.translation.mapping.serde.MappingsWriter; | ||
| 9 | import cuchaz.enigma.translation.mapping.tree.EntryTree; | ||
| 10 | import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; | ||
| 11 | import cuchaz.enigma.translation.representation.entry.ClassEntry; | ||
| 12 | import cuchaz.enigma.translation.representation.entry.Entry; | ||
| 13 | import cuchaz.enigma.translation.representation.entry.FieldEntry; | ||
| 14 | import cuchaz.enigma.translation.representation.entry.MethodEntry; | ||
| 15 | |||
| 16 | import java.io.BufferedWriter; | ||
| 17 | import java.io.IOException; | ||
| 18 | import java.io.Writer; | ||
| 19 | import java.nio.file.Files; | ||
| 20 | import java.nio.file.Path; | ||
| 21 | |||
| 22 | public 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 | } | ||