FieldDefinition.java revision 7ab77bc90be62b0688c97d4476e3bd219eace0da
1/* 2 * [The "BSD licence"] 3 * Copyright (c) 2009 Ben Gruver 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29package org.jf.baksmali.Adaptors; 30 31import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor; 32import org.jf.dexlib.ClassDataItem; 33import org.jf.dexlib.EncodedValue.EncodedValue; 34import org.jf.dexlib.AnnotationSetItem; 35import org.jf.dexlib.AnnotationItem; 36import org.jf.dexlib.Util.AccessFlags; 37import org.antlr.stringtemplate.StringTemplate; 38import org.antlr.stringtemplate.StringTemplateGroup; 39 40import java.util.ArrayList; 41import java.util.List; 42 43public class FieldDefinition { 44 public static StringTemplate createTemplate(StringTemplateGroup stg, ClassDataItem.EncodedField encodedField, 45 EncodedValue initialValue, AnnotationSetItem annotationSet) { 46 StringTemplate template = stg.getInstanceOf("field"); 47 48 template.setAttribute("AccessFlags", getAccessFlags(encodedField)); 49 template.setAttribute("FieldName", encodedField.field.getFieldName().getStringValue()); 50 template.setAttribute("FieldType", encodedField.field.getFieldType().getTypeDescriptor()); 51 template.setAttribute("Annotations", getAnnotations(stg, annotationSet)); 52 53 if (initialValue != null) { 54 template.setAttribute("InitialValue", EncodedValueAdaptor.make(initialValue)); 55 } 56 57 return template; 58 } 59 60 public static StringTemplate createTemplate(StringTemplateGroup stg, ClassDataItem.EncodedField encodedField, 61 AnnotationSetItem annotationSet) { 62 return createTemplate(stg, encodedField, null, annotationSet); 63 } 64 65 private static List<String> getAccessFlags(ClassDataItem.EncodedField encodedField) { 66 List<String> accessFlags = new ArrayList<String>(); 67 68 for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForField(encodedField.accessFlags)) { 69 accessFlags.add(accessFlag.toString()); 70 } 71 72 return accessFlags; 73 } 74 75 private static List<StringTemplate> getAnnotations(StringTemplateGroup stg, AnnotationSetItem annotationSet) { 76 if (annotationSet == null) { 77 return null; 78 } 79 80 List<StringTemplate> annotationAdaptors = new ArrayList<StringTemplate>(); 81 82 for (AnnotationItem annotationItem: annotationSet.getAnnotations()) { 83 annotationAdaptors.add(AnnotationAdaptor.makeTemplate(stg, annotationItem)); 84 } 85 return annotationAdaptors; 86 } 87} 88