1 package jp.sourceforge.stigmata.birthmarks.uc;
7 import jp.sourceforge.stigmata.Birthmark;
8 import jp.sourceforge.stigmata.BirthmarkContext;
9 import jp.sourceforge.stigmata.BirthmarkElement;
10 import jp.sourceforge.stigmata.birthmarks.BirthmarkExtractVisitor;
12 import org.objectweb.asm.ClassVisitor;
13 import org.objectweb.asm.FieldVisitor;
14 import org.objectweb.asm.Label;
15 import org.objectweb.asm.MethodAdapter;
16 import org.objectweb.asm.MethodVisitor;
17 import org.objectweb.asm.Type;
18 import org.objectweb.asm.signature.SignatureReader;
19 import org.objectweb.asm.signature.SignatureWriter;
23 * @author Haruaki TAMADA
26 public class UsedClassesBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
27 public UsedClassesBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark,
28 BirthmarkContext context){
29 super(visitor, birthmark, context);
33 public void visit(int version, int access, String name, String signature,
34 String superName, String[] interfaces){
35 addSignatureClass(signature);
37 if(getEnvironment().getWellknownClassManager().isWellKnownClass(superName)){
40 for(String i: interfaces){
41 if(getEnvironment().getWellknownClassManager().isWellKnownClass(i)){
48 public FieldVisitor visitField(int access, String name, String desc,
49 String signature, Object value){
50 FieldVisitor visitor = super.visitField(access, name, desc, signature, value);
53 addSignatureClass(signature);
59 public MethodVisitor visitMethod(int access, String name, String desc,
60 String signature, String[] exceptions){
61 if(exceptions != null){
62 for(String exception: exceptions){
63 if(getEnvironment().getWellknownClassManager().isWellKnownClass(exception)){
68 addMethodDescriptor(desc);
69 addSignatureClass(signature);
71 MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
73 return new MethodAdapter(visitor){
75 public void visitTypeInsn(int opcode, String desc){
76 Type type = Type.getType("L" + desc + ";");
80 super.visitTypeInsn(opcode, desc);
84 public void visitTryCatchBlock(Label start, Label end, Label handle, String desc){
85 Type type = Type.getType("L" + desc + ";");
89 super.visitTryCatchBlock(start, end, handle, desc);
93 public void visitMultiANewArrayInsn(String desc, int dims){
94 Type type = Type.getType(desc);
98 super.visitMultiANewArrayInsn(desc, dims);
102 public void visitLocalVariable(String name, String desc, String signature,
103 Label start, Label end, int index){
104 if(checkType(Type.getType(desc))){
107 addSignatureClass(signature);
109 super.visitLocalVariable(name, desc, signature, start, end, index);
113 public void visitFieldInsn(int opcode, String owner, String name, String desc){
114 if(getEnvironment().getWellknownClassManager().isWellKnownClass(owner)){
118 super.visitFieldInsn(opcode, owner, name, desc);
121 public void visitMethodInsn(int opcode, String owner, String name, String desc){
122 String className = normalize(owner);
123 if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
126 addMethodDescriptor(desc);
127 super.visitMethodInsn(opcode, owner, name, desc);
132 private void addSignatureClass(String signature){
133 if(signature != null){
134 SignatureReader in = new SignatureReader(signature);
135 SignatureWriter writer = new SignatureWriter(){
137 public void visitClassType(String classType){
138 if(getEnvironment().getWellknownClassManager().isWellKnownClass(classType)){
147 private void addMethodDescriptor(String desc){
148 Type returnType = Type.getReturnType(desc);
149 Type[] args = Type.getArgumentTypes(desc);
150 if(checkType(returnType)){
151 add(getType(returnType));
160 private void addDescriptor(String desc){
161 Type type = Type.getType(desc);
167 private String getType(Type type){
168 if(type.getSort() == Type.ARRAY){
169 while(type.getSort() != Type.ARRAY){
170 type = type.getElementType();
174 if(type.getSort() == Type.OBJECT){
175 return normalize(type.getClassName());
181 private boolean checkType(Type type){
182 if(type.getSort() == Type.ARRAY){
183 while(type.getSort() != Type.ARRAY){
184 type = type.getElementType();
188 if(type.getSort() == Type.OBJECT){
189 String className = type.getClassName();
190 if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
197 private String normalize(String name){
198 if(name.startsWith("L") && name.endsWith(";")){
199 name = name.substring(1, name.length() - 1);
201 name = name.replace('/', '.');
206 private void add(String name){
207 addElement(new BirthmarkElement(normalize(name)));