1 21 package proguard.obfuscate; 22 23 import proguard.classfile.util.*; 24 import proguard.classfile.*; 25 import proguard.classfile.visitor.MemberVisitor; 26 27 import java.util.Map ; 28 29 36 public class MemberNameConflictFixer implements MemberVisitor 37 { 38 private boolean allowAggressiveOverloading; 39 private Map descriptorMap; 40 private WarningPrinter warningPrinter; 41 private MemberObfuscator memberObfuscator; 42 43 44 57 public MemberNameConflictFixer(boolean allowAggressiveOverloading, 58 Map descriptorMap, 59 WarningPrinter warningPrinter, 60 MemberObfuscator memberObfuscator) 61 { 62 this.allowAggressiveOverloading = allowAggressiveOverloading; 63 this.descriptorMap = descriptorMap; 64 this.warningPrinter = warningPrinter; 65 this.memberObfuscator = memberObfuscator; 66 } 67 68 69 70 71 73 public void visitProgramField(ProgramClass programClass, ProgramField programField) 74 { 75 visitMember(programClass, programField, true); 76 } 77 78 79 public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod) 80 { 81 String name = programMethod.getName(programClass); 84 if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || 85 name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)) 86 { 87 return; 88 } 89 90 visitMember(programClass, programMethod, false); 91 } 92 93 94 public void visitLibraryField(LibraryClass libraryClass, LibraryField libraryField) {} 95 public void visitLibraryMethod(LibraryClass libraryClass, LibraryMethod libraryMethod) {} 96 97 98 104 private void visitMember(Clazz clazz, 105 Member member, 106 boolean isField) 107 { 108 String name = member.getName(clazz); 110 String descriptor = member.getDescriptor(clazz); 111 112 if (!allowAggressiveOverloading) 114 { 115 descriptor = descriptor.substring(0, descriptor.indexOf(')')+1); 118 } 119 120 Map nameMap = MemberObfuscator.retrieveNameMap(descriptorMap, descriptor); 122 123 String newName = MemberObfuscator.newMemberName(member); 125 126 String previousName = (String )nameMap.get(newName); 127 if (!name.equals(previousName)) 128 { 129 if (MemberObfuscator.hasFixedNewMemberName(member) && 134 warningPrinter != null) 135 { 136 descriptor = member.getDescriptor(clazz); 137 warningPrinter.print("Warning: " + ClassUtil.externalClassName(clazz.getName()) + 138 (isField ? 139 ": field '" + ClassUtil.externalFullFieldDescription(0, name, descriptor) : 140 ": method '" + ClassUtil.externalFullMethodDescription(clazz.getName(), 0, name, descriptor)) + 141 "' can't be mapped to '" + newName + 142 "' because it would conflict with " + 143 (isField ? 144 "field '" : 145 "method '" ) + previousName + 146 "', which is already being mapped to '" + newName + "'"); 147 } 148 149 MemberObfuscator.setNewMemberName(member, null); 151 152 member.accept(clazz, memberObfuscator); 154 } 155 } 156 } 157 | Popular Tags |