From 1080561460a0d509a24173d7ff38241a1f79a1b6 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Thu, 18 Jun 2009 04:19:05 +0000 Subject: [PATCH] Implemented annotation encoded values git-svn-id: https://smali.googlecode.com/svn/trunk@165 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../AnnotationEncodedValueAdaptor.java | 82 +++++++++++++++++++ .../EncodedValue/EncodedValueAdaptor.java | 6 +- .../src/main/resources/templates/baksmali.stg | 16 +++- .../src/test/smali/baksmali_test_class.smali | 8 ++ .../EncodedValue/AnnotationElement.java | 8 ++ .../AnnotationEncodedValueSubField.java | 8 ++ 6 files changed, 123 insertions(+), 5 deletions(-) create mode 100644 baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java new file mode 100644 index 00000000..acea5f71 --- /dev/null +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java @@ -0,0 +1,82 @@ +/* + * [The "BSD licence"] + * Copyright (c) 2009 Ben Gruver + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.jf.baksmali.Adaptors.EncodedValue; + +import org.jf.dexlib.EncodedValue.AnnotationEncodedValueSubField; +import org.jf.dexlib.EncodedValue.AnnotationElement; +import org.jf.baksmali.Adaptors.Reference.TypeReference; + +import java.util.List; +import java.util.ArrayList; + +public class AnnotationEncodedValueAdaptor extends EncodedValueAdaptor { + private AnnotationEncodedValueSubField encodedAnnotation; + + public AnnotationEncodedValueAdaptor(AnnotationEncodedValueSubField encodedAnnotation) { + this.encodedAnnotation = encodedAnnotation; + } + + public String getFormat() { + return "AnnotationEncodedValue"; + } + + public Object getValue() { + return this; + } + + public TypeReference getAnnotationType() { + return new TypeReference(encodedAnnotation.getAnnotationType()); + } + + public List getElements() { + List elements = new ArrayList(); + + for (AnnotationElement annotationElement: encodedAnnotation.getAnnotationElements()) { + elements.add(new AnnotationElementAdaptor(annotationElement)); + } + return elements; + } + + + public static class AnnotationElementAdaptor { + private AnnotationElement annotationElement; + + public AnnotationElementAdaptor(AnnotationElement annotationElement) { + this.annotationElement = annotationElement; + } + + public String getName() { + return annotationElement.getName().getStringValue(); + } + + public EncodedValueAdaptor getValue() { + return EncodedValueAdaptor.make(annotationElement.getEncodedValue()); + } + } +} diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java index f7b9c872..13a5fef4 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedValueAdaptor.java @@ -39,11 +39,11 @@ public abstract class EncodedValueAdaptor { public static EncodedValueAdaptor make(EncodedValue encodedValue) { switch (encodedValue.getValueType()) { case VALUE_ANNOTATION: - return null; + return new AnnotationEncodedValueAdaptor((AnnotationEncodedValueSubField)encodedValue.getValue()); case VALUE_ARRAY: - return new ArrayEncodedValueAdaptor(((ArrayEncodedValueSubField)encodedValue.getValue())); + return new ArrayEncodedValueAdaptor((ArrayEncodedValueSubField)encodedValue.getValue()); case VALUE_BOOLEAN: - return new SimpleEncodedValueAdaptor(((BoolEncodedValueSubField)encodedValue.getValue()).getValue()); + return new SimpleEncodedValueAdaptor(((BoolEncodedValueSubField)encodedValue.getValue()).getValue()); case VALUE_BYTE: return new SimpleEncodedValueAdaptor(((ByteEncodedValueSubField)encodedValue.getValue()).getValue()); case VALUE_CHAR: diff --git a/baksmali/src/main/resources/templates/baksmali.stg b/baksmali/src/main/resources/templates/baksmali.stg index 82578fa4..c254e981 100644 --- a/baksmali/src/main/resources/templates/baksmali.stg +++ b/baksmali/src/main/resources/templates/baksmali.stg @@ -279,12 +279,24 @@ EncodedIndexedItemReference(EncodedValue) ::= ArrayEncodedValue(EncodedValue) ::= << -{}; separator=","> +{ + } >> EnumEncodedValue(EncodedValue) ::= << .enum +>> + +AnnotationEncodedValue(EncodedValue) ::= +<< +.subannotation EncodedValue.Type + +.end subannotation +>> + +AnnotationElement(AnnotationElement) ::= +<< + = >> \ No newline at end of file diff --git a/baksmali/src/test/smali/baksmali_test_class.smali b/baksmali/src/test/smali/baksmali_test_class.smali index 0778c66a..141c3f88 100644 --- a/baksmali/src/test/smali/baksmali_test_class.smali +++ b/baksmali/src/test/smali/baksmali_test_class.smali @@ -43,6 +43,14 @@ .field public static enumStaticField:Lsome/enum; = .enum Lsome/enum;->someEnumValue:Lsome/enum; +.field public static annotationStaticField:Lsome/annotation; = .subannotation Lsome/annotation; + value1 = "test" + value2 = .subannotation Lsome/annotation; + value1 = "test2" + value2 = Lsome/enum; + .end subannotation +.end subannotation + .field public instanceField:Ljava/lang/String; diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java index a392536b..fa64f7ad 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationElement.java @@ -56,4 +56,12 @@ public class AnnotationElement extends CompositeField public int compareTo(AnnotationElement annotationElement) { return elementName.compareTo(annotationElement.elementName); } + + public StringIdItem getName() { + return elementName.getReference(); + } + + public EncodedValue getEncodedValue() { + return encodedValue; + } } diff --git a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java index c818e84f..e9cd8070 100644 --- a/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java +++ b/dexlib/src/main/java/org/jf/dexlib/EncodedValue/AnnotationEncodedValueSubField.java @@ -80,4 +80,12 @@ public class AnnotationEncodedValueSubField extends CompositeField getAnnotationElements() { + return (List)annotationElementList.clone(); + } }