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