Added support for parameter names and annotations

git-svn-id: https://smali.googlecode.com/svn/trunk@172 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
JesusFreke@JesusFreke.com
2009-06-19 05:40:35 +00:00
parent b6547e8fd5
commit 3c9013f9c0
8 changed files with 240 additions and 15 deletions

View File

@ -131,6 +131,9 @@ public class AnnotationDirectoryItem extends OffsettedItem<AnnotationDirectoryIt
return (List<FieldAnnotation>)fieldAnnotationList.clone();
}
public List<ParameterAnnotation> getParameterAnnotations() {
return (List<ParameterAnnotation>)parameterAnnotationList.clone();
}
public static class FieldAnnotation extends CompositeField<FieldAnnotation>
@ -204,27 +207,36 @@ public class AnnotationDirectoryItem extends OffsettedItem<AnnotationDirectoryIt
public static class ParameterAnnotation extends CompositeField<ParameterAnnotation>
implements Comparable<ParameterAnnotation> {
private final IndexedItemReference<MethodIdItem> method;
private final OffsettedItemReference<AnnotationSetRefList> parameterAnnotations;
private final IndexedItemReference<MethodIdItem> methodReferenceField;
private final OffsettedItemReference<AnnotationSetRefList> parameterAnnotationsReferenceField;
public ParameterAnnotation(DexFile dexFile) {
super("parameter_annotation");
fields = new Field[] {
method = new IndexedItemReference<MethodIdItem>(dexFile.MethodIdsSection,
methodReferenceField = new IndexedItemReference<MethodIdItem>(dexFile.MethodIdsSection,
new IntegerField(null), "method_idx"),
parameterAnnotations = new OffsettedItemReference<AnnotationSetRefList>(
parameterAnnotationsReferenceField = new OffsettedItemReference<AnnotationSetRefList>(
dexFile.AnnotationSetRefListsSection, new IntegerField(null), "annotations_off")
};
}
public ParameterAnnotation(DexFile dexFile, MethodIdItem method, AnnotationSetRefList parameterAnnotations) {
this(dexFile);
this.method.setReference(method);
this.parameterAnnotations.setReference(parameterAnnotations);
this.methodReferenceField.setReference(method);
this.parameterAnnotationsReferenceField.setReference(parameterAnnotations);
}
public int compareTo(ParameterAnnotation o) {
return ((Integer)method.getReference().getIndex()).compareTo(o.method.getReference().getIndex());
return ((Integer) methodReferenceField.getReference().getIndex()).compareTo(o.methodReferenceField.getReference().getIndex());
}
public MethodIdItem getMethod() {
return methodReferenceField.getReference();
}
public AnnotationSetRefList getParameterAnnotations() {
return parameterAnnotationsReferenceField.getReference();
}
}
}

View File

@ -74,4 +74,18 @@ public class AnnotationSetRefList extends OffsettedItem<AnnotationSetRefList> {
public String getConciseIdentity() {
return "annotation_set_item @0x" + Integer.toHexString(getOffset());
}
public int getCount() {
return annotationSetReferences.size();
}
public List<AnnotationSetItem> getAnnotationSets() {
List<AnnotationSetItem> annotationSets = new ArrayList<AnnotationSetItem>();
for (OffsettedItemReference<AnnotationSetItem> annotationSetReference: annotationSetReferences) {
annotationSets.add(annotationSetReference.getReference());
}
return annotationSets;
}
}

View File

@ -98,6 +98,20 @@ public class DebugInfoItem extends OffsettedItem<DebugInfoItem> {
return (List<DebugInstruction>)instructionFields.clone();
}
public List<String> getParameterNames() {
List<String> parameterNamesList = new ArrayList<String>();
for (IndexedItemReference<StringIdItem> parameterNameReference: parameterNames) {
StringIdItem parameterNameItem = parameterNameReference.getReference();
if (parameterNameItem == null) {
parameterNamesList.add(null);
} else {
parameterNamesList.add(parameterNameItem.getStringValue());
}
}
return parameterNamesList;
}
private class DebugInstructionList implements Field<DebugInstructionList> {