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.file;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilsonimport com.android.dx.dex.SizeOf;
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotations;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationsList;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.code.AccessFlags;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstArray;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstFieldRef;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstMethodRef;
27333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstType;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.StdTypeList;
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeList;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Hex;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.Writers;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.PrintWriter;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.Writer;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.ArrayList;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Representation of a Dalvik class, which is basically a set of
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * members (fields or methods) along with a few more pieces of
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * information.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class ClassDefItem extends IndexedItem {
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type constant for this class */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final CstType thisClass;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** access flags */
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final int accessFlags;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
5399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} superclass or {@code null} if this class is a/the
54de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     * root class
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final CstType superclass;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code null-ok;} list of implemented interfaces */
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private TypeListItem interfaces;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code null-ok;} source file name or {@code null} if unknown */
62333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    private final CstString sourceFile;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} associated class data object */
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final ClassDataItem classData;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
6899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null-ok;} item wrapper for the static values, initialized
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in {@link #addContents}
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private EncodedArrayItem staticValuesItem;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
7399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} annotations directory */
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private AnnotationsDirectoryItem annotationsDirectory;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance. Its sets of members and annotations are
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initially empty.
79de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param thisClass {@code non-null;} type constant for this class
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param accessFlags access flags
8299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param superclass {@code null-ok;} superclass or {@code null} if
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this class is a/the root class
8499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param interfaces {@code non-null;} list of implemented interfaces
8599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param sourceFile {@code null-ok;} source file name or
8699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code null} if unknown
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ClassDefItem(CstType thisClass, int accessFlags,
89333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson            CstType superclass, TypeList interfaces, CstString sourceFile) {
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (thisClass == null) {
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("thisClass == null");
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /*
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * TODO: Maybe check accessFlags and superclass, at
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * least for easily-checked stuff?
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (interfaces == null) {
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("interfaces == null");
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.thisClass = thisClass;
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.accessFlags = accessFlags;
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.superclass = superclass;
106de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro        this.interfaces =
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            (interfaces.size() == 0) ? null :  new TypeListItem(interfaces);
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.sourceFile = sourceFile;
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.classData = new ClassDataItem(thisClass);
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.staticValuesItem = null;
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.annotationsDirectory = new AnnotationsDirectoryItem();
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ItemType itemType() {
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return ItemType.TYPE_CLASS_DEF_ITEM;
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int writeSize() {
123081c7142b29ccd6e1744b26e097b6a4d7c12f2bdJesse Wilson        return SizeOf.CLASS_DEF_ITEM;
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addContents(DexFile file) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TypeIdsSection typeIds = file.getTypeIds();
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MixedItemSection byteData = file.getByteData();
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MixedItemSection wordData = file.getWordData();
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        MixedItemSection typeLists = file.getTypeLists();
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        StringIdsSection stringIds = file.getStringIds();
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        typeIds.intern(thisClass);
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!classData.isEmpty()) {
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            MixedItemSection classDataSection = file.getClassData();
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            classDataSection.add(classData);
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            CstArray staticValues = classData.getStaticValuesConstant();
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (staticValues != null) {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                staticValuesItem =
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    byteData.intern(new EncodedArrayItem(staticValues));
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (superclass != null) {
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            typeIds.intern(superclass);
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (interfaces != null) {
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            interfaces = typeLists.intern(interfaces);
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (sourceFile != null) {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            stringIds.intern(sourceFile);
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (! annotationsDirectory.isEmpty()) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (annotationsDirectory.isInternable()) {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                annotationsDirectory = wordData.intern(annotationsDirectory);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                wordData.add(annotationsDirectory);
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void writeTo(DexFile file, AnnotatedOutput out) {
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean annotates = out.annotates();
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TypeIdsSection typeIds = file.getTypeIds();
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int classIdx = typeIds.indexOf(thisClass);
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int superIdx = (superclass == null) ? -1 :
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            typeIds.indexOf(superclass);
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int interOff = OffsettedItem.getAbsoluteOffsetOr0(interfaces);
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int annoOff = annotationsDirectory.isEmpty() ? 0 :
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            annotationsDirectory.getAbsoluteOffset();
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int sourceFileIdx = (sourceFile == null) ? -1 :
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            file.getStringIds().indexOf(sourceFile);
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int dataOff = classData.isEmpty()? 0 : classData.getAbsoluteOffset();
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int staticValuesOff =
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            OffsettedItem.getAbsoluteOffsetOr0(staticValuesItem);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (annotates) {
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(0, indexString() + ' ' + thisClass.toHuman());
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  class_idx:           " + Hex.u4(classIdx));
189de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro            out.annotate(4, "  access_flags:        " +
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                         AccessFlags.classString(accessFlags));
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  superclass_idx:      " + Hex.u4(superIdx) +
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                         " // " + ((superclass == null) ? "<none>" :
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                          superclass.toHuman()));
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  interfaces_off:      " + Hex.u4(interOff));
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (interOff != 0) {
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TypeList list = interfaces.getList();
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                int sz = list.size();
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                for (int i = 0; i < sz; i++) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    out.annotate(0, "    " + list.getType(i).toHuman());
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  source_file_idx:     " + Hex.u4(sourceFileIdx) +
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                         " // " + ((sourceFile == null) ? "<none>" :
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                          sourceFile.toHuman()));
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  annotations_off:     " + Hex.u4(annoOff));
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  class_data_off:      " + Hex.u4(dataOff));
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            out.annotate(4, "  static_values_off:   " +
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    Hex.u4(staticValuesOff));
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(classIdx);
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(accessFlags);
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(superIdx);
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(interOff);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(sourceFileIdx);
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(annoOff);
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(dataOff);
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        out.writeInt(staticValuesOff);
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the constant corresponding to this class.
223de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
22499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the constant
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CstType getThisClass() {
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return thisClass;
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the access flags.
232de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the access flags
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getAccessFlags() {
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return accessFlags;
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the superclass.
241de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
24299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the superclass or {@code null} if
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * this class is a/the root class
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CstType getSuperclass() {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return superclass;
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the list of interfaces implemented.
251de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
25299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the interfaces list
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TypeList getInterfaces() {
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (interfaces == null) {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return StdTypeList.EMPTY;
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return interfaces.getList();
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the source file name.
264de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
26599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the source file name or {@code null} if unknown
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
267333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson    public CstString getSourceFile() {
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sourceFile;
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a static field.
273de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
27499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param field {@code non-null;} the field to add
27599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param value {@code null-ok;} initial value for the field, if any
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addStaticField(EncodedField field, Constant value) {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classData.addStaticField(field, value);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds an instance field.
283de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
28499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param field {@code non-null;} the field to add
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addInstanceField(EncodedField field) {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classData.addInstanceField(field);
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
29199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * Adds a direct ({@code static} and/or {@code private}) method.
292de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
29399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} the method to add
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addDirectMethod(EncodedMethod method) {
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classData.addDirectMethod(method);
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a virtual method.
301de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
30299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} the method to add
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addVirtualMethod(EncodedMethod method) {
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classData.addVirtualMethod(method);
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets all the methods in this class. The returned list is not linked
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in any way to the underlying lists contained in this instance, but
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the objects contained in the list are shared.
312de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
31399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} list of all methods
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public ArrayList<EncodedMethod> getMethods() {
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return classData.getMethods();
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Sets the direct annotations on this class. These are annotations
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * made on the class, per se, as opposed to on one of its members.
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * It is only valid to call this method at most once per instance.
323de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
32499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param annotations {@code non-null;} annotations to set for this class
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void setClassAnnotations(Annotations annotations) {
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        annotationsDirectory.setClassAnnotations(annotations);
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a field annotations item to this class.
332de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
33399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param field {@code non-null;} field in question
33499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param annotations {@code non-null;} associated annotations to add
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addFieldAnnotations(CstFieldRef field,
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Annotations annotations) {
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        annotationsDirectory.addFieldAnnotations(field, annotations);
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a method annotations item to this class.
343de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
34499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} method in question
34599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param annotations {@code non-null;} associated annotations to add
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addMethodAnnotations(CstMethodRef method,
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Annotations annotations) {
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        annotationsDirectory.addMethodAnnotations(method, annotations);
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Adds a parameter annotations item to this class.
354de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
35599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} method in question
35699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param list {@code non-null;} associated list of annotation sets to add
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void addParameterAnnotations(CstMethodRef method,
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            AnnotationsList list) {
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        annotationsDirectory.addParameterAnnotations(method, list);
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the method annotations for a given method, if any. This is
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * meant for use by debugging / dumping code.
366de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
36799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} the method
36899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the method annotations, if any
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Annotations getMethodAnnotations(CstMethodRef method) {
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return annotationsDirectory.getMethodAnnotations(method);
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the parameter annotations for a given method, if any. This is
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * meant for use by debugging / dumping code.
377de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
37899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param method {@code non-null;} the method
37999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the parameter annotations, if any
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public AnnotationsList getParameterAnnotations(CstMethodRef method) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return annotationsDirectory.getParameterAnnotations(method);
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
384de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Prints out the contents of this instance, in a debugging-friendly
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * way.
388de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
38999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param out {@code non-null;} where to output to
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param verbose whether to be verbose with the output
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void debugPrint(Writer out, boolean verbose) {
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        PrintWriter pw = Writers.printWriterFor(out);
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println(getClass().getName() + " {");
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println("  accessFlags: " + Hex.u2(accessFlags));
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println("  superclass: " + superclass);
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println("  interfaces: " +
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((interfaces == null) ? "<none>" : interfaces));
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println("  sourceFile: " +
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ((sourceFile == null) ? "<none>" : sourceFile.toQuoted()));
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        classData.debugPrint(out, verbose);
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        annotationsDirectory.debugPrint(pw);
405de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        pw.println("}");
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
409