/*
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package dex.reader;
import dex.reader.DexFileReader.FieldIdItem;
import dex.structure.DexAnnotation;
import dex.structure.DexAnnotationAttribute;
import java.util.List;
// FIXME provide special type for Signature annotation
/* package */final class DexAnnotationImpl implements DexAnnotation {
private int offset;
private DexBuffer buffer;
private int[] typeIds;
private String[] stringPool;
private Visibility visibility;
private DexEncodedAnnotationImpl encodedAnnotation;
private TypeFormatter formatter = new TypeFormatter();
private final FieldIdItem[] fieldIdItems;
public DexAnnotationImpl(DexBuffer buffer, int offset, int[] typeIds,
String[] stringPool, FieldIdItem[] fieldIdItems) {
this.buffer = buffer;
this.offset = offset;
this.typeIds = typeIds;
this.stringPool = stringPool;
this.fieldIdItems = fieldIdItems;
parseAnnotations();
}
private void parseAnnotations() {
buffer.setPosition(offset);
visibility = Visibility.get(buffer.readUByte());
encodedAnnotation = new DexEncodedAnnotationImpl(buffer, this, typeIds,
stringPool, fieldIdItems);
}
public List<DexAnnotationAttribute> getAttributes() {
return encodedAnnotation.getValue();
}
public String getTypeName() {
return encodedAnnotation.getTypeName();
}
public Visibility getVisibility() {
return visibility;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("@");
builder.append(formatter.format(encodedAnnotation.getTypeName()));
if (!getAttributes().isEmpty()) {
builder.append(" (");
for (DexAnnotationAttribute value : getAttributes()) {
builder.append(value.toString());
builder.append(" ");
}
builder.append(")");
}
return builder.toString();
}
}