1bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson/*
2bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * Copyright (C) 2011 The Android Open Source Project
3bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson *
4bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * Licensed under the Apache License, Version 2.0 (the "License");
5bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * you may not use this file except in compliance with the License.
6bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * You may obtain a copy of the License at
7bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson *
8bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson *      http://www.apache.org/licenses/LICENSE-2.0
9bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson *
10bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * Unless required by applicable law or agreed to in writing, software
11bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
12bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * See the License for the specific language governing permissions and
14bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * limitations under the License.
15bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson */
16bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
17bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilsonpackage com.android.dx.io;
18bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
19bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilsonimport com.android.dx.util.Unsigned;
20bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
21bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson/**
22bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson * An annotation.
23bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson */
24bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilsonpublic final class Annotation implements Comparable<Annotation> {
25bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    private final DexBuffer buffer;
26bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    private final byte visibility;
27bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    private final int typeIndex;
28bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    private final int[] names;
29bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    private final EncodedValue[] values;
30bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
31bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public Annotation(DexBuffer buffer, byte visibility, int typeIndex, int[] names,
32bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            EncodedValue[] values) {
33bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        this.buffer = buffer;
34bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        this.visibility = visibility;
35bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        this.typeIndex = typeIndex;
36bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        this.names = names;
37bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        this.values = values;
38bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
39bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
40bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public byte getVisibility() {
41bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return visibility;
42bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
43bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
44bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public int getTypeIndex() {
45bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return typeIndex;
46bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
47bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
48bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public int[] getNames() {
49bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return names;
50bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
51bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
52bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public EncodedValue[] getValues() {
53bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return values;
54bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
55bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
56bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    public void writeTo(DexBuffer.Section out) {
57bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        out.writeByte(visibility);
58bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        out.writeUleb128(typeIndex);
59bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        out.writeUleb128(names.length);
60bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        for (int i = 0; i < names.length; i++) {
61bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            out.writeUleb128(names[i]);
62bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            values[i].writeTo(out);
63bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        }
64bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
65bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
66bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    @Override public int compareTo(Annotation other) {
67bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        if (typeIndex != other.typeIndex) {
68bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            return Unsigned.compare(typeIndex, other.typeIndex);
69bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        }
70bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        int size = Math.min(names.length, other.names.length);
71bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        for (int i = 0; i < size; i++) {
72bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            if (names[i] != other.names[i]) {
73bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson                return Unsigned.compare(names[i], other.names[i]);
74bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            }
75bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            int compare = values[i].compareTo(other.values[i]);
76bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            if (compare != 0) {
77bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson                return compare;
78bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            }
79bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        }
80bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return names.length - other.names.length;
81bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
82bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
83bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    @Override public String toString() {
84bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        if (buffer == null) {
85bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            return visibility + " " + typeIndex;
86bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        }
87bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson
88bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        StringBuilder result = new StringBuilder();
89bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        result.append(visibility);
90bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        result.append(" ");
91bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        result.append(buffer.typeNames().get(typeIndex));
92bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        result.append("[");
93bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        for (int i = 0; i < names.length; i++) {
94bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            if (i > 0) {
95bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson                result.append(", ");
96bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            }
97bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            result.append(buffer.strings().get(names[i]));
98bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            result.append("=");
99bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson            result.append(values[i]);
100bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        }
101bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        result.append("]");
102bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson        return result.toString();
103bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson    }
104bd3dba4346223593ac6033a3d2a7d8ec6f20738bJesse Wilson}
105