diff options
| author | 2014-09-30 00:25:36 -0400 | |
|---|---|---|
| committer | 2014-09-30 00:25:36 -0400 | |
| commit | a83bbfd5c510367a194073b1db132022cacf65ed (patch) | |
| tree | abfd7520b79ef1e64b7430bd81e75a30353b7f14 /src/cuchaz/enigma/mapping | |
| parent | fixed recognition of static initializer tokens (diff) | |
| download | enigma-fork-a83bbfd5c510367a194073b1db132022cacf65ed.tar.gz enigma-fork-a83bbfd5c510367a194073b1db132022cacf65ed.tar.xz enigma-fork-a83bbfd5c510367a194073b1db132022cacf65ed.zip | |
fixed nasty issue with renaming inner classes, but alas, more bugs remain
Diffstat (limited to 'src/cuchaz/enigma/mapping')
| -rw-r--r-- | src/cuchaz/enigma/mapping/ClassMapping.java | 18 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MappingsReader.java | 41 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/MappingsRenamer.java | 6 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/NameValidator.java | 6 | ||||
| -rw-r--r-- | src/cuchaz/enigma/mapping/Translator.java | 17 |
5 files changed, 59 insertions, 29 deletions
diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index 88106df..ee02781 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java | |||
| @@ -37,7 +37,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 37 | public ClassMapping( String obfName, String deobfName ) | 37 | public ClassMapping( String obfName, String deobfName ) |
| 38 | { | 38 | { |
| 39 | m_obfName = obfName; | 39 | m_obfName = obfName; |
| 40 | m_deobfName = NameValidator.validateClassName( deobfName ); | 40 | m_deobfName = NameValidator.validateClassName( deobfName, false ); |
| 41 | m_innerClassesByObf = Maps.newHashMap(); | 41 | m_innerClassesByObf = Maps.newHashMap(); |
| 42 | m_innerClassesByDeobf = Maps.newHashMap(); | 42 | m_innerClassesByDeobf = Maps.newHashMap(); |
| 43 | m_fieldsByObf = Maps.newHashMap(); | 43 | m_fieldsByObf = Maps.newHashMap(); |
| @@ -57,7 +57,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 57 | } | 57 | } |
| 58 | public void setDeobfName( String val ) | 58 | public void setDeobfName( String val ) |
| 59 | { | 59 | { |
| 60 | m_deobfName = NameValidator.validateClassName( val ); | 60 | m_deobfName = NameValidator.validateClassName( val, false ); |
| 61 | } | 61 | } |
| 62 | 62 | ||
| 63 | //// INNER CLASSES //////// | 63 | //// INNER CLASSES //////// |
| @@ -70,10 +70,12 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 70 | 70 | ||
| 71 | public void addInnerClassMapping( ClassMapping classMapping ) | 71 | public void addInnerClassMapping( ClassMapping classMapping ) |
| 72 | { | 72 | { |
| 73 | assert( isSimpleClassName( classMapping.getObfName() ) ); | ||
| 73 | boolean obfWasAdded = m_innerClassesByObf.put( classMapping.getObfName(), classMapping ) == null; | 74 | boolean obfWasAdded = m_innerClassesByObf.put( classMapping.getObfName(), classMapping ) == null; |
| 74 | assert( obfWasAdded ); | 75 | assert( obfWasAdded ); |
| 75 | if( classMapping.getDeobfName() != null ) | 76 | if( classMapping.getDeobfName() != null ) |
| 76 | { | 77 | { |
| 78 | assert( isSimpleClassName( classMapping.getDeobfName() ) ); | ||
| 77 | boolean deobfWasAdded = m_innerClassesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null; | 79 | boolean deobfWasAdded = m_innerClassesByDeobf.put( classMapping.getDeobfName(), classMapping ) == null; |
| 78 | assert( deobfWasAdded ); | 80 | assert( deobfWasAdded ); |
| 79 | } | 81 | } |
| @@ -92,6 +94,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 92 | 94 | ||
| 93 | public ClassMapping getOrCreateInnerClass( String obfName ) | 95 | public ClassMapping getOrCreateInnerClass( String obfName ) |
| 94 | { | 96 | { |
| 97 | assert( isSimpleClassName( obfName ) ); | ||
| 95 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); | 98 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); |
| 96 | if( classMapping == null ) | 99 | if( classMapping == null ) |
| 97 | { | 100 | { |
| @@ -104,16 +107,19 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 104 | 107 | ||
| 105 | public ClassMapping getInnerClassByObf( String obfName ) | 108 | public ClassMapping getInnerClassByObf( String obfName ) |
| 106 | { | 109 | { |
| 110 | assert( isSimpleClassName( obfName ) ); | ||
| 107 | return m_innerClassesByObf.get( obfName ); | 111 | return m_innerClassesByObf.get( obfName ); |
| 108 | } | 112 | } |
| 109 | 113 | ||
| 110 | public ClassMapping getInnerClassByDeobf( String deobfName ) | 114 | public ClassMapping getInnerClassByDeobf( String deobfName ) |
| 111 | { | 115 | { |
| 116 | assert( isSimpleClassName( deobfName ) ); | ||
| 112 | return m_innerClassesByDeobf.get( deobfName ); | 117 | return m_innerClassesByDeobf.get( deobfName ); |
| 113 | } | 118 | } |
| 114 | 119 | ||
| 115 | public String getObfInnerClassName( String deobfName ) | 120 | public String getObfInnerClassName( String deobfName ) |
| 116 | { | 121 | { |
| 122 | assert( isSimpleClassName( deobfName ) ); | ||
| 117 | ClassMapping classMapping = m_innerClassesByDeobf.get( deobfName ); | 123 | ClassMapping classMapping = m_innerClassesByDeobf.get( deobfName ); |
| 118 | if( classMapping != null ) | 124 | if( classMapping != null ) |
| 119 | { | 125 | { |
| @@ -124,6 +130,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 124 | 130 | ||
| 125 | public String getDeobfInnerClassName( String obfName ) | 131 | public String getDeobfInnerClassName( String obfName ) |
| 126 | { | 132 | { |
| 133 | assert( isSimpleClassName( obfName ) ); | ||
| 127 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); | 134 | ClassMapping classMapping = m_innerClassesByObf.get( obfName ); |
| 128 | if( classMapping != null ) | 135 | if( classMapping != null ) |
| 129 | { | 136 | { |
| @@ -134,6 +141,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 134 | 141 | ||
| 135 | public void setInnerClassName( String obfName, String deobfName ) | 142 | public void setInnerClassName( String obfName, String deobfName ) |
| 136 | { | 143 | { |
| 144 | assert( isSimpleClassName( obfName ) ); | ||
| 137 | ClassMapping classMapping = getOrCreateInnerClass( obfName ); | 145 | ClassMapping classMapping = getOrCreateInnerClass( obfName ); |
| 138 | if( classMapping.getDeobfName() != null ) | 146 | if( classMapping.getDeobfName() != null ) |
| 139 | { | 147 | { |
| @@ -143,6 +151,7 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 143 | classMapping.setDeobfName( deobfName ); | 151 | classMapping.setDeobfName( deobfName ); |
| 144 | if( deobfName != null ) | 152 | if( deobfName != null ) |
| 145 | { | 153 | { |
| 154 | assert( isSimpleClassName( deobfName ) ); | ||
| 146 | boolean wasAdded = m_innerClassesByDeobf.put( deobfName, classMapping ) == null; | 155 | boolean wasAdded = m_innerClassesByDeobf.put( deobfName, classMapping ) == null; |
| 147 | assert( wasAdded ); | 156 | assert( wasAdded ); |
| 148 | } | 157 | } |
| @@ -442,4 +451,9 @@ public class ClassMapping implements Serializable, Comparable<ClassMapping> | |||
| 442 | } | 451 | } |
| 443 | return false; | 452 | return false; |
| 444 | } | 453 | } |
| 454 | |||
| 455 | public static boolean isSimpleClassName( String name ) | ||
| 456 | { | ||
| 457 | return name.indexOf( '/' ) < 0 && name.indexOf( '$' ) < 0; | ||
| 458 | } | ||
| 445 | } | 459 | } |
diff --git a/src/cuchaz/enigma/mapping/MappingsReader.java b/src/cuchaz/enigma/mapping/MappingsReader.java index 5cbad59..4bd9f12 100644 --- a/src/cuchaz/enigma/mapping/MappingsReader.java +++ b/src/cuchaz/enigma/mapping/MappingsReader.java | |||
| @@ -78,10 +78,11 @@ public class MappingsReader | |||
| 78 | 78 | ||
| 79 | if( token.equalsIgnoreCase( "CLASS" ) ) | 79 | if( token.equalsIgnoreCase( "CLASS" ) ) |
| 80 | { | 80 | { |
| 81 | ClassMapping classMapping = readClass( parts ); | 81 | ClassMapping classMapping; |
| 82 | if( indent == 0 ) | 82 | if( indent == 0 ) |
| 83 | { | 83 | { |
| 84 | // outer class | 84 | // outer class |
| 85 | classMapping = readClass( parts, false ); | ||
| 85 | mappings.addClassMapping( classMapping ); | 86 | mappings.addClassMapping( classMapping ); |
| 86 | } | 87 | } |
| 87 | else if( indent == 1 ) | 88 | else if( indent == 1 ) |
| @@ -91,11 +92,13 @@ public class MappingsReader | |||
| 91 | { | 92 | { |
| 92 | throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" ); | 93 | throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" ); |
| 93 | } | 94 | } |
| 95 | |||
| 96 | classMapping = readClass( parts, true ); | ||
| 94 | ((ClassMapping)mappingStack.getFirst()).addInnerClassMapping( classMapping ); | 97 | ((ClassMapping)mappingStack.getFirst()).addInnerClassMapping( classMapping ); |
| 95 | } | 98 | } |
| 96 | else | 99 | else |
| 97 | { | 100 | { |
| 98 | throw new MappingParseException( lineNumber, "Unexpected CLASS entry here!" ); | 101 | throw new MappingParseException( lineNumber, "Unexpected CLASS entry nesting!" ); |
| 99 | } | 102 | } |
| 100 | mappingStack.push( classMapping ); | 103 | mappingStack.push( classMapping ); |
| 101 | } | 104 | } |
| @@ -140,28 +143,30 @@ public class MappingsReader | |||
| 140 | return new ArgumentMapping( Integer.parseInt( parts[1] ), parts[2] ); | 143 | return new ArgumentMapping( Integer.parseInt( parts[1] ), parts[2] ); |
| 141 | } | 144 | } |
| 142 | 145 | ||
| 143 | private ClassMapping readClass( String[] parts ) | 146 | private ClassMapping readClass( String[] parts, boolean makeSimple ) |
| 144 | { | 147 | { |
| 145 | if( parts.length == 2 ) | 148 | if( parts.length == 2 ) |
| 146 | { | 149 | { |
| 147 | String obfName = parts[1]; | 150 | String obfName = processName( parts[1], makeSimple ); |
| 148 | return new ClassMapping( moveClassOutOfDefaultPackage( obfName, Constants.NonePackage ) ); | 151 | return new ClassMapping( obfName ); |
| 149 | } | 152 | } |
| 150 | else | 153 | else |
| 151 | { | 154 | { |
| 152 | String obfName = parts[1]; | 155 | String obfName = processName( parts[1], makeSimple ); |
| 153 | String deobfName = parts[2]; | 156 | String deobfName = processName( parts[2], makeSimple ); |
| 154 | if( obfName.equals( deobfName ) ) | 157 | return new ClassMapping( obfName, deobfName ); |
| 155 | { | 158 | } |
| 156 | return new ClassMapping( moveClassOutOfDefaultPackage( obfName, Constants.NonePackage ) ); | 159 | } |
| 157 | } | 160 | |
| 158 | else | 161 | private String processName( String name, boolean makeSimple ) |
| 159 | { | 162 | { |
| 160 | return new ClassMapping( | 163 | if( makeSimple ) |
| 161 | moveClassOutOfDefaultPackage( parts[1], Constants.NonePackage ), | 164 | { |
| 162 | moveClassOutOfDefaultPackage( parts[2], Constants.NonePackage ) | 165 | return new ClassEntry( name ).getSimpleName(); |
| 163 | ); | 166 | } |
| 164 | } | 167 | else |
| 168 | { | ||
| 169 | return moveClassOutOfDefaultPackage( name, Constants.NonePackage ); | ||
| 165 | } | 170 | } |
| 166 | } | 171 | } |
| 167 | 172 | ||
diff --git a/src/cuchaz/enigma/mapping/MappingsRenamer.java b/src/cuchaz/enigma/mapping/MappingsRenamer.java index 957b6d6..24ec731 100644 --- a/src/cuchaz/enigma/mapping/MappingsRenamer.java +++ b/src/cuchaz/enigma/mapping/MappingsRenamer.java | |||
| @@ -16,6 +16,7 @@ import java.io.OutputStream; | |||
| 16 | import java.util.Set; | 16 | import java.util.Set; |
| 17 | import java.util.zip.GZIPOutputStream; | 17 | import java.util.zip.GZIPOutputStream; |
| 18 | 18 | ||
| 19 | import cuchaz.enigma.Constants; | ||
| 19 | import cuchaz.enigma.analysis.JarIndex; | 20 | import cuchaz.enigma.analysis.JarIndex; |
| 20 | 21 | ||
| 21 | public class MappingsRenamer | 22 | public class MappingsRenamer |
| @@ -31,7 +32,7 @@ public class MappingsRenamer | |||
| 31 | 32 | ||
| 32 | public void setClassName( ClassEntry obf, String deobfName ) | 33 | public void setClassName( ClassEntry obf, String deobfName ) |
| 33 | { | 34 | { |
| 34 | deobfName = NameValidator.validateClassName( deobfName ); | 35 | deobfName = NameValidator.validateClassName( deobfName, !obf.isInnerClass() ); |
| 35 | ClassEntry targetEntry = new ClassEntry( deobfName ); | 36 | ClassEntry targetEntry = new ClassEntry( deobfName ); |
| 36 | if( m_mappings.containsDeobfClass( deobfName ) || m_index.containsObfClass( targetEntry ) ) | 37 | if( m_mappings.containsDeobfClass( deobfName ) || m_index.containsObfClass( targetEntry ) ) |
| 37 | { | 38 | { |
| @@ -77,7 +78,8 @@ public class MappingsRenamer | |||
| 77 | ClassMapping classMapping = getOrCreateClassMapping( obf ); | 78 | ClassMapping classMapping = getOrCreateClassMapping( obf ); |
| 78 | if( obf.isInnerClass() ) | 79 | if( obf.isInnerClass() ) |
| 79 | { | 80 | { |
| 80 | classMapping.setInnerClassName( obf.getName(), obf.getName() ); | 81 | String innerClassName = Constants.NonePackage + "/" + obf.getInnerClassName(); |
| 82 | classMapping.setInnerClassName( innerClassName, innerClassName ); | ||
| 81 | } | 83 | } |
| 82 | else | 84 | else |
| 83 | { | 85 | { |
diff --git a/src/cuchaz/enigma/mapping/NameValidator.java b/src/cuchaz/enigma/mapping/NameValidator.java index 9adf1ac..c6ae596 100644 --- a/src/cuchaz/enigma/mapping/NameValidator.java +++ b/src/cuchaz/enigma/mapping/NameValidator.java | |||
| @@ -55,7 +55,7 @@ public class NameValidator | |||
| 55 | ClassPattern = Pattern.compile( String.format( "^(%s(\\.|/))*(%s)$", identifierRegex, identifierRegex ) ); | 55 | ClassPattern = Pattern.compile( String.format( "^(%s(\\.|/))*(%s)$", identifierRegex, identifierRegex ) ); |
| 56 | } | 56 | } |
| 57 | 57 | ||
| 58 | public static String validateClassName( String name ) | 58 | public static String validateClassName( String name, boolean packageRequired ) |
| 59 | { | 59 | { |
| 60 | if( name == null ) | 60 | if( name == null ) |
| 61 | { | 61 | { |
| @@ -65,9 +65,9 @@ public class NameValidator | |||
| 65 | { | 65 | { |
| 66 | throw new IllegalNameException( name, "This doesn't look like a legal class name" ); | 66 | throw new IllegalNameException( name, "This doesn't look like a legal class name" ); |
| 67 | } | 67 | } |
| 68 | if( new ClassEntry( name ).getPackageName() == null ) | 68 | if( packageRequired && new ClassEntry( name ).getPackageName() == null ) |
| 69 | { | 69 | { |
| 70 | throw new IllegalNameException( name, "Classes must be in a package" ); | 70 | throw new IllegalNameException( name, "Class must be in a package" ); |
| 71 | } | 71 | } |
| 72 | return Descriptor.toJvmName( name ); | 72 | return Descriptor.toJvmName( name ); |
| 73 | } | 73 | } |
diff --git a/src/cuchaz/enigma/mapping/Translator.java b/src/cuchaz/enigma/mapping/Translator.java index 7904ef5..1c69b2f 100644 --- a/src/cuchaz/enigma/mapping/Translator.java +++ b/src/cuchaz/enigma/mapping/Translator.java | |||
| @@ -80,19 +80,26 @@ public class Translator | |||
| 80 | { | 80 | { |
| 81 | if( in.isInnerClass() ) | 81 | if( in.isInnerClass() ) |
| 82 | { | 82 | { |
| 83 | // look for the inner class | 83 | // translate the inner class |
| 84 | String translatedInnerClassName = m_direction.choose( | 84 | String translatedInnerClassName = m_direction.choose( |
| 85 | classMapping.getDeobfInnerClassName( in.getInnerClassName() ), | 85 | classMapping.getDeobfInnerClassName( in.getInnerClassName() ), |
| 86 | classMapping.getObfInnerClassName( in.getInnerClassName() ) | 86 | classMapping.getObfInnerClassName( in.getInnerClassName() ) |
| 87 | ); | 87 | ); |
| 88 | if( translatedInnerClassName != null ) | 88 | if( translatedInnerClassName != null ) |
| 89 | { | 89 | { |
| 90 | // return outer$inner | 90 | // try to translate the outer name |
| 91 | String translatedOuterClassName = m_direction.choose( | 91 | String translatedOuterClassName = m_direction.choose( |
| 92 | classMapping.getDeobfName(), | 92 | classMapping.getDeobfName(), |
| 93 | classMapping.getObfName() | 93 | classMapping.getObfName() |
| 94 | ); | 94 | ); |
| 95 | return translatedOuterClassName + "$" + translatedInnerClassName; | 95 | if( translatedOuterClassName != null ) |
| 96 | { | ||
| 97 | return translatedOuterClassName + "$" + translatedInnerClassName; | ||
| 98 | } | ||
| 99 | else | ||
| 100 | { | ||
| 101 | return in.getOuterClassName() + "$" + translatedInnerClassName; | ||
| 102 | } | ||
| 96 | } | 103 | } |
| 97 | } | 104 | } |
| 98 | else | 105 | else |
| @@ -109,6 +116,7 @@ public class Translator | |||
| 109 | 116 | ||
| 110 | public ClassEntry translateEntry( ClassEntry in ) | 117 | public ClassEntry translateEntry( ClassEntry in ) |
| 111 | { | 118 | { |
| 119 | // can we translate the inner class? | ||
| 112 | String name = translate( in ); | 120 | String name = translate( in ); |
| 113 | if( name != null ) | 121 | if( name != null ) |
| 114 | { | 122 | { |
| @@ -117,13 +125,14 @@ public class Translator | |||
| 117 | 125 | ||
| 118 | if( in.isInnerClass() ) | 126 | if( in.isInnerClass() ) |
| 119 | { | 127 | { |
| 120 | // just translate the outer class name | 128 | // guess not. just translate the outer class name then |
| 121 | String outerClassName = translate( in.getOuterClassEntry() ); | 129 | String outerClassName = translate( in.getOuterClassEntry() ); |
| 122 | if( outerClassName != null ) | 130 | if( outerClassName != null ) |
| 123 | { | 131 | { |
| 124 | return new ClassEntry( outerClassName + "$" + in.getInnerClassName() ); | 132 | return new ClassEntry( outerClassName + "$" + in.getInnerClassName() ); |
| 125 | } | 133 | } |
| 126 | } | 134 | } |
| 135 | |||
| 127 | return in; | 136 | return in; |
| 128 | } | 137 | } |
| 129 | 138 | ||