1 19 20 package edu.umd.cs.findbugs.detect; 21 22 import java.util.HashMap ; 23 import java.util.Map ; 24 25 import org.apache.bcel.classfile.Field; 26 import org.apache.bcel.classfile.JavaClass; 27 import org.apache.bcel.classfile.Method; 28 import org.apache.bcel.classfile.Synthetic; 29 30 import edu.umd.cs.findbugs.ba.AnalysisContext; 31 import edu.umd.cs.findbugs.ba.AnnotationDatabase; 32 import edu.umd.cs.findbugs.ba.CheckReturnValueAnnotation; 33 import edu.umd.cs.findbugs.ba.XFactory; 34 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor; 35 36 43 44 public class BuildCheckReturnAnnotationDatabase extends AnnotationVisitor { 45 46 private static final String DEFAULT_ANNOTATION_ANNOTATION_CLASS = "DefaultAnnotation"; 47 48 private static final Map <String , String > defaultKind = new HashMap <String , String >(); 49 static { 50 defaultKind.put("", AnnotationDatabase.ANY); 51 defaultKind.put("ForParameters", AnnotationDatabase.PARAMETER); 52 defaultKind.put("ForMethods", AnnotationDatabase.METHOD); 53 defaultKind.put("ForFields", AnnotationDatabase.FIELD); 54 55 } 56 57 public BuildCheckReturnAnnotationDatabase() { 58 59 } 60 61 static String lastPortion(String className) { 62 int i = className.lastIndexOf("."); 63 if (i < 0) 64 return className; 65 return className.substring(i + 1); 66 } 67 68 @Override public void visit(JavaClass obj) { 69 if (obj.isSynthetic()) 70 AnalysisContext.currentAnalysisContext() 71 .getCheckReturnAnnotationDatabase().addSyntheticElement( 72 getDottedClassName()); 73 } 74 @Override public void visit(Field f) { 75 if (f.isSynthetic()) 76 AnalysisContext.currentAnalysisContext() 77 .getCheckReturnAnnotationDatabase().addSyntheticElement( 78 XFactory.createXField(this)); 79 } 80 @Override public void visit(Method m) { 81 if (m.isSynthetic()) 82 AnalysisContext.currentAnalysisContext() 83 .getCheckReturnAnnotationDatabase().addSyntheticElement( 84 XFactory.createXMethod(this)); 85 } 86 87 @Override public void visit(Synthetic a) { 88 if (visitingMethod()) { 89 AnalysisContext.currentAnalysisContext() 90 .getCheckReturnAnnotationDatabase().addSyntheticElement( 91 XFactory.createXMethod(this)); 92 } else if (visitingField()) { 93 AnalysisContext.currentAnalysisContext() 94 .getCheckReturnAnnotationDatabase().addSyntheticElement( 95 XFactory.createXField(this)); 96 } else { 97 AnalysisContext.currentAnalysisContext() 98 .getCheckReturnAnnotationDatabase().addSyntheticElement( 99 getDottedClassName()); 100 } 101 } 102 @Override 103 public void visitAnnotation(String annotationClass, 104 Map <String , Object > map, boolean runtimeVisible) { 105 106 annotationClass = lastPortion(annotationClass); 107 108 CheckReturnValueAnnotation n = CheckReturnValueAnnotation.parse(annotationClass, (String ) map.get("priority")); 109 if (n == null) { 110 if (annotationClass.startsWith("DefaultAnnotation")) { 111 112 Object v = map.get("value"); 113 if (v == null || !(v instanceof Object [])) 114 return; 115 annotationClass = annotationClass.substring("DefaultAnnotation" 116 .length()); 117 118 String annotationTarget = defaultKind.get(annotationClass); 119 120 if (annotationTarget != null) 121 for (Object aClass : (Object []) v) { 122 n = CheckReturnValueAnnotation.parse((String ) aClass, (String ) map.get("priority")); 123 if (n != null) 124 AnalysisContext.currentAnalysisContext() 125 .getCheckReturnAnnotationDatabase() 126 .addDefaultAnnotation(annotationTarget, 127 getDottedClassName(), n); 128 } 129 130 } 131 } 132 else if (visitingMethod()) 133 AnalysisContext.currentAnalysisContext() 134 .getCheckReturnAnnotationDatabase().addDirectAnnotation( 135 XFactory.createXMethod(this), n); 136 137 138 } 139 140 141 142 } 143 | Popular Tags |