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