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
25 public class UsedClassesBirthmarkExtractVisitor extends BirthmarkExtractVisitor{
26 public UsedClassesBirthmarkExtractVisitor(ClassVisitor visitor, Birthmark birthmark,
27 BirthmarkContext context){
28 super(visitor, birthmark, context);
32 public void visit(int version, int access, String name, String signature,
33 String superName, String[] interfaces){
34 addSignatureClass(signature);
36 if(getEnvironment().getWellknownClassManager().isWellKnownClass(superName)){
39 for(String i: interfaces){
40 if(getEnvironment().getWellknownClassManager().isWellKnownClass(i)){
47 public FieldVisitor visitField(int access, String name, String desc,
48 String signature, Object value){
49 FieldVisitor visitor = super.visitField(access, name, desc, signature, value);
52 addSignatureClass(signature);
58 public MethodVisitor visitMethod(int access, String name, String desc,
59 String signature, String[] exceptions){
60 if(exceptions != null){
61 for(String exception: exceptions){
62 if(getEnvironment().getWellknownClassManager().isWellKnownClass(exception)){
67 addMethodDescriptor(desc);
68 addSignatureClass(signature);
70 MethodVisitor visitor = super.visitMethod(access, name, desc, signature, exceptions);
72 return new MethodAdapter(visitor){
74 public void visitTypeInsn(int opcode, String desc){
75 Type type = Type.getType("L" + desc + ";");
79 super.visitTypeInsn(opcode, desc);
83 public void visitTryCatchBlock(Label start, Label end, Label handle, String desc){
84 Type type = Type.getType("L" + desc + ";");
88 super.visitTryCatchBlock(start, end, handle, desc);
92 public void visitMultiANewArrayInsn(String desc, int dims){
93 Type type = Type.getType(desc);
97 super.visitMultiANewArrayInsn(desc, dims);
101 public void visitLocalVariable(String name, String desc, String signature,
102 Label start, Label end, int index){
103 if(checkType(Type.getType(desc))){
106 addSignatureClass(signature);
108 super.visitLocalVariable(name, desc, signature, start, end, index);
112 public void visitFieldInsn(int opcode, String owner, String name, String desc){
113 if(getEnvironment().getWellknownClassManager().isWellKnownClass(owner)){
117 super.visitFieldInsn(opcode, owner, name, desc);
120 public void visitMethodInsn(int opcode, String owner, String name, String desc){
121 String className = normalize(owner);
122 if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
125 addMethodDescriptor(desc);
126 super.visitMethodInsn(opcode, owner, name, desc);
131 private void addSignatureClass(String signature){
132 if(signature != null){
133 SignatureReader in = new SignatureReader(signature);
134 SignatureWriter writer = new SignatureWriter(){
136 public void visitClassType(String classType){
137 if(getEnvironment().getWellknownClassManager().isWellKnownClass(classType)){
146 private void addMethodDescriptor(String desc){
147 Type returnType = Type.getReturnType(desc);
148 Type[] args = Type.getArgumentTypes(desc);
149 if(checkType(returnType)){
150 add(getType(returnType));
159 private void addDescriptor(String desc){
160 Type type = Type.getType(desc);
166 private String getType(Type type){
167 if(type.getSort() == Type.ARRAY){
168 while(type.getSort() != Type.ARRAY){
169 type = type.getElementType();
173 if(type.getSort() == Type.OBJECT){
174 return normalize(type.getClassName());
180 private boolean checkType(Type type){
181 if(type.getSort() == Type.ARRAY){
182 while(type.getSort() != Type.ARRAY){
183 type = type.getElementType();
187 if(type.getSort() == Type.OBJECT){
188 String className = type.getClassName();
189 if(getEnvironment().getWellknownClassManager().isWellKnownClass(className)){
196 private String normalize(String name){
197 if(name.startsWith("L") && name.endsWith(";")){
198 name = name.substring(1, name.length() - 1);
200 name = name.replace('/', '.');
205 private void add(String name){
206 addElement(new BirthmarkElement(normalize(name)));