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