summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping/MappingsReader.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/cuchaz/enigma/mapping/MappingsReader.java')
-rw-r--r--src/cuchaz/enigma/mapping/MappingsReader.java155
1 files changed, 89 insertions, 66 deletions
diff --git a/src/cuchaz/enigma/mapping/MappingsReader.java b/src/cuchaz/enigma/mapping/MappingsReader.java
index 9f42b42..7888836 100644
--- a/src/cuchaz/enigma/mapping/MappingsReader.java
+++ b/src/cuchaz/enigma/mapping/MappingsReader.java
@@ -14,13 +14,10 @@ import java.io.BufferedReader;
14import java.io.IOException; 14import java.io.IOException;
15import java.io.Reader; 15import java.io.Reader;
16import java.util.Deque; 16import java.util.Deque;
17import java.util.NoSuchElementException;
18import java.util.Scanner;
19 17
20import com.google.common.collect.Queues; 18import com.google.common.collect.Queues;
21 19
22import cuchaz.enigma.Constants; 20import cuchaz.enigma.Constants;
23import cuchaz.enigma.Util;
24import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; 21import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater;
25 22
26public class MappingsReader 23public class MappingsReader
@@ -73,89 +70,99 @@ public class MappingsReader
73 mappingStack.pop(); 70 mappingStack.pop();
74 } 71 }
75 72
76 Scanner scanner = new Scanner( line ); 73 String[] parts = line.trim().split( "\\s" );
77 try 74 try
78 { 75 {
79 while( scanner.hasNext() ) 76 // read the first token
77 String token = parts[0];
78
79 if( token.equalsIgnoreCase( "CLASS" ) )
80 { 80 {
81 // read the first token 81 ClassMapping classMapping = readClass( parts );
82 String token = scanner.next(); 82 if( indent == 0 )
83
84 if( token.equalsIgnoreCase( "CLASS" ) )
85 { 83 {
86 ClassMapping classMapping = readClass( scanner ); 84 // outer class
87 if( indent == 0 ) 85 mappings.addClassMapping( classMapping );
88 { 86 }
89 // outer class 87 else if( indent == 1 )
90 mappings.addClassMapping( classMapping ); 88 {
91 } 89 // inner class
92 else if( indent == 1 ) 90 if( !( mappingStack.getFirst() instanceof ClassMapping ) )
93 {
94 // inner class
95 if( !( mappingStack.getFirst() instanceof ClassMapping ) )
96 {
97 throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" );
98 }
99 ((ClassMapping)mappingStack.getFirst()).addInnerClassMapping( classMapping );
100 }
101 else
102 { 91 {
103 throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" ); 92 throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" );
104 } 93 }
105 mappingStack.push( classMapping ); 94 ((ClassMapping)mappingStack.getFirst()).addInnerClassMapping( classMapping );
106 } 95 }
107 else if( token.equalsIgnoreCase( "FIELD" ) ) 96 else
108 { 97 {
109 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof ClassMapping) ) 98 throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" );
110 {
111 throw new MappingParseException( lineNumber, "Unexpected FIELD entry here!" );
112 }
113 ((ClassMapping)mappingStack.getFirst()).addFieldMapping( readField( scanner ) );
114 } 99 }
115 else if( token.equalsIgnoreCase( "METHOD" ) ) 100 mappingStack.push( classMapping );
101 }
102 else if( token.equalsIgnoreCase( "FIELD" ) )
103 {
104 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof ClassMapping) )
116 { 105 {
117 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof ClassMapping) ) 106 throw new MappingParseException( lineNumber, "Unexpected FIELD entry here!" );
118 {
119 throw new MappingParseException( lineNumber, "Unexpected METHOD entry here!" );
120 }
121 MethodMapping methodMapping = readMethod( scanner );
122 ((ClassMapping)mappingStack.getFirst()).addMethodMapping( methodMapping );
123 mappingStack.push( methodMapping );
124 } 107 }
125 else if( token.equalsIgnoreCase( "ARG" ) ) 108 ((ClassMapping)mappingStack.getFirst()).addFieldMapping( readField( parts ) );
109 }
110 else if( token.equalsIgnoreCase( "METHOD" ) )
111 {
112 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof ClassMapping) )
126 { 113 {
127 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof MethodMapping) ) 114 throw new MappingParseException( lineNumber, "Unexpected METHOD entry here!" );
128 { 115 }
129 throw new MappingParseException( lineNumber, "Unexpected ARG entry here!" ); 116 MethodMapping methodMapping = readMethod( parts );
130 } 117 ((ClassMapping)mappingStack.getFirst()).addMethodMapping( methodMapping );
131 ((MethodMapping)mappingStack.getFirst()).addArgumentMapping( readArgument( scanner ) ); 118 mappingStack.push( methodMapping );
119 }
120 else if( token.equalsIgnoreCase( "ARG" ) )
121 {
122 if( mappingStack.isEmpty() || !(mappingStack.getFirst() instanceof MethodMapping) )
123 {
124 throw new MappingParseException( lineNumber, "Unexpected ARG entry here!" );
132 } 125 }
126 ((MethodMapping)mappingStack.getFirst()).addArgumentMapping( readArgument( parts ) );
133 } 127 }
134 } 128 }
135 catch( NoSuchElementException ex ) 129 catch( ArrayIndexOutOfBoundsException | NumberFormatException ex )
136 { 130 {
137 throw new MappingParseException( lineNumber, "Malformed line!" ); 131 throw new MappingParseException( lineNumber, "Malformed line!" );
138 } 132 }
139 finally
140 {
141 Util.closeQuietly( scanner );
142 }
143 } 133 }
144 134
145 return mappings; 135 return mappings;
146 } 136 }
147 137
148 private ArgumentMapping readArgument( Scanner scanner ) 138 private ArgumentMapping readArgument( String[] parts )
149 { 139 {
150 return new ArgumentMapping( scanner.nextInt(), scanner.next() ); 140 return new ArgumentMapping( Integer.parseInt( parts[1] ), parts[2] );
151 } 141 }
152 142
153 private ClassMapping readClass( Scanner scanner ) 143 private ClassMapping readClass( String[] parts )
154 { 144 {
155 return new ClassMapping( 145 if( parts.length == 2 )
156 moveClassOutOfDefaultPackage( scanner.next(), Constants.NonePackage ), 146 {
157 moveClassOutOfDefaultPackage( scanner.next(), Constants.NonePackage ) 147 String obfName = parts[1];
158 ); 148 return new ClassMapping( moveClassOutOfDefaultPackage( obfName, Constants.NonePackage ) );
149 }
150 else
151 {
152 String obfName = parts[1];
153 String deobfName = parts[2];
154 if( obfName.equals( deobfName ) )
155 {
156 return new ClassMapping( moveClassOutOfDefaultPackage( obfName, Constants.NonePackage ) );
157 }
158 else
159 {
160 return new ClassMapping(
161 moveClassOutOfDefaultPackage( parts[1], Constants.NonePackage ),
162 moveClassOutOfDefaultPackage( parts[2], Constants.NonePackage )
163 );
164 }
165 }
159 } 166 }
160 167
161 private String moveClassOutOfDefaultPackage( String className, String newPackageName ) 168 private String moveClassOutOfDefaultPackage( String className, String newPackageName )
@@ -168,18 +175,34 @@ public class MappingsReader
168 return className; 175 return className;
169 } 176 }
170 177
171 private FieldMapping readField( Scanner scanner ) 178 private FieldMapping readField( String[] parts )
172 { 179 {
173 return new FieldMapping( scanner.next(), scanner.next() ); 180 return new FieldMapping( parts[1], parts[2] );
174 } 181 }
175 182
176 private MethodMapping readMethod( Scanner scanner ) 183 private MethodMapping readMethod( String[] parts )
177 { 184 {
178 return new MethodMapping( 185 if( parts.length == 3 )
179 scanner.next(), scanner.next(), 186 {
180 moveSignatureOutOfDefaultPackage( scanner.next(), Constants.NonePackage ), 187 String obfName = parts[1];
181 moveSignatureOutOfDefaultPackage( scanner.next(), Constants.NonePackage ) 188 String obfSignature = moveSignatureOutOfDefaultPackage( parts[2], Constants.NonePackage );
182 ); 189 return new MethodMapping( obfName, obfSignature );
190 }
191 else
192 {
193 String obfName = parts[1];
194 String deobfName = parts[2];
195 String obfSignature = moveSignatureOutOfDefaultPackage( parts[3], Constants.NonePackage );
196 String deobfSignature = moveSignatureOutOfDefaultPackage( parts[4], Constants.NonePackage );
197 if( obfName.equals( deobfName ) )
198 {
199 return new MethodMapping( obfName, obfSignature );
200 }
201 else
202 {
203 return new MethodMapping( obfName, obfSignature, deobfName, deobfSignature );
204 }
205 }
183 } 206 }
184 207
185 private String moveSignatureOutOfDefaultPackage( String signature, final String newPackageName ) 208 private String moveSignatureOutOfDefaultPackage( String signature, final String newPackageName )