ClassDefinition.java revision fda2e631ac0b1ca092973b7fff4b2f38d2c23437
136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com/*
236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * [The "BSD licence"]
336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * Copyright (c) 2009 Ben Gruver
436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * All rights reserved.
536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *
636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * Redistribution and use in source and binary forms, with or without
736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * modification, are permitted provided that the following conditions
836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * are met:
936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * 1. Redistributions of source code must retain the above copyright
1036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *    notice, this list of conditions and the following disclaimer.
1136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * 2. Redistributions in binary form must reproduce the above copyright
1236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *    notice, this list of conditions and the following disclaimer in the
1336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *    documentation and/or other materials provided with the distribution.
1436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * 3. The name of the author may not be used to endorse or promote products
1536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *    derived from this software without specific prior written permission.
1636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com *
1736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com */
2836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
296ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.compackage org.jf.baksmali.Adaptors;
3036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
316ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.comimport org.jf.dexlib.EncodedValue.EncodedValue;
32fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.comimport org.jf.dexlib.*;
33090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.InstructionIterator;
34090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Opcode;
35fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Instruction;
36090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.Format;
37090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.Instruction21c;
38bf4ca730cc857f76ee703e9efa73ad3e408c6c37JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.AccessFlags;
3929f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.SparseArray;
407ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplate;
417ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplateGroup;
4236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
43fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.comimport java.util.*;
4436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
4536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.compublic class ClassDefinition {
467ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com    private StringTemplateGroup stg;
4736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    private ClassDefItem classDefItem;
4836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    private ClassDataItem classDataItem;
49fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
5029f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetItem> methodAnnotationsMap;
5129f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetItem> fieldAnnotationsMap;
5229f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetRefList> parameterAnnotationsMap;
53fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
54090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    private SparseArray<FieldIdItem> fieldsSetInStaticConstructor;
55090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
567ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com    public ClassDefinition(StringTemplateGroup stg, ClassDefItem classDefItem) {
577ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        this.stg = stg;
5836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        this.classDefItem = classDefItem;
5936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        this.classDataItem = classDefItem.getClassData();
60fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com        buildAnnotationMaps();
61090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        findFieldsSetInStaticConstructor();
62fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com    }
63fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
647885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    public StringTemplate makeTemplate() {
657885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        StringTemplate template = stg.getInstanceOf("smaliFile");
667885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
677885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("AccessFlags", getAccessFlags());
687885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("ClassType", classDefItem.getClassType().getTypeDescriptor());
697885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("SuperType", getSuperType());
707885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("SourceFile", getSourceFile());
717885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("Interfaces", getInterfaces());
727885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("Annotations", getAnnotations());
737885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("StaticFields", getStaticFields());
747885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("InstanceFields", getInstanceFields());
757885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("DirectMethods", getDirectMethods());
767885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        template.setAttribute("VirtualMethods", getVirtualMethods());
777885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
787885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        return template;
797885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    }
807885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
81fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com    private void buildAnnotationMaps() {
82cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
83fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com        if (annotationDirectory == null) {
8405c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            methodAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
8505c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
8605c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(0);
87fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com            return;
88fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com        }
89fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
9029f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        methodAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getMethodAnnotationCount());
91cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        annotationDirectory.iterateMethodAnnotations(new AnnotationDirectoryItem.MethodAnnotationIteratorDelegate() {
92cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processMethodAnnotations(MethodIdItem method, AnnotationSetItem methodAnnotations) {
93cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                methodAnnotationsMap.put(method.getIndex(), methodAnnotations);
94fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com            }
95cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
96b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
9729f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getFieldAnnotationCount());
98cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        annotationDirectory.iterateFieldAnnotations(new AnnotationDirectoryItem.FieldAnnotationIteratorDelegate() {
99cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processFieldAnnotations(FieldIdItem field, AnnotationSetItem fieldAnnotations) {
100cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                fieldAnnotationsMap.put(field.getIndex(), fieldAnnotations);
101b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            }
102cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
1033c9013f9c08fa8effc9f6d4dc58212c68eb21742JesusFreke@JesusFreke.com
10429f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(
10529f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com                annotationDirectory.getParameterAnnotationCount());
10629f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        annotationDirectory.iterateParameterAnnotations(
10729f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com          new AnnotationDirectoryItem.ParameterAnnotationIteratorDelegate() {
108cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processParameterAnnotations(MethodIdItem method, AnnotationSetRefList parameterAnnotations) {
109cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                parameterAnnotationsMap.put(method.getIndex(), parameterAnnotations);
1103c9013f9c08fa8effc9f6d4dc58212c68eb21742JesusFreke@JesusFreke.com            }
111cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
11236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
11336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
114090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    private void findFieldsSetInStaticConstructor() {
115090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        fieldsSetInStaticConstructor = new SparseArray<FieldIdItem>();
116090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
117090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        if (classDataItem == null) {
118090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            return;
119090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        }
120090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
121090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        for (ClassDataItem.EncodedMethod directMethod: classDataItem.getDirectMethods()) {
122090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            if (directMethod.method.getMethodName().getStringValue().equals("<clinit>")) {
123090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
124fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                for (Instruction instruction: directMethod.codeItem.getInstructions()) {
125fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                    switch (instruction.opcode) {
126fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT:
127fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_BOOLEAN:
128fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_BYTE:
129fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_CHAR:
130fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_OBJECT:
131fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_SHORT:
132fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_WIDE:
133fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            Instruction21c ins = (Instruction21c)instruction;
134fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            FieldIdItem fieldIdItem = (FieldIdItem)ins.getReferencedItem();
135fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            fieldsSetInStaticConstructor.put(fieldIdItem.getIndex(), fieldIdItem);
136fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                    }
137fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                }
138090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            }
139090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        }
140090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    }
141090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
1427885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<String> getAccessFlags() {
143b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        List<String> accessFlags = new ArrayList<String>();
14436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
145b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDefItem.getAccessFlags())) {
146b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            accessFlags.add(accessFlag.toString());
14736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
148b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
14936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return accessFlags;
15036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
15136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
15236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1537885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private String getSuperType() {
15469c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        TypeIdItem superClass = classDefItem.getSuperclass();
15569c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        if (superClass != null) {
15669c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com            return superClass.getTypeDescriptor();
15769c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        }
15869c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        return null;
159b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com    }
160b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
1617885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private String getSourceFile() {
162630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        StringIdItem sourceFile = classDefItem.getSourceFile();
163630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com
164630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        if (sourceFile == null) {
165630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com            return null;
166630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        }
167cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        return classDefItem.getSourceFile().getStringValue();
16836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
16936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1707885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<String> getInterfaces() {
171b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        List<String> interfaces = new ArrayList<String>();
17236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
173cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        TypeListItem interfaceList = classDefItem.getInterfaces();
17436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
175b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (interfaceList != null) {
176cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            for (TypeIdItem typeIdItem: interfaceList.getTypes()) {
177b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                interfaces.add(typeIdItem.getTypeDescriptor());
17836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
17936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
180090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
18136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return interfaces;
18236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
18336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1847885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getAnnotations() {
1857885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
1867885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        if (annotationDirectory == null) {
1877885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com            return null;
1887ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        }
1897885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
1907885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        AnnotationSetItem annotationSet = annotationDirectory.getClassAnnotations();
1917885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        if (annotationSet == null) {
1927885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com            return null;
1937885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        }
1947885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
1957885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        List<StringTemplate> annotations = new ArrayList<StringTemplate>();
1967885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
1977885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        for (AnnotationItem annotationItem: annotationSet.getAnnotations()) {
1987885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com            annotations.add(AnnotationAdaptor.makeTemplate(stg, annotationItem));
1997885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        }
2007885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        return annotations;
2017ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com    }
2027ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com
2037885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getStaticFields() {
2047ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> staticFields = new ArrayList<StringTemplate>();
2056ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
2067ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        if (classDataItem != null) {
207cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            EncodedArrayItem encodedStaticInitializers = classDefItem.getStaticFieldInitializers();
2086ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
209cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            EncodedValue[] staticInitializers;
210b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            if (encodedStaticInitializers != null) {
211cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                staticInitializers = encodedStaticInitializers.getEncodedArray().values;
212b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            } else {
213cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                staticInitializers = new EncodedValue[0];
214b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            }
2156ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
216b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            int i=0;
217b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedField field: classDataItem.getStaticFields()) {
218b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                EncodedValue encodedValue = null;
219cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                if (i < staticInitializers.length) {
220cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                    encodedValue = staticInitializers[i];
22136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com                }
222cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
2237ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com
224090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                boolean setInStaticConstructor =
225090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                        fieldsSetInStaticConstructor.get(field.field.getIndex()) != null;
226090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
227090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                staticFields.add(FieldDefinition.createTemplate(stg, field, encodedValue, annotationSet,
228090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                        setInStaticConstructor));
229b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                i++;
23036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
23136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
23236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return staticFields;
23336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
23436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2357885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getInstanceFields() {
2367ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> instanceFields = new ArrayList<StringTemplate>();
23736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
238b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (classDataItem != null) {
239b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedField field: classDataItem.getInstanceFields()) {
240cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
2417ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com                instanceFields.add(FieldDefinition.createTemplate(stg, field, annotationSet));
24236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
24336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
244b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
245090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        return instanceFields;
24636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
24736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2487885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getDirectMethods() {
2497ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> directMethods = new ArrayList<StringTemplate>();
25036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
251b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (classDataItem != null) {
252b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedMethod method: classDataItem.getDirectMethods()) {
253cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = methodAnnotationsMap.get(method.method.getIndex());
254cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetRefList parameterAnnotationList = parameterAnnotationsMap.get(method.method.getIndex());
2557ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com                directMethods.add(MethodDefinition.makeTemplate(stg, method, annotationSet, parameterAnnotationList));
25636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
25736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
258b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
25936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return directMethods;
26036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
26136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2627885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getVirtualMethods() {
2637ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> virtualMethods = new ArrayList<StringTemplate>();
26436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
265b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (classDataItem != null) {
266b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedMethod method: classDataItem.getVirtualMethods()) {
267cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = methodAnnotationsMap.get(method.method.getIndex());
268cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetRefList parameterAnnotationList = parameterAnnotationsMap.get(method.method.getIndex());
2697ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com                virtualMethods.add(MethodDefinition.makeTemplate(stg, method, annotationSet, parameterAnnotationList));
27036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
27136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
272b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
27336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return virtualMethods;
27436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
27536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com}
276