• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
29 package org.jf.baksmali.Adaptors;
30 
31 import org.jf.baksmali.Adaptors.EncodedValue.EncodedValueAdaptor;
32 import org.jf.util.IndentingWriter;
33 import org.jf.dexlib.AnnotationSetItem;
34 import org.jf.dexlib.ClassDataItem;
35 import org.jf.dexlib.EncodedValue.EncodedValue;
36 import org.jf.dexlib.EncodedValue.NullEncodedValue;
37 import org.jf.dexlib.Util.AccessFlags;
38 
39 import java.io.IOException;
40 
41 public class FieldDefinition {
writeTo(IndentingWriter writer, ClassDataItem.EncodedField encodedField, EncodedValue initialValue, AnnotationSetItem annotationSet, boolean setInStaticConstructor)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 
writeAccessFlags(IndentingWriter writer, ClassDataItem.EncodedField encodedField)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