KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > net > sf > retrotranslator > transformer > GenericClassVisitor


1 /***
2  * Retrotranslator: a Java bytecode transformer that translates Java classes
3  * compiled with JDK 5.0 into classes that can be run on JVM 1.4.
4  *
5  * Copyright (c) 2005 - 2007 Taras Puchko
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  * notice, this list of conditions and the following disclaimer in the
15  * documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the copyright holders nor the names of its
17  * contributors may be used to endorse or promote products derived from
18  * this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
30  * THE POSSIBILITY OF SUCH DAMAGE.
31  */

32 package net.sf.retrotranslator.transformer;
33
34 import net.sf.retrotranslator.runtime.asm.*;
35
36 /**
37  * @author Taras Puchko
38  */

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 JavaDoc name, String JavaDoc signature, String JavaDoc superName, String JavaDoc[] interfaces) {
48         classVisitor.visit(version, access, typeName(name),
49                 declarationSignature(signature), typeName(superName), typeNames(interfaces));
50     }
51
52     public void visitSource(String JavaDoc source, String JavaDoc debug) {
53         classVisitor.visitSource(source, debug);
54     }
55
56     public void visitOuterClass(String JavaDoc owner, String JavaDoc name, String JavaDoc desc) {
57         classVisitor.visitOuterClass(typeName(owner), identifier(name), methodDescriptor(desc));
58     }
59
60     public AnnotationVisitor visitAnnotation(String JavaDoc 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 JavaDoc name, String JavaDoc outerName, String JavaDoc innerName, int access) {
69         classVisitor.visitInnerClass(typeName(name), typeName(outerName), identifier(innerName), access);
70     }
71
72     public FieldVisitor visitField(int access, String JavaDoc name, String JavaDoc desc, String JavaDoc signature, Object JavaDoc 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 JavaDoc name, String JavaDoc desc, String JavaDoc signature, String JavaDoc[] 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 JavaDoc desc) {
85         visitor.visitTypeInsn(opcode, typeNameOrTypeDescriptor(desc));
86     }
87
88     protected void visitFieldInstruction(MethodVisitor visitor, int opcode, String JavaDoc owner, String JavaDoc name, String JavaDoc desc) {
89         visitor.visitFieldInsn(opcode, typeName(owner), identifier(name), typeDescriptor(desc));
90     }
91
92     protected void visitMethodInstruction(MethodVisitor visitor, int opcode, String JavaDoc owner, String JavaDoc name, String JavaDoc 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 JavaDoc name, Object JavaDoc value) {
113             annotationVisitor.visit(identifier(name), typeOrValue(value));
114         }
115
116         public void visitEnum(String JavaDoc name, String JavaDoc desc, String JavaDoc value) {
117             annotationVisitor.visitEnum(identifier(name), typeDescriptor(desc), value);
118         }
119
120         public AnnotationVisitor visitAnnotation(String JavaDoc name, String JavaDoc desc) {
121             return wrap(annotationVisitor.visitAnnotation(identifier(name), typeDescriptor(desc)));
122         }
123
124         public AnnotationVisitor visitArray(String JavaDoc 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 JavaDoc 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 JavaDoc 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 JavaDoc desc, boolean visible) {
176             flush();
177             return wrap(mv.visitAnnotation(typeDescriptor(desc), visible));
178         }
179
180         public AnnotationVisitor visitParameterAnnotation(int parameter, String JavaDoc desc, boolean visible) {
181             flush();
182             return wrap(mv.visitParameterAnnotation(parameter, typeDescriptor(desc), visible));
183         }
184
185         public void visitTypeInsn(int opcode, String JavaDoc desc) {
186             flush();
187             visitTypeInstruction(mv, opcode, desc);
188         }
189
190         public void visitFieldInsn(int opcode, String JavaDoc owner, String JavaDoc name, String JavaDoc desc) {
191             flush();
192             visitFieldInstruction(mv, opcode, owner, name, desc);
193         }
194
195         public void visitMethodInsn(int opcode, String JavaDoc owner, String JavaDoc name, String JavaDoc desc) {
196             if (deferredConstant != null && deferredConstant.indexOf('/') < 0 &&
197                     opcode == Opcodes.INVOKESTATIC && name.equals("class$") &&
198                     desc.equals(TransformerTools.descriptor(Class JavaDoc.class, String JavaDoc.class))) {
199                 deferredConstant = typeNameOrTypeDescriptor(deferredConstant.replace('.', '/')).replace('/', '.');
200             }
201             flush();
202             visitMethodInstruction(mv, opcode, owner, name, desc);
203         }
204
205         public void visitLdcInsn(Object JavaDoc cst) {
206             flush();
207             if (cst instanceof String JavaDoc) {
208                 deferredConstant = (String JavaDoc) cst;
209             } else {
210                 mv.visitLdcInsn(typeOrValue(cst));
211             }
212         }
213
214         public void visitMultiANewArrayInsn(String JavaDoc desc, int dims) {
215             flush();
216             mv.visitMultiANewArrayInsn(typeDescriptor(desc), dims);
217         }
218
219         public void visitTryCatchBlock(Label start, Label end, Label handler, String JavaDoc type) {
220             flush();
221             mv.visitTryCatchBlock(start, end, handler, typeName(type));
222         }
223
224         public void visitLocalVariable(String JavaDoc name, String JavaDoc desc, String JavaDoc 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