From a3cf936fc254f9d2bdec715718bef9a0f5edf600 Mon Sep 17 00:00:00 2001 From: "JesusFreke@JesusFreke.com" Date: Thu, 6 Aug 2009 06:47:07 +0000 Subject: [PATCH] refactor all the encoded value stuff to use template attributes instead of object properties git-svn-id: https://smali.googlecode.com/svn/trunk@368 55b6fa8a-2a1e-11de-a435-ffa8d773f76a --- .../baksmali/Adaptors/AnnotationAdaptor.java | 5 +- .../AnnotationEncodedValueAdaptor.java | 56 ++++++++----------- .../ArrayEncodedValueAdaptor.java | 22 ++++---- .../EncodedIndexedItemAdaptor.java | 20 +++---- .../EncodedValue/EncodedValueAdaptor.java | 41 +++++++------- .../EncodedValue/EnumEncodedValueAdaptor.java | 21 +++---- .../EncodedValue/NullEncodedValueAdaptor.java | 32 ----------- .../SimpleEncodedValueAdaptor.java | 19 +++---- .../jf/baksmali/Adaptors/FieldDefinition.java | 2 +- .../templates/templates/baksmali.stg | 35 +++++------- 10 files changed, 91 insertions(+), 162 deletions(-) delete mode 100644 baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/NullEncodedValueAdaptor.java diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationAdaptor.java index 2a0a775b..e6841802 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/AnnotationAdaptor.java @@ -40,11 +40,8 @@ public class AnnotationAdaptor { public static StringTemplate makeTemplate(StringTemplateGroup stg, AnnotationItem annotationItem) { StringTemplate template = stg.getInstanceOf("annotation"); - AnnotationEncodedValueAdaptor aeva = new AnnotationEncodedValueAdaptor(annotationItem.getEncodedAnnotation()); - template.setAttribute("Visibility", annotationItem.getVisibility().name().toLowerCase()); - template.setAttribute("AnnotationType", aeva.getAnnotationType()); - template.setAttribute("Elements", aeva.getElements()); + AnnotationEncodedValueAdaptor.setAttributesForAnnotation(template, annotationItem.getEncodedAnnotation()); return template; } 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 index bb40527a..63a3308a 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/AnnotationEncodedValueAdaptor.java @@ -32,55 +32,45 @@ import org.jf.dexlib.EncodedValue.EncodedValue; import org.jf.dexlib.EncodedValue.AnnotationEncodedSubValue; import org.jf.dexlib.StringIdItem; import org.jf.baksmali.Adaptors.Reference.TypeReference; +import org.antlr.stringtemplate.StringTemplate; +import org.antlr.stringtemplate.StringTemplateGroup; import java.util.List; import java.util.ArrayList; -public class AnnotationEncodedValueAdaptor extends EncodedValueAdaptor { - private AnnotationEncodedSubValue encodedAnnotation; - - public AnnotationEncodedValueAdaptor(AnnotationEncodedSubValue encodedAnnotation) { - this.encodedAnnotation = encodedAnnotation; +public abstract class AnnotationEncodedValueAdaptor { + + public static StringTemplate makeTemplate(StringTemplateGroup stg, AnnotationEncodedSubValue encodedAnnotation) { + StringTemplate template = stg.getInstanceOf("AnnotationEncodedValue"); + template.setAttribute("AnnotationType", new TypeReference(encodedAnnotation.annotationType)); + template.setAttribute("Elements", getElements(stg, encodedAnnotation)); + return template; } - public String getFormat() { - return "AnnotationEncodedValue"; + public static void setAttributesForAnnotation(StringTemplate template, + AnnotationEncodedSubValue encodedAnnotation) { + template.setAttribute("AnnotationType", new TypeReference(encodedAnnotation.annotationType)); + template.setAttribute("Elements", getElements(template.getGroup(), encodedAnnotation)); } - public Object getValue() { - return this; - } - - public TypeReference getAnnotationType() { - return new TypeReference(encodedAnnotation.annotationType); - } - - public List getElements() { - List elements = new ArrayList(); + private static List getElements(StringTemplateGroup stg, + AnnotationEncodedSubValue encodedAnnotation) { + List elements = new ArrayList(); for (int i=0; i encodedValues = new ArrayList(); + private static List getValue(StringTemplateGroup stg, ArrayEncodedValue encodedArray) { + List encodedValues = new ArrayList(); for (EncodedValue encodedValue: encodedArray.values) { - encodedValues.add(EncodedValueAdaptor.make(encodedValue)); + encodedValues.add(EncodedValueAdaptor.make(stg, encodedValue)); } return encodedValues; } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedIndexedItemAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedIndexedItemAdaptor.java index 569d314d..2f391267 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedIndexedItemAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EncodedIndexedItemAdaptor.java @@ -29,19 +29,13 @@ package org.jf.baksmali.Adaptors.EncodedValue; import org.jf.baksmali.Adaptors.Reference.Reference; +import org.antlr.stringtemplate.StringTemplate; +import org.antlr.stringtemplate.StringTemplateGroup; -public class EncodedIndexedItemAdaptor extends EncodedValueAdaptor { - private Reference reference; - - public EncodedIndexedItemAdaptor(Reference reference) { - this.reference = reference; - } - - public String getFormat() { - return "EncodedIndexedItemReference"; - } - - public Object getValue() { - return reference; +public class EncodedIndexedItemAdaptor { + public static StringTemplate makeTemplate(StringTemplateGroup stg, Reference reference) { + StringTemplate template = stg.getInstanceOf("EncodedIndexedItemReference"); + template.setAttribute("Value", reference); + return template; } } 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 4ff8621d..63d9ab51 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 @@ -30,47 +30,46 @@ package org.jf.baksmali.Adaptors.EncodedValue; import org.jf.dexlib.EncodedValue.*; import org.jf.baksmali.Adaptors.Reference.*; +import org.antlr.stringtemplate.StringTemplate; +import org.antlr.stringtemplate.StringTemplateGroup; public abstract class EncodedValueAdaptor { - public static EncodedValueAdaptor make(EncodedValue encodedValue) { + public static StringTemplate make(StringTemplateGroup stg, EncodedValue encodedValue) { switch (encodedValue.getValueType()) { case VALUE_ANNOTATION: - return new AnnotationEncodedValueAdaptor((AnnotationEncodedValue)encodedValue); + return AnnotationEncodedValueAdaptor.makeTemplate(stg, (AnnotationEncodedValue)encodedValue); case VALUE_ARRAY: - return new ArrayEncodedValueAdaptor((ArrayEncodedValue)encodedValue); + return ArrayEncodedValueAdaptor.makeTemplate(stg, (ArrayEncodedValue)encodedValue); case VALUE_BOOLEAN: - return new SimpleEncodedValueAdaptor(((BooleanEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((BooleanEncodedValue)encodedValue).value); case VALUE_BYTE: - return new SimpleEncodedValueAdaptor(((ByteEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((ByteEncodedValue)encodedValue).value); case VALUE_CHAR: - return new SimpleEncodedValueAdaptor(((CharEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((CharEncodedValue)encodedValue).value); case VALUE_DOUBLE: - return new SimpleEncodedValueAdaptor(((DoubleEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((DoubleEncodedValue)encodedValue).value); case VALUE_ENUM: - return new EnumEncodedValueAdaptor(new FieldReference(((EnumEncodedValue)encodedValue).value)); + return EnumEncodedValueAdaptor.makeTemplate(stg, + new FieldReference(((EnumEncodedValue)encodedValue).value)); case VALUE_FIELD: - return new EncodedIndexedItemAdaptor(new FieldReference(((FieldEncodedValue)encodedValue).value)); + return EncodedIndexedItemAdaptor.makeTemplate(stg, new FieldReference(((FieldEncodedValue)encodedValue).value)); case VALUE_FLOAT: - return new SimpleEncodedValueAdaptor(((FloatEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((FloatEncodedValue)encodedValue).value); case VALUE_INT: - return new SimpleEncodedValueAdaptor(((IntEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((IntEncodedValue)encodedValue).value); case VALUE_LONG: - return new SimpleEncodedValueAdaptor(((LongEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((LongEncodedValue)encodedValue).value); case VALUE_METHOD: - return new EncodedIndexedItemAdaptor(new MethodReference(((MethodEncodedValue)encodedValue).value)); + return EncodedIndexedItemAdaptor.makeTemplate(stg, new MethodReference(((MethodEncodedValue)encodedValue).value)); case VALUE_NULL: - return new SimpleEncodedValueAdaptor("null"); + return SimpleEncodedValueAdaptor.makeTemplate(stg, "null"); case VALUE_SHORT: - return new SimpleEncodedValueAdaptor(((ShortEncodedValue)encodedValue).value); + return SimpleEncodedValueAdaptor.makeTemplate(stg, ((ShortEncodedValue)encodedValue).value); case VALUE_STRING: - return new EncodedIndexedItemAdaptor(new StringReference(((StringEncodedValue)encodedValue).value)); + return EncodedIndexedItemAdaptor.makeTemplate(stg, new StringReference(((StringEncodedValue)encodedValue).value)); case VALUE_TYPE: - return new EncodedIndexedItemAdaptor(new TypeReference(((TypeEncodedValue)encodedValue).value)); + return EncodedIndexedItemAdaptor.makeTemplate(stg, new TypeReference(((TypeEncodedValue)encodedValue).value)); } return null; } - - public abstract String getFormat(); - - public abstract Object getValue(); } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EnumEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EnumEncodedValueAdaptor.java index 0bc70f16..43d7eacc 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EnumEncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/EnumEncodedValueAdaptor.java @@ -29,20 +29,13 @@ package org.jf.baksmali.Adaptors.EncodedValue; import org.jf.baksmali.Adaptors.Reference.FieldReference; +import org.antlr.stringtemplate.StringTemplate; +import org.antlr.stringtemplate.StringTemplateGroup; -public class EnumEncodedValueAdaptor extends EncodedValueAdaptor { - private FieldReference fieldReference; - - public EnumEncodedValueAdaptor(FieldReference fieldReference) { - this.fieldReference = fieldReference; - } - - - public String getFormat() { - return "EnumEncodedValue"; - } - - public Object getValue() { - return fieldReference; +public class EnumEncodedValueAdaptor { + public static StringTemplate makeTemplate(StringTemplateGroup stg, FieldReference fieldReference) { + StringTemplate template = stg.getInstanceOf("EnumEncodedValue"); + template.setAttribute("Value", fieldReference); + return template; } } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/NullEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/NullEncodedValueAdaptor.java deleted file mode 100644 index fb9f30b7..00000000 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/NullEncodedValueAdaptor.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * [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; - -public class NullEncodedValueAdaptor { -} diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/SimpleEncodedValueAdaptor.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/SimpleEncodedValueAdaptor.java index 1809a9f6..46da5728 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/SimpleEncodedValueAdaptor.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/EncodedValue/SimpleEncodedValueAdaptor.java @@ -28,18 +28,13 @@ package org.jf.baksmali.Adaptors.EncodedValue; -public class SimpleEncodedValueAdaptor extends EncodedValueAdaptor { - private Object value; +import org.antlr.stringtemplate.StringTemplateGroup; +import org.antlr.stringtemplate.StringTemplate; - public SimpleEncodedValueAdaptor(Object value) { - this.value = value; - } - - public String getFormat() { - return "SimpleEncodedValue"; - } - - public Object getValue() { - return value; +public class SimpleEncodedValueAdaptor { + public static StringTemplate makeTemplate(StringTemplateGroup stg, Object value) { + StringTemplate template = stg.getInstanceOf("SimpleEncodedValue"); + template.setAttribute("Value", value); + return template; } } diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java index d93a525c..6c711f47 100644 --- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java +++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/FieldDefinition.java @@ -51,7 +51,7 @@ public class FieldDefinition { template.setAttribute("Annotations", getAnnotations(stg, annotationSet)); if (initialValue != null) { - template.setAttribute("InitialValue", EncodedValueAdaptor.make(initialValue)); + template.setAttribute("InitialValue", EncodedValueAdaptor.make(stg, initialValue)); } return template; diff --git a/baksmali/src/main/resources/templates/templates/baksmali.stg b/baksmali/src/main/resources/templates/templates/baksmali.stg index 495b0955..217cffee 100644 --- a/baksmali/src/main/resources/templates/templates/baksmali.stg +++ b/baksmali/src/main/resources/templates/templates/baksmali.stg @@ -68,7 +68,7 @@ annotation(Visibility, AnnotationType, Elements) ::= << .annotation - + @@ -81,7 +81,7 @@ annotation(Visibility, AnnotationType, Elements) ::= field(AccessFlags, FieldName, FieldType, Annotations, InitialValue) ::= << -.field }>: = +.field }>: = .end field @@ -359,41 +359,36 @@ TypeReference(TypeReference) ::= -EncodedValue(EncodedValue) ::= +SimpleEncodedValue(Value) ::= << -<(EncodedValue.Format)(EncodedValue)> + >> -SimpleEncodedValue(EncodedValue) ::= +EncodedIndexedItemReference(Value) ::= << - + >> -EncodedIndexedItemReference(EncodedValue) ::= -<< - ->> - -ArrayEncodedValue(EncodedValue) ::= +ArrayEncodedValue(Value) ::= << { - + } >> -EnumEncodedValue(EncodedValue) ::= +EnumEncodedValue(Value) ::= << -.enum +.enum >> -AnnotationEncodedValue(EncodedValue) ::= +AnnotationEncodedValue(AnnotationType, Elements) ::= << -.subannotation - +.subannotation + .end subannotation >> -AnnotationElement(AnnotationElement) ::= +AnnotationElement(Name, Value) ::= << - = + = >> \ No newline at end of file