ClassDefinition.java revision c9be5e13034da9827b5598a6257376164745b827
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
31c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Analysis.ValidationException;
326ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.comimport org.jf.dexlib.EncodedValue.EncodedValue;
33fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.comimport org.jf.dexlib.*;
34fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Instruction;
35090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.comimport org.jf.dexlib.Code.Format.Instruction21c;
36bf4ca730cc857f76ee703e9efa73ad3e408c6c37JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.AccessFlags;
3729f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.comimport org.jf.dexlib.Util.SparseArray;
387ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplate;
397ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.comimport org.antlr.stringtemplate.StringTemplateGroup;
4036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
41fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.comimport java.util.*;
4236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
4336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.compublic class ClassDefinition {
447ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com    private StringTemplateGroup stg;
4536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    private ClassDefItem classDefItem;
4636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    private ClassDataItem classDataItem;
47fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
4829f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetItem> methodAnnotationsMap;
4929f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetItem> fieldAnnotationsMap;
5029f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com    private SparseArray<AnnotationSetRefList> parameterAnnotationsMap;
51fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
52090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    private SparseArray<FieldIdItem> fieldsSetInStaticConstructor;
53090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
54c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com    protected boolean validationErrors;
55c9be5e13034da9827b5598a6257376164745b827JesusFreke@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
647d9b1b10f03035153829553ae372947b75e17f70JesusFreke@JesusFreke.com    public StringTemplate createTemplate() {
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
81c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com    public boolean hadValidationErrors() {
82c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com        return validationErrors;
83c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com    }
84c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com
85fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com    private void buildAnnotationMaps() {
86cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
87fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com        if (annotationDirectory == null) {
8805c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            methodAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
8905c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
9005c9404ecde123f9c965d4d99967850b74f943f2JesusFreke@JesusFreke.com            parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(0);
91fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com            return;
92fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com        }
93fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com
9429f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        methodAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getMethodAnnotationCount());
95cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        annotationDirectory.iterateMethodAnnotations(new AnnotationDirectoryItem.MethodAnnotationIteratorDelegate() {
96cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processMethodAnnotations(MethodIdItem method, AnnotationSetItem methodAnnotations) {
97cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                methodAnnotationsMap.put(method.getIndex(), methodAnnotations);
98fa07a1972e3cff56d5615c18a8797ff58fc9f739JesusFreke@JesusFreke.com            }
99cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
100b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
10129f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getFieldAnnotationCount());
102cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        annotationDirectory.iterateFieldAnnotations(new AnnotationDirectoryItem.FieldAnnotationIteratorDelegate() {
103cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processFieldAnnotations(FieldIdItem field, AnnotationSetItem fieldAnnotations) {
104cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                fieldAnnotationsMap.put(field.getIndex(), fieldAnnotations);
105b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            }
106cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
1073c9013f9c08fa8effc9f6d4dc58212c68eb21742JesusFreke@JesusFreke.com
10829f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(
10929f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com                annotationDirectory.getParameterAnnotationCount());
11029f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com        annotationDirectory.iterateParameterAnnotations(
11129f49465ca358613486bd6bc61a1b9a5fa3bd1c1JesusFreke@JesusFreke.com          new AnnotationDirectoryItem.ParameterAnnotationIteratorDelegate() {
112cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            public void processParameterAnnotations(MethodIdItem method, AnnotationSetRefList parameterAnnotations) {
113cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                parameterAnnotationsMap.put(method.getIndex(), parameterAnnotations);
1143c9013f9c08fa8effc9f6d4dc58212c68eb21742JesusFreke@JesusFreke.com            }
115cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        });
11636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
11736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
118090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    private void findFieldsSetInStaticConstructor() {
119090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        fieldsSetInStaticConstructor = new SparseArray<FieldIdItem>();
120090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
121090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        if (classDataItem == null) {
122090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            return;
123090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        }
124090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
125090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        for (ClassDataItem.EncodedMethod directMethod: classDataItem.getDirectMethods()) {
126090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            if (directMethod.method.getMethodName().getStringValue().equals("<clinit>")) {
127090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
128fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                for (Instruction instruction: directMethod.codeItem.getInstructions()) {
129fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                    switch (instruction.opcode) {
130fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT:
131fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_BOOLEAN:
132fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_BYTE:
133fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_CHAR:
134fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_OBJECT:
135fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_SHORT:
136fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                        case SPUT_WIDE:
137fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            Instruction21c ins = (Instruction21c)instruction;
138fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            FieldIdItem fieldIdItem = (FieldIdItem)ins.getReferencedItem();
139fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                            fieldsSetInStaticConstructor.put(fieldIdItem.getIndex(), fieldIdItem);
140fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                    }
141fda2e631ac0b1ca092973b7fff4b2f38d2c23437JesusFreke@JesusFreke.com                }
142090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com            }
143090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        }
144090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com    }
145090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
1467885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<String> getAccessFlags() {
147b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        List<String> accessFlags = new ArrayList<String>();
14836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
149b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDefItem.getAccessFlags())) {
150b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            accessFlags.add(accessFlag.toString());
15136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
152b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
15336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return accessFlags;
15436836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
15536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
15636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1577885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private String getSuperType() {
15869c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        TypeIdItem superClass = classDefItem.getSuperclass();
15969c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        if (superClass != null) {
16069c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com            return superClass.getTypeDescriptor();
16169c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        }
16269c3abb483d8a6329f38fb3c30afa3d138d3adc0JesusFreke@JesusFreke.com        return null;
163b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com    }
164b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
1657885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private String getSourceFile() {
166630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        StringIdItem sourceFile = classDefItem.getSourceFile();
167630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com
168630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        if (sourceFile == null) {
169630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com            return null;
170630a384c6bb90358cc64c7fcbec6884fdac8f50dJesusFreke@JesusFreke.com        }
171cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        return classDefItem.getSourceFile().getStringValue();
17236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
17336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1747885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<String> getInterfaces() {
175b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        List<String> interfaces = new ArrayList<String>();
17636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
177cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com        TypeListItem interfaceList = classDefItem.getInterfaces();
17836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
179b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (interfaceList != null) {
180cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            for (TypeIdItem typeIdItem: interfaceList.getTypes()) {
181b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                interfaces.add(typeIdItem.getTypeDescriptor());
18236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
18336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
184090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
18536836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return interfaces;
18636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
18736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
1887885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getAnnotations() {
1897885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
1907885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        if (annotationDirectory == null) {
1917885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com            return null;
1927ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        }
1937885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
1947885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        AnnotationSetItem annotationSet = annotationDirectory.getClassAnnotations();
1957885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        if (annotationSet == null) {
1967885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com            return null;
1977885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        }
1987885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
1997885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        List<StringTemplate> annotations = new ArrayList<StringTemplate>();
2007885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com
2017885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        for (AnnotationItem annotationItem: annotationSet.getAnnotations()) {
2027d9b1b10f03035153829553ae372947b75e17f70JesusFreke@JesusFreke.com            annotations.add(AnnotationAdaptor.createTemplate(stg, annotationItem));
2037885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        }
2047885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com        return annotations;
2057ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com    }
2067ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com
2077885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getStaticFields() {
2087ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> staticFields = new ArrayList<StringTemplate>();
2096ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
2107ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        if (classDataItem != null) {
21122296e7f8366b81b37191f9e37ae9e8cee343492JesusFreke@JesusFreke.com            //if classDataItem is not null, then classDefItem won't be null either
21222296e7f8366b81b37191f9e37ae9e8cee343492JesusFreke@JesusFreke.com            assert(classDefItem != null);
213cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            EncodedArrayItem encodedStaticInitializers = classDefItem.getStaticFieldInitializers();
2146ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
215cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com            EncodedValue[] staticInitializers;
216b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            if (encodedStaticInitializers != null) {
217cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                staticInitializers = encodedStaticInitializers.getEncodedArray().values;
218b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            } else {
219cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                staticInitializers = new EncodedValue[0];
220b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            }
2216ef13753e78bb7abc7e7683d5e533c3395d4a9b6JesusFreke@JesusFreke.com
222b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            int i=0;
223b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedField field: classDataItem.getStaticFields()) {
224b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                EncodedValue encodedValue = null;
225cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                if (i < staticInitializers.length) {
226cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                    encodedValue = staticInitializers[i];
22736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com                }
228cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
2297ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com
230090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                boolean setInStaticConstructor =
231090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                        fieldsSetInStaticConstructor.get(field.field.getIndex()) != null;
232090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com
233090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                staticFields.add(FieldDefinition.createTemplate(stg, field, encodedValue, annotationSet,
234090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com                        setInStaticConstructor));
235b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com                i++;
23636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
23736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
23836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        return staticFields;
23936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
24036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2417885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getInstanceFields() {
2427ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com        List<StringTemplate> instanceFields = new ArrayList<StringTemplate>();
24336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
244b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com        if (classDataItem != null) {
245b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com            for (ClassDataItem.EncodedField field: classDataItem.getInstanceFields()) {
246cf6729c1ee64e732f28eb40386ecc69d4fb6b401JesusFreke@JesusFreke.com                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
2477ab77bc90be62b0688c97d4476e3bd219eace0daJesusFreke@JesusFreke.com                instanceFields.add(FieldDefinition.createTemplate(stg, field, annotationSet));
24836836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com            }
24936836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
250b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
251090e553f34a176bc558f0d70392181c0fbd83fe8JesusFreke@JesusFreke.com        return instanceFields;
25236836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
25336836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2547885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getDirectMethods() {
255b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        if (classDataItem == null) {
256b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            return null;
25736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
258b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
259b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        return getTemplatesForMethods(classDataItem.getDirectMethods());
26036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
26136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
2627885a819a0dc52568fedd60f7d8d0f0a9ca352e9JesusFreke@JesusFreke.com    private List<StringTemplate> getVirtualMethods() {
263b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        if (classDataItem == null) {
264b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            return null;
265b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        }
26636836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com
267b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        return getTemplatesForMethods(classDataItem.getVirtualMethods());
268b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com    }
269b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com
270b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com    private List<StringTemplate> getTemplatesForMethods(ClassDataItem.EncodedMethod[] methods) {
271b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        List<StringTemplate> methodTemplates = new ArrayList<StringTemplate>();
272b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com
273b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        for (ClassDataItem.EncodedMethod method: methods) {
274b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            AnnotationSetItem annotationSet = methodAnnotationsMap.get(method.method.getIndex());
275b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            AnnotationSetRefList parameterAnnotationList = parameterAnnotationsMap.get(method.method.getIndex());
276b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com
277b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            MethodDefinition methodDefinition = new MethodDefinition(stg, method);
278b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com
279b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com            methodTemplates.add(methodDefinition.createTemplate(annotationSet, parameterAnnotationList));
280c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com
281c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com            ValidationException validationException = methodDefinition.getValidationException();
282c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com            if (validationException != null) {
283c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com                //System.err.println(validationException.toString());
284c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com                validationException.printStackTrace(System.err);
285c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com                this.validationErrors = true;
286c9be5e13034da9827b5598a6257376164745b827JesusFreke@JesusFreke.com            }
28736836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com        }
288b6547e8fd56242dde90275d9b0ba6f3639083a61JesusFreke@JesusFreke.com
289b2e1e2067d5179b0ec38c76a5191909f5a7dc1ccJesusFreke@JesusFreke.com        return methodTemplates;
29036836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com    }
29136836121d7ecf72050d3ef065b7ab5fa86548319JesusFreke@JesusFreke.com}
292