1 21 package proguard.classfile.util; 22 23 import proguard.classfile.visitor.ClassVisitor; 24 import proguard.classfile.constant.visitor.ConstantVisitor; 25 import proguard.classfile.constant.ClassConstant; 26 import proguard.classfile.*; 27 28 41 public class ClassSuperHierarchyInitializer 42 extends SimplifiedVisitor 43 implements ClassVisitor, 44 ConstantVisitor 45 { 46 private ClassPool programClassPool; 47 private ClassPool libraryClassPool; 48 private WarningPrinter warningPrinter; 49 50 51 56 public ClassSuperHierarchyInitializer(ClassPool programClassPool, 57 ClassPool libraryClassPool, 58 WarningPrinter warningPrinter) 59 { 60 this.programClassPool = programClassPool; 61 this.libraryClassPool = libraryClassPool; 62 this.warningPrinter = warningPrinter; 63 } 64 65 66 68 public void visitProgramClass(ProgramClass programClass) 69 { 70 if (programClass.u2superClass != 0) 72 { 73 programClass.constantPoolEntryAccept(programClass.u2superClass, 74 this); 75 } 76 77 for (int index = 0; index < programClass.u2interfacesCount; index++) 79 { 80 programClass.constantPoolEntryAccept(programClass.u2interfaces[index], 81 this); 82 } 83 } 84 85 86 public void visitLibraryClass(LibraryClass libraryClass) 87 { 88 String className = libraryClass.getName(); 89 90 String superClassName = libraryClass.superClassName; 92 if (superClassName != null) 93 { 94 libraryClass.superClass = findClass(className, superClassName); 96 } 97 98 if (libraryClass.interfaceNames != null) 100 { 101 String [] interfaceNames = libraryClass.interfaceNames; 102 Clazz[] interfaceClasses = new Clazz[interfaceNames.length]; 103 104 for (int index = 0; index < interfaceNames.length; index++) 105 { 106 interfaceClasses[index] = 108 findClass(className, interfaceNames[index]); 109 } 110 111 libraryClass.interfaceClasses = interfaceClasses; 112 } 113 114 libraryClass.superClassName = null; 117 libraryClass.interfaceNames = null; 118 } 119 120 121 123 public void visitClassConstant(Clazz clazz, ClassConstant classConstant) 124 { 125 classConstant.referencedClass = 126 findClass(clazz.getName(), classConstant.getName(clazz)); 127 } 128 129 130 132 136 private Clazz findClass(String subClassName, String name) 137 { 138 Clazz clazz = programClassPool.getClass(name); 140 141 if (clazz == null) 143 { 144 clazz = libraryClassPool.getClass(name); 145 } 146 147 if (clazz == null && 148 warningPrinter != null) 149 { 150 warningPrinter.print("Warning: " + 152 ClassUtil.externalClassName(subClassName) + 153 ": can't find superclass or interface " + 154 ClassUtil.externalClassName(name)); 155 } 156 157 return clazz; 158 } 159 } 160 | Popular Tags |