1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.cf; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttAnnotationDefault; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttEnclosingMethod; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttExceptions; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttInnerClasses; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeInvisibleAnnotations; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeInvisibleParameterAnnotations; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeVisibleAnnotations; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttRuntimeVisibleParameterAnnotations; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.AttSignature; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.attrib.InnerClassList; 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.direct.DirectClassFile; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.AttributeList; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.Method; 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.cf.iface.MethodList; 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.dex.file.AnnotationUtils; 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotation; 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationVisibility; 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotations; 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationsList; 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.NameValuePair; 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.AccessFlags; 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstMethodRef; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstNat; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType; 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.StdTypeList; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeList; 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Warning; 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Utility methods that translate various classfile attributes 5199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * into forms suitable for use in creating {@code dex} files. 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*package*/ class AttributeTranslator { 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is uninstantiable. 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private AttributeTranslator() { 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // This space intentionally left blank. 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the list of thrown exceptions for a given method. 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method in question 6599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the list of thrown exceptions 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static TypeList getExceptions(Method method) { 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs = method.getAttributes(); 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttExceptions exceptions = (AttExceptions) 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttExceptions.ATTRIBUTE_NAME); 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (exceptions == null) { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return StdTypeList.EMPTY; 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return exceptions.getExceptions(); 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the annotations out of a given {@link AttributeList}. This 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * combines both visible and invisible annotations into a single 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * result set and also adds in a system annotation for the 8399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code Signature} attribute if present. 84de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param attribs {@code non-null;} the attributes list to search in 8699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the set of annotations, which may be empty 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static Annotations getAnnotations(AttributeList attribs) { 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations result = getAnnotations0(attribs); 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation signature = getSignature(attribs); 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (signature != null) { 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = Annotations.combine(result, signature); 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the annotations out of a given class, similar to {@link 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * #getAnnotations}, also including annotations for translations 10299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * of class-level attributes {@code EnclosingMethod} and 10399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code InnerClasses}, if present. Additionally, if the 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class is an annotation class, then this also includes a 10599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * representation of all the {@code AnnotationDefault} 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * values. 107de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 10899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param cf {@code non-null;} the class in question 10999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param args {@code non-null;} the high-level options 11099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the set of annotations, which may be empty 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static Annotations getClassAnnotations(DirectClassFile cf, 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CfOptions args) { 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstType thisClass = cf.getThisClass(); 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs = cf.getAttributes(); 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations result = getAnnotations(attribs); 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation enclosingMethod = translateEnclosingMethod(attribs); 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project try { 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations innerClassAnnotations = 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project translateInnerClasses(thisClass, attribs, 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project enclosingMethod == null); 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (innerClassAnnotations != null) { 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = Annotations.combine(result, innerClassAnnotations); 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } catch (Warning warn) { 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project args.warn.println("warning: " + warn.getMessage()); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosingMethod != null) { 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = Annotations.combine(result, enclosingMethod); 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (AccessFlags.isAnnotation(cf.getAccessFlags())) { 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation annotationDefault = 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project translateAnnotationDefaults(cf); 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotationDefault != null) { 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = Annotations.combine(result, annotationDefault); 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the annotations out of a given method, similar to {@link 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * #getAnnotations}, also including an annotation for the translation 14899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * of the method-specific attribute {@code Exceptions}. 149de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method in question 15199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the set of annotations, which may be empty 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static Annotations getMethodAnnotations(Method method) { 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations result = getAnnotations(method.getAttributes()); 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project TypeList exceptions = getExceptions(method); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (exceptions.size() != 0) { 158de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro Annotation throwsAnnotation = 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AnnotationUtils.makeThrows(exceptions); 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result = Annotations.combine(result, throwsAnnotation); 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 165de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Helper method for {@link #getAnnotations} which just gets the 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * existing annotations, per se. 169de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 17099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param attribs {@code non-null;} the attributes list to search in 17199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code non-null;} the set of annotations, which may be empty 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static Annotations getAnnotations0(AttributeList attribs) { 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeVisibleAnnotations visible = 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (AttRuntimeVisibleAnnotations) 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttRuntimeVisibleAnnotations.ATTRIBUTE_NAME); 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeInvisibleAnnotations invisible = 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (AttRuntimeInvisibleAnnotations) 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttRuntimeInvisibleAnnotations.ATTRIBUTE_NAME); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (visible == null) { 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (invisible == null) { 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Annotations.EMPTY; 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return invisible.getAnnotations(); 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (invisible == null) { 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return visible.getAnnotations(); 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Both are non-null, so combine them. 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return Annotations.combine(visible.getAnnotations(), 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project invisible.getAnnotations()); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 19999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code Signature} attribute out of a given 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link AttributeList}, if any, translating it to an annotation. 201de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 20299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param attribs {@code non-null;} the attributes list to search in 20399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the converted {@code Signature} annotation, 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * if there was an attribute to translate 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static Annotation getSignature(AttributeList attribs) { 207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttSignature signature = (AttSignature) 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttSignature.ATTRIBUTE_NAME); 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (signature == null) { 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationUtils.makeSignature(signature.getSignature()); 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 21899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code EnclosingMethod} attribute out of a given 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link AttributeList}, if any, translating it to an annotation. 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * If the class really has an enclosing method, this returns an 22199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code EnclosingMethod} annotation; if not, this returns 22299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * an {@code EnclosingClass} annotation. 223de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 22499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param attribs {@code non-null;} the attributes list to search in 22599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the converted {@code EnclosingMethod} or 22699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code EnclosingClass} annotation, if there was an 227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * attribute to translate 228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static Annotation translateEnclosingMethod(AttributeList attribs) { 230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttEnclosingMethod enclosingMethod = (AttEnclosingMethod) 231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttEnclosingMethod.ATTRIBUTE_NAME); 232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (enclosingMethod == null) { 234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstType enclosingClass = enclosingMethod.getEnclosingClass(); 238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstNat nat = enclosingMethod.getMethod(); 239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (nat == null) { 241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Dalvik doesn't use EnclosingMethod annotations unless 243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * there really is an enclosing method. Anonymous classes 244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * are unambiguously identified by having an InnerClass 245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * annotation with an empty name along with an appropriate 246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * EnclosingClass. 247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationUtils.makeEnclosingClass(enclosingClass); 249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationUtils.makeEnclosingMethod( 252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new CstMethodRef(enclosingClass, nat)); 253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 25699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code InnerClasses} attribute out of a given 257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link AttributeList}, if any, translating it to one or more of an 25899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code InnerClass}, {@code EnclosingClass}, or 25999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code MemberClasses} annotation. 260351d37d93c8e2e8fe2e7534f28ff8eac122a92fbDan Bornstein * 261ec022295682131fd8ebd4619343060fd3554319bDan Bornstein * @param thisClass {@code non-null;} type representing the class being 262ec022295682131fd8ebd4619343060fd3554319bDan Bornstein * processed 26399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param attribs {@code non-null;} the attributes list to search in 264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @param needEnclosingClass whether to include an 26599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code EnclosingClass} annotation 26699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} the converted list of annotations, if there 267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * was an attribute to translate 268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static Annotations translateInnerClasses(CstType thisClass, 270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs, boolean needEnclosingClass) { 271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttInnerClasses innerClasses = (AttInnerClasses) 272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttInnerClasses.ATTRIBUTE_NAME); 273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (innerClasses == null) { 275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Search the list for the element representing the current class 280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * as well as for any named member classes. 281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InnerClassList list = innerClasses.getInnerClasses(); 284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int size = list.size(); 285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InnerClassList.Item foundThisClass = null; 286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ArrayList<Type> membersList = new ArrayList<Type>(); 287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < size; i++) { 289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project InnerClassList.Item item = list.get(i); 290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstType innerClass = item.getInnerClass(); 291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (innerClass.equals(thisClass)) { 292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project foundThisClass = item; 293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (thisClass.equals(item.getOuterClass())) { 294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project membersList.add(innerClass.getClassType()); 295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int membersSize = membersList.size(); 299de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if ((foundThisClass == null) && (membersSize == 0)) { 301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotations result = new Annotations(); 305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (foundThisClass != null) { 307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.add(AnnotationUtils.makeInnerClass( 308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project foundThisClass.getInnerName(), 309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project foundThisClass.getAccessFlags())); 310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (needEnclosingClass) { 311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstType outer = foundThisClass.getOuterClass(); 312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (outer == null) { 313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new Warning( 314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project "Ignoring InnerClasses attribute for an " + 315ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "anonymous inner class\n" + 316ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "(" + thisClass.toHuman() + 317ec022295682131fd8ebd4619343060fd3554319bDan Bornstein ") that doesn't come with an\n" + 318ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "associated EnclosingMethod attribute. " + 319ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "This class was probably produced by a\n" + 320ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "compiler that did not target the modern " + 321ec022295682131fd8ebd4619343060fd3554319bDan Bornstein ".class file format. The recommended\n" + 322ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "solution is to recompile the class from " + 323ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "source, using an up-to-date compiler\n" + 324ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "and without specifying any \"-target\" type " + 325ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "options. The consequence of ignoring\n" + 326ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "this warning is that reflective operations " + 327ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "on this class will incorrectly\n" + 328ec022295682131fd8ebd4619343060fd3554319bDan Bornstein "indicate that it is *not* an inner class."); 329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.add(AnnotationUtils.makeEnclosingClass( 331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project foundThisClass.getOuterClass())); 332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (membersSize != 0) { 336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project StdTypeList typeList = new StdTypeList(membersSize); 337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < membersSize; i++) { 338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeList.set(i, membersList.get(i)); 339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project typeList.setImmutable(); 341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.add(AnnotationUtils.makeMemberClasses(typeList)); 342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.setImmutable(); 345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return result; 346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Gets the parameter annotations out of a given method. This 350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * combines both visible and invisible annotations into a single 351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * result set. 352de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 35399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param method {@code non-null;} the method in question 354ec022295682131fd8ebd4619343060fd3554319bDan Bornstein * @return {@code non-null;} the list of annotation sets, which may be 355ec022295682131fd8ebd4619343060fd3554319bDan Bornstein * empty 356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static AnnotationsList getParameterAnnotations(Method method) { 358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs = method.getAttributes(); 359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeVisibleParameterAnnotations visible = 360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (AttRuntimeVisibleParameterAnnotations) 361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst( 362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeVisibleParameterAnnotations.ATTRIBUTE_NAME); 363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeInvisibleParameterAnnotations invisible = 364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project (AttRuntimeInvisibleParameterAnnotations) 365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst( 366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttRuntimeInvisibleParameterAnnotations.ATTRIBUTE_NAME); 367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (visible == null) { 369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (invisible == null) { 370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationsList.EMPTY; 371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return invisible.getParameterAnnotations(); 373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (invisible == null) { 376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return visible.getParameterAnnotations(); 377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Both are non-null, so combine them. 380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationsList.combine(visible.getParameterAnnotations(), 382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project invisible.getParameterAnnotations()); 383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 38699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * Gets the {@code AnnotationDefault} attributes out of a 387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * given class, if any, reforming them as an 38899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code AnnotationDefault} annotation. 389de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 39099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param cf {@code non-null;} the class in question 39199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code null-ok;} an appropriately-constructed 39299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code AnnotationDefault} annotation, if there were any 39399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * annotation defaults in the class, or {@code null} if not 394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static Annotation translateAnnotationDefaults(DirectClassFile cf) { 396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstType thisClass = cf.getThisClass(); 397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project MethodList methods = cf.getMethods(); 398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = methods.size(); 399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Annotation result = 400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new Annotation(thisClass, AnnotationVisibility.EMBEDDED); 401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean any = false; 402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Method one = methods.get(i); 405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttributeList attribs = one.getAttributes(); 406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AttAnnotationDefault oneDefault = (AttAnnotationDefault) 407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project attribs.findFirst(AttAnnotationDefault.ATTRIBUTE_NAME); 408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (oneDefault != null) { 410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project NameValuePair pair = new NameValuePair( 411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project one.getNat().getName(), 412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project oneDefault.getValue()); 413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.add(pair); 414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project any = true; 415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (! any) { 419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return null; 420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project result.setImmutable(); 423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return AnnotationUtils.makeAnnotationDefault(result); 424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 426