/** * */ package org.joogie.soot; import java.util.LinkedList; import java.util.List; import soot.SootField; import soot.SootMethod; import soot.tagkit.AnnotationTag; import soot.tagkit.IntegerConstantValueTag; import soot.tagkit.SignatureTag; import soot.tagkit.StringConstantValueTag; import soot.tagkit.Tag; import soot.tagkit.VisibilityAnnotationTag; import soot.tagkit.VisibilityParameterAnnotationTag; import util.Log; /** * @author schaef * */ public class SootAnnotations { public enum Annotation { NonNull; } public static LinkedList<SootAnnotations.Annotation> parseFieldTags(SootField sf) { List<Tag> tags = sf.getTags(); LinkedList<SootAnnotations.Annotation> annot = null; for (Tag t : tags) { if (t instanceof VisibilityAnnotationTag) { if (annot!=null) { throw new RuntimeException("Bug in parseFieldTags"); } annot = parseAnnotations((VisibilityAnnotationTag)t); } else if (t instanceof SignatureTag) { //TODO: do we want to do something with that? } else if (t instanceof StringConstantValueTag) { } else if (t instanceof IntegerConstantValueTag) { } else { Log.error("Unimplemented Tag found: "+t.getName()); } } if (annot == null) annot = new LinkedList<SootAnnotations.Annotation>(); return annot; } public static LinkedList<SootAnnotations.Annotation> parseAnnotations(VisibilityAnnotationTag vtag) { LinkedList<SootAnnotations.Annotation> annot = new LinkedList<SootAnnotations.Annotation>(); if (vtag == null || vtag.getAnnotations()==null) { //no annotation return annot; } for (AnnotationTag at : vtag.getAnnotations()) { addTagToList(annot, at); } return annot; } public static LinkedList<LinkedList<SootAnnotations.Annotation>> parseParameterAnnotations(SootMethod m) { LinkedList<LinkedList<SootAnnotations.Annotation>> pannot = new LinkedList<LinkedList<SootAnnotations.Annotation>>(); for (Tag t : m.getTags()) { if (t instanceof VisibilityParameterAnnotationTag) { VisibilityParameterAnnotationTag tag = (VisibilityParameterAnnotationTag)t; if (tag.getVisibilityAnnotations().size() != m.getParameterCount()) { throw new RuntimeException("number of tags does not match number of params ... I did not understand this part!"); } for (VisibilityAnnotationTag va : tag.getVisibilityAnnotations()) { pannot.add(parseAnnotations(va)); } } } return pannot; } private static void addTagToList(LinkedList<SootAnnotations.Annotation> annot, AnnotationTag at) { if (at!=null) { if (at.getType().contains("Lorg/eclipse/jdt/annotation/NonNull")) { Log.info("@NonNull found" ); annot.add(Annotation.NonNull); } else if (at.getType().contains("Lsun/reflect/CallerSensitive")) { Log.debug("Not sure what to do with this tag. Ignoring it: "+at.getType()); } else if (at.getType().contains("Ljava/lang/SafeVarargs")) { //TODO: we could actually check that! Log.debug("Not sure what to do with this tag. Ignoring it: "+at.getType()); } else { // Log.debug("Unhandled Annotation "+at); } } else { //no annotation } } }