| 1 21 package proguard.classfile.util; 22 23 import proguard.classfile.*; 24 import proguard.classfile.visitor.*; 25 26 import java.util.*; 27 28 42 public class MethodLinker 43 extends SimplifiedVisitor 44 implements ClassVisitor, 45 MemberVisitor 46 { 47 private final Map memberMap = new HashMap(); 50 51 52 54 public void visitAnyClass(Clazz clazz) 55 { 56 clazz.hierarchyAccept(true, true, true, false, 58 new AllMethodVisitor( 59 new MemberAccessFilter(0, ClassConstants.INTERNAL_ACC_PRIVATE, 60 this))); 61 62 memberMap.clear(); 64 } 65 66 67 69 public void visitAnyMember(Clazz clazz, Member member) 70 { 71 String name = member.getName(clazz); 73 String descriptor = member.getDescriptor(clazz); 74 75 if (name.equals(ClassConstants.INTERNAL_METHOD_NAME_CLINIT) || 78 name.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)) 79 { 80 return; 81 } 82 83 Member thisLastMember = lastMember(member); 85 86 String key = name + ' ' + descriptor; 89 Member otherMember = (Member)memberMap.get(key); 90 91 if (otherMember == null) 92 { 93 memberMap.put(key, thisLastMember); 95 } 96 else 97 { 98 Member otherLastMember = lastMember(otherMember); 100 101 if (!thisLastMember.equals(otherLastMember)) 103 { 104 if (otherLastMember instanceof LibraryMember) 106 { 107 thisLastMember.setVisitorInfo(otherLastMember); 108 } 109 else 110 { 111 otherLastMember.setVisitorInfo(thisLastMember); 112 } 113 } 114 } 115 } 116 117 118 120 125 public static Member lastMember(Member member) 126 { 127 Member lastMember = member; 128 while (lastMember.getVisitorInfo() != null && 129 lastMember.getVisitorInfo() instanceof Member) 130 { 131 lastMember = (Member)lastMember.getVisitorInfo(); 132 } 133 134 return lastMember; 135 } 136 137 138 143 public static VisitorAccepter lastVisitorAccepter(VisitorAccepter visitorAccepter) 144 { 145 VisitorAccepter lastVisitorAccepter = visitorAccepter; 146 while (lastVisitorAccepter.getVisitorInfo() != null && 147 lastVisitorAccepter.getVisitorInfo() instanceof VisitorAccepter) 148 { 149 lastVisitorAccepter = (VisitorAccepter)lastVisitorAccepter.getVisitorInfo(); 150 } 151 152 return lastVisitorAccepter; 153 } 154 } 155 | Popular Tags |