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