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