1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 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.file;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19fe107fb6e3f308ac5174ebdc5a794ee880c741d9Jesse Wilsonimport static com.android.dx.rop.annotation.AnnotationVisibility.SYSTEM;
20466d7d94b8b173a323fc5616837940219a216f9dYohann Roussel
21466d7d94b8b173a323fc5616837940219a216f9dYohann Rousselimport com.android.dx.rop.annotation.Annotation;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.NameValuePair;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstAnnotation;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstArray;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstInteger;
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstKnownNull;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstMethodRef;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstString;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeList;
33466d7d94b8b173a323fc5616837940219a216f9dYohann Roussel
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Utility class for dealing with annotations.
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class AnnotationUtils {
404c656e4ec2f5c5036dc67fb4034c1e7ff7abf343Benoit Lamarche
4199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code AnnotationDefault} annotations */
42de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType ANNOTATION_DEFAULT_TYPE =
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/AnnotationDefault;"));
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code EnclosingClass} annotations */
46de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType ENCLOSING_CLASS_TYPE =
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/EnclosingClass;"));
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code EnclosingMethod} annotations */
50de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType ENCLOSING_METHOD_TYPE =
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/EnclosingMethod;"));
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code InnerClass} annotations */
54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType INNER_CLASS_TYPE =
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/InnerClass;"));
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code MemberClasses} annotations */
58de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType MEMBER_CLASSES_TYPE =
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/MemberClasses;"));
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code Signature} annotations */
62de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType SIGNATURE_TYPE =
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/Signature;"));
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type for {@code Throws} annotations */
66de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    private static final CstType THROWS_TYPE =
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstType.intern(Type.intern("Ldalvik/annotation/Throws;"));
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the UTF-8 constant {@code "accessFlags"} */
70333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private static final CstString ACCESS_FLAGS_STRING = new CstString("accessFlags");
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the UTF-8 constant {@code "name"} */
73333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private static final CstString NAME_STRING = new CstString("name");
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} the UTF-8 constant {@code "value"} */
76333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private static final CstString VALUE_STRING = new CstString("value");
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This class is uninstantiable.
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private AnnotationUtils() {
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // This space intentionally left blank.
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
8699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code AnnotationDefault} annotation.
87de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param defaults {@code non-null;} the defaults, itself as an annotation
8999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the constructed annotation
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Annotation makeAnnotationDefault(Annotation defaults) {
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(ANNOTATION_DEFAULT_TYPE, SYSTEM);
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, new CstAnnotation(defaults)));
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
10099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code EnclosingClass} annotation.
101de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
10299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param clazz {@code non-null;} the enclosing class
10399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Annotation makeEnclosingClass(CstType clazz) {
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(ENCLOSING_CLASS_TYPE, SYSTEM);
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
108333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, clazz));
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
11499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code EnclosingMethod} annotation.
115de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
11699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} the enclosing method
11799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Annotation makeEnclosingMethod(CstMethodRef method) {
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(ENCLOSING_METHOD_TYPE, SYSTEM);
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
122333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, method));
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
12899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code InnerClass} annotation.
129de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
13099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param name {@code null-ok;} the original name of the class, or
13199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null} to represent an anonymous class
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param accessFlags the original access flags
13399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
135333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public static Annotation makeInnerClass(CstString name, int accessFlags) {
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(INNER_CLASS_TYPE, SYSTEM);
137333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        Constant nameCst = (name != null) ? name : CstKnownNull.THE_ONE;
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(NAME_STRING, nameCst));
140333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(ACCESS_FLAGS_STRING,
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        CstInteger.make(accessFlags)));
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
14799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code MemberClasses} annotation.
148de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
14999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param types {@code non-null;} the list of (the types of) the member classes
15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Annotation makeMemberClasses(TypeList types) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstArray array = makeCstArray(types);
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(MEMBER_CLASSES_TYPE, SYSTEM);
155333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, array));
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
16199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code Signature} annotation.
162de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
16399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param signature {@code non-null;} the signature string
16499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
166333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public static Annotation makeSignature(CstString signature) {
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(SIGNATURE_TYPE, SYSTEM);
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Split the string into pieces that are likely to be common
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * across many signatures and the rest of the file.
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
173de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String raw = signature.getString();
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int rawLength = raw.length();
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ArrayList<String> pieces = new ArrayList<String>(20);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int at = 0; at < rawLength; /*at*/) {
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            char c = raw.charAt(at);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int endAt = at + 1;
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (c == 'L') {
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // Scan to ';' or '<'. Consume ';' but not '<'.
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (endAt < rawLength) {
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    c = raw.charAt(endAt);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (c == ';') {
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        endAt++;
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    } else if (c == '<') {
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    endAt++;
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // Scan to 'L' without consuming it.
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                while (endAt < rawLength) {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    c = raw.charAt(endAt);
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    if (c == 'L') {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                        break;
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    }
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    endAt++;
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            pieces.add(raw.substring(at, endAt));
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            at = endAt;
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = pieces.size();
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstArray.List list = new CstArray.List(size);
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < size; i++) {
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list.set(i, new CstString(pieces.get(i)));
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        list.setImmutable();
216de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
217333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, new CstArray(list)));
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
22399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Constructs a standard {@code Throws} annotation.
224de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
22599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param types {@code non-null;} the list of thrown types
22699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the annotation
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static Annotation makeThrows(TypeList types) {
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstArray array = makeCstArray(types);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Annotation result = new Annotation(THROWS_TYPE, SYSTEM);
231333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson        result.put(new NameValuePair(VALUE_STRING, array));
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result.setImmutable();
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return result;
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Converts a {@link TypeList} to a {@link CstArray}.
238de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
23999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param types {@code non-null;} the type list
24099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the corresponding array constant
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static CstArray makeCstArray(TypeList types) {
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int size = types.size();
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CstArray.List list = new CstArray.List(size);
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < size; i++) {
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            list.set(i, CstType.intern(types.getType(i)));
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        list.setImmutable();
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CstArray(list);
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
254