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