ClassDefinition.java revision fda2e631ac0b1ca092973b7fff4b2f38d2c23437
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)/*
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * [The "BSD licence"]
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Copyright (c) 2009 Ben Gruver
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * All rights reserved.
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * modification, are permitted provided that the following conditions
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * are met:
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 3. The name of the author may not be used to endorse or promote products
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *    derived from this software without specific prior written permission.
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)package org.jf.baksmali.Adaptors;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.EncodedValue.EncodedValue;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.*;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Code.InstructionIterator;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Code.Opcode;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Code.Instruction;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Code.Format.Format;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Code.Format.Instruction21c;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Util.AccessFlags;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.jf.dexlib.Util.SparseArray;
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.antlr.stringtemplate.StringTemplate;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import org.antlr.stringtemplate.StringTemplateGroup;
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)import java.util.*;
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public class ClassDefinition {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private StringTemplateGroup stg;
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private ClassDefItem classDefItem;
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private ClassDataItem classDataItem;
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private SparseArray<AnnotationSetItem> methodAnnotationsMap;
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private SparseArray<AnnotationSetItem> fieldAnnotationsMap;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private SparseArray<AnnotationSetRefList> parameterAnnotationsMap;
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private SparseArray<FieldIdItem> fieldsSetInStaticConstructor;
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public ClassDefinition(StringTemplateGroup stg, ClassDefItem classDefItem) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.stg = stg;
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.classDefItem = classDefItem;
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        this.classDataItem = classDefItem.getClassData();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        buildAnnotationMaps();
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        findFieldsSetInStaticConstructor();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public StringTemplate makeTemplate() {
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        StringTemplate template = stg.getInstanceOf("smaliFile");
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("AccessFlags", getAccessFlags());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("ClassType", classDefItem.getClassType().getTypeDescriptor());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("SuperType", getSuperType());
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("SourceFile", getSourceFile());
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("Interfaces", getInterfaces());
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("Annotations", getAnnotations());
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("StaticFields", getStaticFields());
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("InstanceFields", getInstanceFields());
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("DirectMethods", getDirectMethods());
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        template.setAttribute("VirtualMethods", getVirtualMethods());
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return template;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void buildAnnotationMaps() {
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (annotationDirectory == null) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            methodAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(0);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(0);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        methodAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getMethodAnnotationCount());
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        annotationDirectory.iterateMethodAnnotations(new AnnotationDirectoryItem.MethodAnnotationIteratorDelegate() {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void processMethodAnnotations(MethodIdItem method, AnnotationSetItem methodAnnotations) {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                methodAnnotationsMap.put(method.getIndex(), methodAnnotations);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fieldAnnotationsMap = new SparseArray<AnnotationSetItem>(annotationDirectory.getFieldAnnotationCount());
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        annotationDirectory.iterateFieldAnnotations(new AnnotationDirectoryItem.FieldAnnotationIteratorDelegate() {
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void processFieldAnnotations(FieldIdItem field, AnnotationSetItem fieldAnnotations) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                fieldAnnotationsMap.put(field.getIndex(), fieldAnnotations);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        parameterAnnotationsMap = new SparseArray<AnnotationSetRefList>(
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                annotationDirectory.getParameterAnnotationCount());
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        annotationDirectory.iterateParameterAnnotations(
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          new AnnotationDirectoryItem.ParameterAnnotationIteratorDelegate() {
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            public void processParameterAnnotations(MethodIdItem method, AnnotationSetRefList parameterAnnotations) {
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                parameterAnnotationsMap.put(method.getIndex(), parameterAnnotations);
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        });
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private void findFieldsSetInStaticConstructor() {
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        fieldsSetInStaticConstructor = new SparseArray<FieldIdItem>();
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (classDataItem == null) {
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return;
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (ClassDataItem.EncodedMethod directMethod: classDataItem.getDirectMethods()) {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (directMethod.method.getMethodName().getStringValue().equals("<clinit>")) {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                for (Instruction instruction: directMethod.codeItem.getInstructions()) {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    switch (instruction.opcode) {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT:
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_BOOLEAN:
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_BYTE:
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_CHAR:
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_OBJECT:
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_SHORT:
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        case SPUT_WIDE:
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            Instruction21c ins = (Instruction21c)instruction;
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            FieldIdItem fieldIdItem = (FieldIdItem)ins.getReferencedItem();
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            fieldsSetInStaticConstructor.put(fieldIdItem.getIndex(), fieldIdItem);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    }
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private List<String> getAccessFlags() {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        List<String> accessFlags = new ArrayList<String>();
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDefItem.getAccessFlags())) {
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            accessFlags.add(accessFlag.toString());
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return accessFlags;
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private String getSuperType() {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TypeIdItem superClass = classDefItem.getSuperclass();
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (superClass != null) {
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return superClass.getTypeDescriptor();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return null;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private String getSourceFile() {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        StringIdItem sourceFile = classDefItem.getSourceFile();
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (sourceFile == null) {
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return null;
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return classDefItem.getSourceFile().getStringValue();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private List<String> getInterfaces() {
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        List<String> interfaces = new ArrayList<String>();
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        TypeListItem interfaceList = classDefItem.getInterfaces();
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (interfaceList != null) {
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            for (TypeIdItem typeIdItem: interfaceList.getTypes()) {
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                interfaces.add(typeIdItem.getTypeDescriptor());
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return interfaces;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private List<StringTemplate> getAnnotations() {
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AnnotationDirectoryItem annotationDirectory = classDefItem.getAnnotations();
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (annotationDirectory == null) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return null;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AnnotationSetItem annotationSet = annotationDirectory.getClassAnnotations();
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (annotationSet == null) {
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            return null;
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        List<StringTemplate> annotations = new ArrayList<StringTemplate>();
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        for (AnnotationItem annotationItem: annotationSet.getAnnotations()) {
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            annotations.add(AnnotationAdaptor.makeTemplate(stg, annotationItem));
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        }
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return annotations;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    private List<StringTemplate> getStaticFields() {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        List<StringTemplate> staticFields = new ArrayList<StringTemplate>();
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        if (classDataItem != null) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EncodedArrayItem encodedStaticInitializers = classDefItem.getStaticFieldInitializers();
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            EncodedValue[] staticInitializers;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            if (encodedStaticInitializers != null) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                staticInitializers = encodedStaticInitializers.getEncodedArray().values;
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            } else {
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                staticInitializers = new EncodedValue[0];
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            }
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            int i=0;
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            for (ClassDataItem.EncodedField field: classDataItem.getStaticFields()) {
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                EncodedValue encodedValue = null;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                if (i < staticInitializers.length) {
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    encodedValue = staticInitializers[i];
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                }
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
224                boolean setInStaticConstructor =
225                        fieldsSetInStaticConstructor.get(field.field.getIndex()) != null;
226
227                staticFields.add(FieldDefinition.createTemplate(stg, field, encodedValue, annotationSet,
228                        setInStaticConstructor));
229                i++;
230            }
231        }
232        return staticFields;
233    }
234
235    private List<StringTemplate> getInstanceFields() {
236        List<StringTemplate> instanceFields = new ArrayList<StringTemplate>();
237
238        if (classDataItem != null) {
239            for (ClassDataItem.EncodedField field: classDataItem.getInstanceFields()) {
240                AnnotationSetItem annotationSet = fieldAnnotationsMap.get(field.field.getIndex());
241                instanceFields.add(FieldDefinition.createTemplate(stg, field, annotationSet));
242            }
243        }
244
245        return instanceFields;
246    }
247
248    private List<StringTemplate> getDirectMethods() {
249        List<StringTemplate> directMethods = new ArrayList<StringTemplate>();
250
251        if (classDataItem != null) {
252            for (ClassDataItem.EncodedMethod method: classDataItem.getDirectMethods()) {
253                AnnotationSetItem annotationSet = methodAnnotationsMap.get(method.method.getIndex());
254                AnnotationSetRefList parameterAnnotationList = parameterAnnotationsMap.get(method.method.getIndex());
255                directMethods.add(MethodDefinition.makeTemplate(stg, method, annotationSet, parameterAnnotationList));
256            }
257        }
258
259        return directMethods;
260    }
261
262    private List<StringTemplate> getVirtualMethods() {
263        List<StringTemplate> virtualMethods = new ArrayList<StringTemplate>();
264
265        if (classDataItem != null) {
266            for (ClassDataItem.EncodedMethod method: classDataItem.getVirtualMethods()) {
267                AnnotationSetItem annotationSet = methodAnnotationsMap.get(method.method.getIndex());
268                AnnotationSetRefList parameterAnnotationList = parameterAnnotationsMap.get(method.method.getIndex());
269                virtualMethods.add(MethodDefinition.makeTemplate(stg, method, annotationSet, parameterAnnotationList));
270            }
271        }
272
273        return virtualMethods;
274    }
275}
276