1 32 package net.sf.retrotranslator.transformer; 33 34 import net.sf.retrotranslator.runtime.asm.*; 35 36 39 abstract class GenericClassVisitor extends NameTranslator implements ClassVisitor { 40 41 private final ClassVisitor classVisitor; 42 43 public GenericClassVisitor(ClassVisitor classVisitor) { 44 this.classVisitor = classVisitor; 45 } 46 47 public void visit(int version, int access, String name, String signature, String superName, String [] interfaces) { 48 classVisitor.visit(version, access, typeName(name), 49 declarationSignature(signature), typeName(superName), typeNames(interfaces)); 50 } 51 52 public void visitSource(String source, String debug) { 53 classVisitor.visitSource(source, debug); 54 } 55 56 public void visitOuterClass(String owner, String name, String desc) { 57 classVisitor.visitOuterClass(typeName(owner), identifier(name), methodDescriptor(desc)); 58 } 59 60 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 61 return wrap(classVisitor.visitAnnotation(typeDescriptor(desc), visible)); 62 } 63 64 public void visitAttribute(Attribute attr) { 65 classVisitor.visitAttribute(attr); 66 } 67 68 public void visitInnerClass(String name, String outerName, String innerName, int access) { 69 classVisitor.visitInnerClass(typeName(name), typeName(outerName), identifier(innerName), access); 70 } 71 72 public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { 73 FieldVisitor result = classVisitor.visitField(access, 74 identifier(name), typeDescriptor(desc), typeSignature(signature), value); 75 return result == null ? null : new GenericFieldVisitor(result); 76 } 77 78 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String [] exceptions) { 79 MethodVisitor result = classVisitor.visitMethod(access, 80 identifier(name), methodDescriptor(desc), declarationSignature(signature), typeNames(exceptions)); 81 return result == null ? null : new GenericMethodVisitor(result); 82 } 83 84 protected void visitTypeInstruction(MethodVisitor visitor, int opcode, String desc) { 85 visitor.visitTypeInsn(opcode, typeNameOrTypeDescriptor(desc)); 86 } 87 88 protected void visitFieldInstruction(MethodVisitor visitor, int opcode, String owner, String name, String desc) { 89 visitor.visitFieldInsn(opcode, typeName(owner), identifier(name), typeDescriptor(desc)); 90 } 91 92 protected void visitMethodInstruction(MethodVisitor visitor, int opcode, String owner, String name, String desc) { 93 visitor.visitMethodInsn(opcode, typeNameOrTypeDescriptor(owner), identifier(name), methodDescriptor(desc)); 94 } 95 96 public void visitEnd() { 97 classVisitor.visitEnd(); 98 } 99 100 private AnnotationVisitor wrap(AnnotationVisitor av) { 101 return av == null ? null : new GenericAnnotationVisitor(av); 102 } 103 104 private class GenericAnnotationVisitor implements AnnotationVisitor { 105 106 private AnnotationVisitor annotationVisitor; 107 108 public GenericAnnotationVisitor(AnnotationVisitor annotationVisitor) { 109 this.annotationVisitor = annotationVisitor; 110 } 111 112 public void visit(String name, Object value) { 113 annotationVisitor.visit(identifier(name), typeOrValue(value)); 114 } 115 116 public void visitEnum(String name, String desc, String value) { 117 annotationVisitor.visitEnum(identifier(name), typeDescriptor(desc), value); 118 } 119 120 public AnnotationVisitor visitAnnotation(String name, String desc) { 121 return wrap(annotationVisitor.visitAnnotation(identifier(name), typeDescriptor(desc))); 122 } 123 124 public AnnotationVisitor visitArray(String name) { 125 return wrap(annotationVisitor.visitArray(identifier(name))); 126 } 127 128 public void visitEnd() { 129 annotationVisitor.visitEnd(); 130 } 131 } 132 133 private class GenericFieldVisitor implements FieldVisitor { 134 135 private FieldVisitor fieldVisitor; 136 137 public GenericFieldVisitor(FieldVisitor fieldVisitor) { 138 this.fieldVisitor = fieldVisitor; 139 } 140 141 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 142 return wrap(fieldVisitor.visitAnnotation(typeDescriptor(desc), visible)); 143 } 144 145 public void visitAttribute(Attribute attr) { 146 fieldVisitor.visitAttribute(attr); 147 } 148 149 public void visitEnd() { 150 fieldVisitor.visitEnd(); 151 } 152 } 153 154 private class GenericMethodVisitor implements MethodVisitor { 155 156 protected final MethodVisitor mv; 157 private String deferredConstant; 158 159 public GenericMethodVisitor(MethodVisitor visitor) { 160 mv = visitor; 161 } 162 163 private void flush() { 164 if (deferredConstant != null) { 165 mv.visitLdcInsn(deferredConstant); 166 deferredConstant = null; 167 } 168 } 169 170 public AnnotationVisitor visitAnnotationDefault() { 171 flush(); 172 return wrap(mv.visitAnnotationDefault()); 173 } 174 175 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 176 flush(); 177 return wrap(mv.visitAnnotation(typeDescriptor(desc), visible)); 178 } 179 180 public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { 181 flush(); 182 return wrap(mv.visitParameterAnnotation(parameter, typeDescriptor(desc), visible)); 183 } 184 185 public void visitTypeInsn(int opcode, String desc) { 186 flush(); 187 visitTypeInstruction(mv, opcode, desc); 188 } 189 190 public void visitFieldInsn(int opcode, String owner, String name, String desc) { 191 flush(); 192 visitFieldInstruction(mv, opcode, owner, name, desc); 193 } 194 195 public void visitMethodInsn(int opcode, String owner, String name, String desc) { 196 if (deferredConstant != null && deferredConstant.indexOf('/') < 0 && 197 opcode == Opcodes.INVOKESTATIC && name.equals("class$") && 198 desc.equals(TransformerTools.descriptor(Class .class, String .class))) { 199 deferredConstant = typeNameOrTypeDescriptor(deferredConstant.replace('.', '/')).replace('/', '.'); 200 } 201 flush(); 202 visitMethodInstruction(mv, opcode, owner, name, desc); 203 } 204 205 public void visitLdcInsn(Object cst) { 206 flush(); 207 if (cst instanceof String ) { 208 deferredConstant = (String ) cst; 209 } else { 210 mv.visitLdcInsn(typeOrValue(cst)); 211 } 212 } 213 214 public void visitMultiANewArrayInsn(String desc, int dims) { 215 flush(); 216 mv.visitMultiANewArrayInsn(typeDescriptor(desc), dims); 217 } 218 219 public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { 220 flush(); 221 mv.visitTryCatchBlock(start, end, handler, typeName(type)); 222 } 223 224 public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { 225 flush(); 226 mv.visitLocalVariable(identifier(name), typeDescriptor(desc), typeSignature(signature), start, end, index); 227 } 228 229 public void visitAttribute(Attribute attr) { 230 flush(); 231 mv.visitAttribute(attr); 232 } 233 234 public void visitCode() { 235 flush(); 236 mv.visitCode(); 237 } 238 239 public void visitInsn(int opcode) { 240 flush(); 241 mv.visitInsn(opcode); 242 } 243 244 public void visitIntInsn(int opcode, int operand) { 245 flush(); 246 mv.visitIntInsn(opcode, operand); 247 } 248 249 public void visitVarInsn(int opcode, int var) { 250 flush(); 251 mv.visitVarInsn(opcode, var); 252 } 253 254 public void visitJumpInsn(int opcode, Label label) { 255 flush(); 256 mv.visitJumpInsn(opcode, label); 257 } 258 259 public void visitLabel(Label label) { 260 flush(); 261 mv.visitLabel(label); 262 } 263 264 public void visitIincInsn(int var, int increment) { 265 flush(); 266 mv.visitIincInsn(var, increment); 267 } 268 269 public void visitTableSwitchInsn(int min, int max, Label dflt, Label labels[]) { 270 flush(); 271 mv.visitTableSwitchInsn(min, max, dflt, labels); 272 } 273 274 public void visitLookupSwitchInsn(Label dflt, int keys[], Label labels[]) { 275 flush(); 276 mv.visitLookupSwitchInsn(dflt, keys, labels); 277 } 278 279 public void visitLineNumber(int line, Label start) { 280 flush(); 281 mv.visitLineNumber(line, start); 282 } 283 284 public void visitMaxs(int maxStack, int maxLocals) { 285 flush(); 286 mv.visitMaxs(maxStack, maxLocals); 287 } 288 289 public void visitEnd() { 290 flush(); 291 mv.visitEnd(); 292 } 293 } 294 295 } 296 | Popular Tags |