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.SystemProperties; 31 import edu.umd.cs.findbugs.ba.AnalysisContext; 32 import edu.umd.cs.findbugs.ba.AnnotationDatabase; 33 import edu.umd.cs.findbugs.ba.NullnessAnnotation; 34 import edu.umd.cs.findbugs.ba.XFactory; 35 import edu.umd.cs.findbugs.ba.XMethod; 36 import edu.umd.cs.findbugs.ba.XMethodParameter; 37 import edu.umd.cs.findbugs.visitclass.AnnotationVisitor; 38 39 46 public class BuildNonNullAnnotationDatabase extends AnnotationVisitor { 47 private static final boolean DEBUG = SystemProperties.getBoolean("fnd.debug.annotation"); 48 49 private static final String DEFAULT_ANNOTATION_ANNOTATION_CLASS = "DefaultAnnotation"; 50 51 private static final Map <String , String > defaultKind = new HashMap <String , String >(); 52 static { 53 defaultKind.put("", AnnotationDatabase.ANY); 54 defaultKind.put("ForParameters", AnnotationDatabase.PARAMETER); 55 defaultKind.put("ForMethods", AnnotationDatabase.METHOD); 56 defaultKind.put("ForFields", AnnotationDatabase.FIELD); 57 58 } 59 60 public BuildNonNullAnnotationDatabase() { 61 62 } 63 64 static String lastPortion(String className) { 65 int i = className.lastIndexOf("."); 66 if (i < 0) 67 return className; 68 return className.substring(i + 1); 69 } 70 71 @Override public void visit(Synthetic a) { 72 if (visitingMethod()) { 73 AnalysisContext.currentAnalysisContext() 74 .getNullnessAnnotationDatabase().addSyntheticElement( 75 XFactory.createXMethod(this)); 76 } else if (visitingField()) { 77 AnalysisContext.currentAnalysisContext() 78 .getNullnessAnnotationDatabase().addSyntheticElement( 79 XFactory.createXField(this)); 80 } else { 81 AnalysisContext.currentAnalysisContext() 82 .getNullnessAnnotationDatabase().addSyntheticElement( 83 getDottedClassName()); 84 } 85 } 86 @Override public void visit(JavaClass obj) { 87 if (obj.isSynthetic()) 88 AnalysisContext.currentAnalysisContext() 89 .getNullnessAnnotationDatabase().addSyntheticElement( 90 getDottedClassName()); 91 } 92 @Override public void visit(Field f) { 93 if (f.isSynthetic()) 94 AnalysisContext.currentAnalysisContext() 95 .getNullnessAnnotationDatabase().addSyntheticElement( 96 XFactory.createXField(this)); 97 } 98 99 @Override public void visit(Method m) { 100 if (m.isSynthetic()) 101 AnalysisContext.currentAnalysisContext() 102 .getNullnessAnnotationDatabase().addSyntheticElement( 103 XFactory.createXMethod(this)); 104 } 105 106 @Override 107 public void visitAnnotation(String annotationClass, 108 Map <String , Object > map, boolean runtimeVisible) { 109 110 111 112 NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass); 113 annotationClass = lastPortion(annotationClass); 114 if (n == null) { 115 if (annotationClass.startsWith("DefaultAnnotation")) { 116 117 Object v = map.get("value"); 118 if (v == null || !(v instanceof Object [])) 119 return; 120 annotationClass = annotationClass.substring("DefaultAnnotation" 121 .length()); 122 123 String annotationTarget = defaultKind.get(annotationClass); 124 125 if (annotationTarget != null) 126 for (Object aClass : (Object []) v) { 127 n = NullnessAnnotation.Parser.parse((String ) aClass); 128 if (n != null) 129 AnalysisContext.currentAnalysisContext() 130 .getNullnessAnnotationDatabase() 131 .addDefaultAnnotation(annotationTarget, 132 getDottedClassName(), n); 133 } 134 135 } 136 } 137 else if (visitingMethod()) 138 AnalysisContext.currentAnalysisContext() 139 .getNullnessAnnotationDatabase().addDirectAnnotation( 140 XFactory.createXMethod(this), n); 141 else if (visitingField()) 142 AnalysisContext.currentAnalysisContext() 143 .getNullnessAnnotationDatabase().addDirectAnnotation( 144 XFactory.createXField(this), n); 145 146 } 147 @Override 148 public void visitSyntheticParameterAnnotation(int p, boolean runtimeVisible) { 149 150 XMethod xmethod = XFactory.createXMethod(this); 151 152 XMethodParameter xparameter = new XMethodParameter(xmethod, p); 153 154 AnalysisContext.currentAnalysisContext() 155 .getNullnessAnnotationDatabase().addDirectAnnotation( 156 xparameter, NullnessAnnotation.UNKNOWN_NULLNESS); 157 158 } 159 160 161 @Override 162 public void visitParameterAnnotation(int p, String annotationClass, 163 Map <String , Object > map, boolean runtimeVisible) { 164 annotationClass = lastPortion(annotationClass); 165 NullnessAnnotation n = NullnessAnnotation.Parser.parse(annotationClass); 166 167 if (n == null) 168 return; 169 170 XMethod xmethod = XFactory.createXMethod(this); 171 if (DEBUG) { 172 System.out.println("Parameter " 173 + p 174 + " @" 175 + annotationClass.substring(annotationClass 176 .lastIndexOf('/') + 1) + " in " 177 + xmethod.toString()); 178 } 179 XMethodParameter xparameter = new XMethodParameter(xmethod, p); 180 181 AnalysisContext.currentAnalysisContext() 182 .getNullnessAnnotationDatabase().addDirectAnnotation( 183 xparameter, n); 184 185 } 186 187 } 188 | Popular Tags |