diff options
| author | 2017-03-24 08:26:02 +0100 | |
|---|---|---|
| committer | 2017-03-24 08:26:02 +0100 | |
| commit | 88aca930f6ac1cf504f3a4e99964a365ae17b747 (patch) | |
| tree | 4d3ceedc8325f7922aeeb00d1af59facd9e0fa30 /src/main/java | |
| parent | Reformat code (diff) | |
| download | enigma-fork-88aca930f6ac1cf504f3a4e99964a365ae17b747.tar.gz enigma-fork-88aca930f6ac1cf504f3a4e99964a365ae17b747.tar.xz enigma-fork-88aca930f6ac1cf504f3a4e99964a365ae17b747.zip | |
Document a "little bit" the Tiny Reader
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java index b2ba191..5e597b0 100644 --- a/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java +++ b/src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java | |||
| @@ -29,10 +29,9 @@ public class MappingsTinyReader { | |||
| 29 | 29 | ||
| 30 | public Mappings read(File file) throws IOException, MappingParseException { | 30 | public Mappings read(File file) throws IOException, MappingParseException { |
| 31 | Mappings mappings = new Mappings(Mappings.FormatType.TINY_FILE); | 31 | Mappings mappings = new Mappings(Mappings.FormatType.TINY_FILE); |
| 32 | System.out.println(file); | ||
| 33 | List<String> lines = Files.readAllLines(file.toPath(), Charsets.UTF_8); | 32 | List<String> lines = Files.readAllLines(file.toPath(), Charsets.UTF_8); |
| 34 | Map<String, ClassMapping> classMappingMap = Maps.newHashMap(); | 33 | Map<String, ClassMapping> classMappingMap = Maps.newHashMap(); |
| 35 | String header = lines.remove(0); | 34 | lines.remove(0); // TODO: use the header |
| 36 | for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { | 35 | for (int lineNumber = 0; lineNumber < lines.size(); lineNumber++) { |
| 37 | String line = lines.get(lineNumber); | 36 | String line = lines.get(lineNumber); |
| 38 | String[] parts = line.split("\\s"); | 37 | String[] parts = line.split("\\s"); |
| @@ -41,26 +40,34 @@ public class MappingsTinyReader { | |||
| 41 | ClassMapping classMapping; | 40 | ClassMapping classMapping; |
| 42 | switch (token) { | 41 | switch (token) { |
| 43 | case "CLASS": | 42 | case "CLASS": |
| 43 | |||
| 44 | // Check for orphan created by field or method entries. It shouldn't be possible but I prefer to handle this case | ||
| 44 | if (classMappingMap.containsKey(parts[1])) { | 45 | if (classMappingMap.containsKey(parts[1])) { |
| 45 | classMapping = classMappingMap.get(parts[1]); | 46 | classMapping = classMappingMap.get(parts[1]); |
| 47 | |||
| 48 | // We have the full deob name, Enigma only support simple class name so we extract it. | ||
| 46 | String deobName = parts[2].contains("$") ? | 49 | String deobName = parts[2].contains("$") ? |
| 47 | parts[2].substring(parts[2].lastIndexOf('$') + 1) : | 50 | parts[2].substring(parts[2].lastIndexOf('$') + 1) : |
| 48 | parts[2]; | 51 | parts[2]; |
| 52 | |||
| 53 | // Add full deob name to the class mapping to handle inner class after this loop | ||
| 49 | classMappingMap.put(parts[2], classMapping.setDeobInner(parts[2])); | 54 | classMappingMap.put(parts[2], classMapping.setDeobInner(parts[2])); |
| 50 | classMapping.setDeobfName(deobName); | 55 | classMapping.setDeobfName(deobName); |
| 56 | |||
| 57 | // Avoid to make the mapping dirty directly at the startup | ||
| 51 | classMapping.resetDirty(); | 58 | classMapping.resetDirty(); |
| 52 | } else | 59 | } else |
| 53 | classMapping = readClass(parts); | 60 | classMapping = readClass(parts); |
| 54 | classMappingMap.put(parts[1], classMapping); | 61 | classMappingMap.put(parts[1], classMapping); |
| 55 | break; | 62 | break; |
| 56 | case "FIELD": | 63 | case "FIELD": |
| 64 | // We can have missing classes mappings because they don't have a ob name, so we create it and use it | ||
| 57 | classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1])); | 65 | classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1])); |
| 58 | //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!"); | ||
| 59 | classMapping.addFieldMapping(readField(parts)); | 66 | classMapping.addFieldMapping(readField(parts)); |
| 60 | break; | 67 | break; |
| 61 | case "METHOD": | 68 | case "METHOD": |
| 69 | // We can have missing classes mappings because they don't have a ob name, so we create it and use it | ||
| 62 | classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1])); | 70 | classMapping = classMappingMap.computeIfAbsent(parts[1], k -> new ClassMapping(parts[1])); |
| 63 | //throw new MappingParseException(file, lineNumber, "Cannot find class '" + parts[1] + "' declaration!"); | ||
| 64 | classMapping.addMethodMapping(readMethod(parts)); | 71 | classMapping.addMethodMapping(readMethod(parts)); |
| 65 | break; | 72 | break; |
| 66 | default: | 73 | default: |
| @@ -72,21 +79,39 @@ public class MappingsTinyReader { | |||
| 72 | } | 79 | } |
| 73 | 80 | ||
| 74 | List<ClassMapping> toRegister = new ArrayList<>(classMappingMap.values()); | 81 | List<ClassMapping> toRegister = new ArrayList<>(classMappingMap.values()); |
| 82 | |||
| 83 | // After having completely parsed the file, we need to register it to the real mapping | ||
| 75 | for (ClassMapping classMapping : toRegister) { | 84 | for (ClassMapping classMapping : toRegister) { |
| 76 | ClassEntry obEntry = classMapping.getObfEntry(); | 85 | ClassEntry obEntry = classMapping.getObfEntry(); |
| 77 | ClassEntry deobEntry = classMapping.getDeObfEntry(); | 86 | ClassEntry deobEntry = classMapping.getDeObfEntry(); |
| 78 | try { | 87 | try { |
| 79 | if (obEntry.isInnerClass()) { | 88 | if (obEntry.isInnerClass()) { |
| 80 | ClassMapping parent = classMappingMap.get(obEntry.getOuterClassName()); | 89 | ClassMapping parent = classMappingMap.get(obEntry.getOuterClassName()); |
| 90 | // Inner class can miss their parent... So we create it and add it to the mappings | ||
| 81 | if (parent == null) { | 91 | if (parent == null) { |
| 82 | parent = new ClassMapping(obEntry.getOuterClassName()); | 92 | parent = new ClassMapping(obEntry.getOuterClassName()); // FIXME: WE ACTUALLY DON'T MANAGE INNER CLASS OF INNER CLASS |
| 83 | classMappingMap.put(obEntry.getOuterClassName(), parent); | 93 | classMappingMap.put(obEntry.getOuterClassName(), parent); |
| 84 | mappings.addClassMapping(parent); | 94 | mappings.addClassMapping(parent); |
| 85 | } | 95 | } |
| 96 | // Add the inner class to the parent | ||
| 97 | parent.addInnerClassMapping(classMapping); | ||
| 98 | } | ||
| 99 | // obf class can become deobf inner classs, manage this case. | ||
| 100 | else if (deobEntry != null && deobEntry.isInnerClass()) { | ||
| 101 | String outerClassName = deobEntry.getOuterClassName(); | ||
| 102 | ClassMapping parent = classMappingMap.get(outerClassName); | ||
| 103 | |||
| 104 | // Only the inner is deob??? Okay | ||
| 105 | if (parent == null) { | ||
| 106 | parent = classMappingMap.get(outerClassName); | ||
| 107 | if (parent == null) { | ||
| 108 | parent = new ClassMapping(outerClassName); // FIXME: WE ACTUALLY DON'T MANAGE INNER CLASS OF INNER CLASS | ||
| 109 | classMappingMap.put(outerClassName, parent); | ||
| 110 | mappings.addClassMapping(parent); | ||
| 111 | } | ||
| 112 | } | ||
| 86 | parent.addInnerClassMapping(classMapping); | 113 | parent.addInnerClassMapping(classMapping); |
| 87 | } else if (deobEntry != null && deobEntry.isInnerClass()) | 114 | } else |
| 88 | classMappingMap.get(deobEntry.getOuterClassName()).addInnerClassMapping(classMapping); | ||
| 89 | else | ||
| 90 | mappings.addClassMapping(classMapping); | 115 | mappings.addClassMapping(classMapping); |
| 91 | } catch (MappingConflict e) { | 116 | } catch (MappingConflict e) { |
| 92 | throw new MappingParseException(file, -1, e.getMessage()); | 117 | throw new MappingParseException(file, -1, e.getMessage()); |