diff --git a/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java b/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java index f57d107a..8af92b77 100644 --- a/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java +++ b/dexlib/src/main/java/org/jf/dexlib/AnnotationDirectoryItem.java @@ -103,30 +103,67 @@ public class AnnotationDirectoryItem extends Item { * DexFile * @param dexFile The DexFile that this item belongs to * @param classAnnotations The annotations associated with the class - * @param fieldAnnotationFields An array of FieldIdItem objects that the annotations in - * fieldAnnotations are associated with - * @param fieldAnnotations An array of AnnotationSetItem objects that contain the annotations for the - * fields in fieldAnnotationFields - * @param methodAnnotationMethods An array of MethodIdItem objects that the annotations in - * methodAnnotations are associated with - * @param methodAnnotations An array of AnnotationSetItem objects that contain the annotations for the - * methods in methodAnnotationMethods - * @param parameterAnnotationMethods An array of MethodIdItem objects that the annotations in - * parameterAnnotations are associated with - * @param parameterAnnotations An array of AnnotationSetRefList objects that contain the parameter - * annotations for the methods in parameterAnnotationMethods + * @param fieldAnnotations A list of FieldAnnotation objects containing the field annotations + * @param methodAnnotations A list of MethodAnnotation objects containing the method annotations + * @param parameterAnnotations A list of ParameterAnnotation objects containin the parameter + * annotations * @return an AnnotationItem for the given values, and that has been interned into the given * DexFile */ public static AnnotationDirectoryItem getInternedAnnotationDirectoryItem(DexFile dexFile, AnnotationSetItem classAnnotations, - FieldIdItem[] fieldAnnotationFields, AnnotationSetItem[] fieldAnnotations, - MethodIdItem[] methodAnnotationMethods, AnnotationSetItem[] methodAnnotations, - MethodIdItem[] parameterAnnotationMethods, - AnnotationSetRefList[] parameterAnnotations) { + List fieldAnnotations, + List methodAnnotations, + List parameterAnnotations) { + FieldIdItem[] fieldAnnotationFields = null; + AnnotationSetItem[] fieldAnnotationsArray = null; + MethodIdItem[] methodAnnotationMethods = null; + AnnotationSetItem[] methodAnnotationsArray = null; + MethodIdItem[] parameterAnnotationMethods = null; + AnnotationSetRefList[] parameterAnnotationsArray = null; + + if (fieldAnnotations != null && fieldAnnotations.size() > 0) { + fieldAnnotationFields = new FieldIdItem[fieldAnnotations.size()]; + fieldAnnotationsArray = new AnnotationSetItem[fieldAnnotations.size()]; + + Collections.sort(fieldAnnotations); + + int index = 0; + for (FieldAnnotation fieldAnnotation: fieldAnnotations) { + fieldAnnotationFields[index] = fieldAnnotation.field; + fieldAnnotationsArray[index++] = fieldAnnotation.annotationSet; + } + } + + if (methodAnnotations != null && methodAnnotations.size() > 0) { + methodAnnotationMethods = new MethodIdItem[methodAnnotations.size()]; + methodAnnotationsArray = new AnnotationSetItem[methodAnnotations.size()]; + + Collections.sort(methodAnnotations); + + int index = 0; + for (MethodAnnotation methodAnnotation: methodAnnotations) { + methodAnnotationMethods[index] = methodAnnotation.method; + methodAnnotationsArray[index++] = methodAnnotation.annotationSet; + } + } + + if (parameterAnnotations != null && parameterAnnotations.size() > 0) { + parameterAnnotationMethods = new MethodIdItem[parameterAnnotations.size()]; + parameterAnnotationsArray = new AnnotationSetRefList[parameterAnnotations.size()]; + + Collections.sort(parameterAnnotations); + + int index = 0; + for (ParameterAnnotation parameterAnnotation: parameterAnnotations) { + parameterAnnotationMethods[index] = parameterAnnotation.method; + parameterAnnotationsArray[index++] = parameterAnnotation.annotationSet; + } + } + AnnotationDirectoryItem annotationDirectoryItem = new AnnotationDirectoryItem(dexFile, classAnnotations, - fieldAnnotationFields, fieldAnnotations, methodAnnotationMethods, methodAnnotations, - parameterAnnotationMethods, parameterAnnotations); + fieldAnnotationFields, fieldAnnotationsArray, methodAnnotationMethods, methodAnnotationsArray, + parameterAnnotationMethods, parameterAnnotationsArray); return dexFile.AnnotationDirectoriesSection.intern(annotationDirectoryItem); } @@ -362,4 +399,46 @@ public class AnnotationDirectoryItem extends Item { AnnotationDirectoryItem other = (AnnotationDirectoryItem)o; return (this.compareTo(other) == 0); } + + public static class FieldAnnotation implements Comparable { + public final FieldIdItem field; + public final AnnotationSetItem annotationSet; + + public FieldAnnotation(FieldIdItem field, AnnotationSetItem annotationSet) { + this.field = field; + this.annotationSet = annotationSet; + } + + public int compareTo(FieldAnnotation other) { + return field.compareTo(other.field); + } + } + + public static class MethodAnnotation implements Comparable { + public final MethodIdItem method; + public final AnnotationSetItem annotationSet; + + public MethodAnnotation(MethodIdItem method, AnnotationSetItem annotationSet) { + this.method = method; + this.annotationSet = annotationSet; + } + + public int compareTo(MethodAnnotation other) { + return method.compareTo(other.method); + } + } + + public static class ParameterAnnotation implements Comparable { + public final MethodIdItem method; + public final AnnotationSetRefList annotationSet; + + public ParameterAnnotation(MethodIdItem method, AnnotationSetRefList annotationSet) { + this.method = method; + this.annotationSet = annotationSet; + } + + public int compareTo(ParameterAnnotation other) { + return method.compareTo(other.method); + } + } }