| 1 32 package net.sf.retrotranslator.transformer; 33 34 import java.util.*; 35 import net.sf.retrotranslator.runtime.asm.*; 36 37 40 class DuplicateMethodsVisitor extends ClassAdapter { 41 42 private final SystemLogger logger; 43 private final MethodCounter counter; 44 private final Set<String > visitedMethods = new HashSet<String >(); 45 46 public DuplicateMethodsVisitor(ClassVisitor visitor, SystemLogger logger, MethodCounter counter) { 47 super(visitor); 48 this.logger = logger; 49 this.counter = counter; 50 } 51 52 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String [] exceptions) { 53 String key = name + desc; 54 if (visitedMethods.contains(key)) { 55 log(access, name); 56 return null; 57 } 58 if (counter.isRepetitive(name, desc) && isBridge(access)) { 59 counter.decrement(name, desc); 60 log(access, name); 61 return null; 62 } 63 visitedMethods.add(key); 64 return super.visitMethod(access, name, desc, signature, exceptions); 65 } 66 67 private void log(int access, String name) { 68 if (logger != null) { 69 if (isBridge(access)) { 70 logger.logForFile(Level.VERBOSE, "Bridge method removed: " + name); 71 } else { 72 logger.logForFile(Level.WARNING, "Repetitive method removed: " + name); 73 } 74 } 75 } 76 77 private static boolean isBridge(int access) { 78 return (access & Opcodes.ACC_BRIDGE) != 0; 79 } 80 81 } 82 | Popular Tags |