summaryrefslogtreecommitdiff
path: root/src/cuchaz/enigma/mapping
diff options
context:
space:
mode:
authorGravatar jeff2014-09-30 00:25:36 -0400
committerGravatar jeff2014-09-30 00:25:36 -0400
commita83bbfd5c510367a194073b1db132022cacf65ed (patch)
treeabfd7520b79ef1e64b7430bd81e75a30353b7f14 /src/cuchaz/enigma/mapping
parentfixed recognition of static initializer tokens (diff)
downloadenigma-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.java18
-rw-r--r--src/cuchaz/enigma/mapping/MappingsReader.java41
-rw-r--r--src/cuchaz/enigma/mapping/MappingsRenamer.java6
-rw-r--r--src/cuchaz/enigma/mapping/NameValidator.java6
-rw-r--r--src/cuchaz/enigma/mapping/Translator.java17
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;
16import java.util.Set; 16import java.util.Set;
17import java.util.zip.GZIPOutputStream; 17import java.util.zip.GZIPOutputStream;
18 18
19import cuchaz.enigma.Constants;
19import cuchaz.enigma.analysis.JarIndex; 20import cuchaz.enigma.analysis.JarIndex;
20 21
21public class MappingsRenamer 22public 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