diff options
| author | 2014-09-03 00:20:36 -0400 | |
|---|---|---|
| committer | 2014-09-03 00:20:36 -0400 | |
| commit | b5338883d271779c335842c07047d60136316167 (patch) | |
| tree | 006477e8c1ea0ade75ae8a9003abaf1978995fd7 /src/cuchaz/enigma/mapping/MappingsReader.java | |
| parent | fixed bug with export progress bar (diff) | |
| download | enigma-fork-b5338883d271779c335842c07047d60136316167.tar.gz enigma-fork-b5338883d271779c335842c07047d60136316167.tar.xz enigma-fork-b5338883d271779c335842c07047d60136316167.zip | |
big refactor to better model class/method mappings with no deobf name
Diffstat (limited to 'src/cuchaz/enigma/mapping/MappingsReader.java')
| -rw-r--r-- | src/cuchaz/enigma/mapping/MappingsReader.java | 155 |
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; | |||
| 14 | import java.io.IOException; | 14 | import java.io.IOException; |
| 15 | import java.io.Reader; | 15 | import java.io.Reader; |
| 16 | import java.util.Deque; | 16 | import java.util.Deque; |
| 17 | import java.util.NoSuchElementException; | ||
| 18 | import java.util.Scanner; | ||
| 19 | 17 | ||
| 20 | import com.google.common.collect.Queues; | 18 | import com.google.common.collect.Queues; |
| 21 | 19 | ||
| 22 | import cuchaz.enigma.Constants; | 20 | import cuchaz.enigma.Constants; |
| 23 | import cuchaz.enigma.Util; | ||
| 24 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; | 21 | import cuchaz.enigma.mapping.SignatureUpdater.ClassNameUpdater; |
| 25 | 22 | ||
| 26 | public class MappingsReader | 23 | public 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 ) |