From 4e9c52d5fc5d23e8a77857e712654596203acb31 Mon Sep 17 00:00:00 2001 From: jeff Date: Sun, 31 Aug 2014 16:14:45 -0400 Subject: fixed mapping conversion bug with class rename order --- src/cuchaz/enigma/mapping/ClassMapping.java | 36 ++++++++++++++++------------ src/cuchaz/enigma/mapping/Mappings.java | 28 +++++++--------------- src/cuchaz/enigma/mapping/MethodMapping.java | 16 +++++++++---- 3 files changed, 41 insertions(+), 39 deletions(-) (limited to 'src/cuchaz/enigma/mapping') diff --git a/src/cuchaz/enigma/mapping/ClassMapping.java b/src/cuchaz/enigma/mapping/ClassMapping.java index 095cb38..1219e7c 100644 --- a/src/cuchaz/enigma/mapping/ClassMapping.java +++ b/src/cuchaz/enigma/mapping/ClassMapping.java @@ -301,31 +301,37 @@ public class ClassMapping implements Serializable, Comparable return m_obfName.compareTo( other.m_obfName ); } - public void renameObfClasses( Map nameMap ) + public boolean renameObfClass( String oldObfClassName, String newObfClassName ) { - // rename self + // rename inner classes + for( ClassMapping innerClassMapping : new ArrayList( m_innerClassesByObf.values() ) ) { - String newName = nameMap.get( m_obfName ); - if( newName != null ) + if( innerClassMapping.renameObfClass( oldObfClassName, newObfClassName ) ) { - m_obfName = newName; + m_innerClassesByObf.remove( oldObfClassName ); + m_innerClassesByObf.put( newObfClassName, innerClassMapping ); + assert( m_innerClassesByObf.size() == m_innerClassesByDeobf.size() ); } } - // rename inner classes - for( ClassMapping classMapping : new ArrayList( m_innerClassesByObf.values() ) ) + // rename method signatures + for( MethodMapping methodMapping : new ArrayList( m_methodsByObf.values() ) ) { - m_innerClassesByObf.remove( classMapping.getObfName() ); - classMapping.renameObfClasses( nameMap ); - m_innerClassesByObf.put( classMapping.getObfName(), classMapping ); + String oldMethodKey = getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ); + if( methodMapping.renameObfClass( oldObfClassName, newObfClassName ) ) + { + m_methodsByObf.remove( oldMethodKey ); + m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); + assert( m_methodsByObf.size() == m_methodsByDeobf.size() ); + } } - // rename method signatures - for( MethodMapping methodMapping : new ArrayList( m_methodsByObf.values() ) ) + if( m_obfName.equals( oldObfClassName ) ) { - m_methodsByObf.remove( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ) ); - methodMapping.renameObfClasses( nameMap ); - m_methodsByObf.put( getMethodKey( methodMapping.getObfName(), methodMapping.getObfSignature() ), methodMapping ); + // rename this class + m_obfName = newObfClassName; + return true; } + return false; } } diff --git a/src/cuchaz/enigma/mapping/Mappings.java b/src/cuchaz/enigma/mapping/Mappings.java index 4b47d16..0b03abb 100644 --- a/src/cuchaz/enigma/mapping/Mappings.java +++ b/src/cuchaz/enigma/mapping/Mappings.java @@ -15,6 +15,7 @@ import java.io.InputStream; import java.io.ObjectInputStream; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collection; import java.util.Map; import java.util.Set; import java.util.zip.GZIPInputStream; @@ -66,7 +67,7 @@ public class Mappings implements Serializable } } - public Iterable classes( ) + public Collection classes( ) { assert( m_classesByObf.size() == m_classesByDeobf.size() ); return m_classesByObf.values(); @@ -141,30 +142,19 @@ public class Mappings implements Serializable return buf.toString(); } - public void renameObfClasses( Map nameMap ) + public void renameObfClass( String oldObfName, String newObfName ) { - for( ClassMapping classMapping : new ArrayList( m_classesByObf.values() ) ) + for( ClassMapping classMapping : new ArrayList( classes() ) ) { - String newName = nameMap.get( classMapping.getObfName() ); - if( newName != null ) + if( classMapping.renameObfClass( oldObfName, newObfName ) ) { - m_classesByObf.remove( classMapping.getObfName() ); - classMapping.renameObfClasses( nameMap ); - m_classesByObf.put( classMapping.getObfName(), classMapping ); + m_classesByObf.remove( oldObfName ); + m_classesByObf.put( newObfName, classMapping ); + assert( m_classesByObf.size() == m_classesByDeobf.size() ); } } } - - public void removeClassByObfName( String obfName ) - { - ClassMapping classMapping = m_classesByObf.get( obfName ); - if( classMapping != null ) - { - m_classesByObf.remove( classMapping.getObfName() ); - m_classesByDeobf.remove( classMapping.getDeobfName() ); - } - } - + public Set getAllObfClassNames( ) { final Set classNames = Sets.newHashSet(); diff --git a/src/cuchaz/enigma/mapping/MethodMapping.java b/src/cuchaz/enigma/mapping/MethodMapping.java index fe4e29b..b0f7ba8 100644 --- a/src/cuchaz/enigma/mapping/MethodMapping.java +++ b/src/cuchaz/enigma/mapping/MethodMapping.java @@ -142,21 +142,27 @@ public class MethodMapping implements Serializable, Comparable return ( m_obfName + m_obfSignature ).compareTo( ( other.m_obfName + other.m_obfSignature ) ); } - public void renameObfClasses( final Map nameMap ) + public boolean renameObfClass( final String oldObfClassName, final String newObfClassName ) { // rename obf classes in the signature - m_obfSignature = SignatureUpdater.update( m_obfSignature, new ClassNameUpdater( ) + String newSignature = SignatureUpdater.update( m_obfSignature, new ClassNameUpdater( ) { @Override public String update( String className ) { - String newName = nameMap.get( className ); - if( newName != null ) + if( className.equals( oldObfClassName ) ) { - return newName; + return newObfClassName; } return className; } } ); + + if( newSignature != m_obfSignature ) + { + m_obfSignature = newSignature; + return true; + } + return false; } } -- cgit v1.2.3