FieldDefinition.java revision fbea4e751fa6f1748ded4379a4b64601cb53ba7b
1/*
2 * [The "BSD licence"]
3 * Copyright (c) 2010 Ben Gruver (JesusFreke)
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.baksmali.IndentingWriter;
33import org.jf.dexlib.AnnotationSetItem;
34import org.jf.dexlib.ClassDataItem;
35import org.jf.dexlib.EncodedValue.EncodedValue;
36import org.jf.dexlib.EncodedValue.NullEncodedValue;
37import org.jf.dexlib.Util.AccessFlags;
38
39import java.io.IOException;
40
41public class FieldDefinition {
42    public static void writeTo(IndentingWriter writer, ClassDataItem.EncodedField encodedField,
43                                                EncodedValue initialValue, AnnotationSetItem annotationSet,
44                                                boolean setInStaticConstructor) throws IOException {
45
46        String fieldTypeDescriptor = encodedField.field.getFieldType().getTypeDescriptor();
47
48        if (setInStaticConstructor &&
49            encodedField.isStatic() &&
50            (encodedField.accessFlags & AccessFlags.FINAL.getValue()) != 0 &&
51            initialValue != null &&
52            (
53                //it's a primitive type, or it's an array/reference type and the initial value isn't null
54                fieldTypeDescriptor.length() == 1 ||
55                initialValue != NullEncodedValue.NullValue
56            )) {
57
58            writer.write("#the value of this static final field might be set in the static constructor\n");
59        }
60
61        writer.write(".field ");
62        writeAccessFlags(writer, encodedField);
63        writer.write(encodedField.field.getFieldName().getStringValue());
64        writer.write(':');
65        writer.write(encodedField.field.getFieldType().getTypeDescriptor());
66        if (initialValue != null) {
67            writer.write(" = ");
68            EncodedValueAdaptor.writeTo(writer, initialValue);
69        }
70
71        writer.write('\n');
72
73        if (annotationSet != null) {
74            writer.indent(4);
75            AnnotationFormatter.writeTo(writer, annotationSet);
76            writer.deindent(4);
77            writer.write(".end field\n");
78        }
79    }
80
81    private static void writeAccessFlags(IndentingWriter writer, ClassDataItem.EncodedField encodedField)
82                                                                                                 throws IOException {
83        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForField(encodedField.accessFlags)) {
84            writer.write(accessFlag.toString());
85            writer.write(' ');
86        }
87    }
88}
89