summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Thog2017-03-24 08:26:02 +0100
committerGravatar Thog2017-03-24 08:26:02 +0100
commit88aca930f6ac1cf504f3a4e99964a365ae17b747 (patch)
tree4d3ceedc8325f7922aeeb00d1af59facd9e0fa30 /src
parentReformat code (diff)
downloadenigma-88aca930f6ac1cf504f3a4e99964a365ae17b747.tar.gz
enigma-88aca930f6ac1cf504f3a4e99964a365ae17b747.tar.xz
enigma-88aca930f6ac1cf504f3a4e99964a365ae17b747.zip
Document a "little bit" the Tiny Reader
Diffstat (limited to 'src')
-rw-r--r--src/main/java/cuchaz/enigma/mapping/MappingsTinyReader.java41
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 b2ba1917..5e597b0c 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());