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