@Override public void visitEnum(String name, String desc, String value) { elems.add(new AnnotationEnumElem(desc, value, 'e', name)); }
@Override public void caseAnnotationEnumElem(AnnotationEnumElem v) { try { Class<?> clazz = ClassLoaderUtils.loadClass(v.getTypeName().replace('/', '.')); // find out which enum constant is used. Enum<?> result = null; for (Object o : clazz.getEnumConstants()) { try { Enum<?> t = (Enum<?>) o; if (t.name().equals(v.getConstantName())) { result = t; break; } } catch (ClassCastException e) { throw new RuntimeException("Class " + v.getTypeName() + " is no Enum"); } } if (result == null) { throw new RuntimeException(v.getConstantName() + " is not a EnumConstant of " + v.getTypeName()); } setResult(new AnnotationElemResult<Enum<?>>(v.getName(), result)); } catch (ClassNotFoundException e) { throw new RuntimeException("Could not load class: " + v.getTypeName()); } }
result.append(".enum_kind "); result.append("\"" + elem.getName() + "\" "); result.append(soot.util.StringTools.getQuotedStringOf(((AnnotationEnumElem) elem).getTypeName())); result.append(" "); result.append(soot.util.StringTools.getQuotedStringOf(((AnnotationEnumElem) elem).getConstantName())); result.append("\n"); break;
case 'e': // enum AnnotationEnumElem enumElem = (AnnotationEnumElem) e; annotationType = Util.getType(enumElem.getTypeName());
AnnotationEnumElem e = (AnnotationEnumElem) elem; String classT = SootToDexUtils.getDexClassName(e.getTypeName()); String fieldT = classT; return new ImmutableEnumEncodedValue(new ImmutableFieldReference(classT, e.getConstantName(), fieldT));
cp_info name_val = coffiClass.constant_pool[ecev.constant_name_index]; String constant_name = ((CONSTANT_Utf8_info) name_val).convert(); AnnotationEnumElem elem = new AnnotationEnumElem(type_name, constant_name, kind, elemName); list.add(elem); } else if (kind == 'c') {
if (elem instanceof AnnotationEnumElem) { AnnotationEnumElem enumElem = (AnnotationEnumElem) elem; av.visitEnum(enumElem.getName(), enumElem.getTypeName(), enumElem.getConstantName()); } else if (elem instanceof AnnotationArrayElem) { AnnotationArrayElem arrayElem = (AnnotationArrayElem) elem;
Variable v = getExpr().varDecl(); if(v == null) throw new Error("Expected Enumeration constant"); list.add(new soot.tagkit.AnnotationEnumElem(v.type().typeDescriptor(), v.name(), 'e', name));
elem = new AnnotationEnumElem(DexType.toSootAT(fr.getType()).toString(), fr.getName(), 'e', ae.getName()); break;
cp_info name_val = coffiClass.constant_pool[ecev.constant_name_index]; String constant_name = ((CONSTANT_Utf8_info)name_val).convert(); AnnotationEnumElem elem = new AnnotationEnumElem(type_name, constant_name, kind, elemName); list.add(elem);
cp_info name_val = coffiClass.constant_pool[ecev.constant_name_index]; String constant_name = ((CONSTANT_Utf8_info)name_val).convert(); AnnotationEnumElem elem = new AnnotationEnumElem(type_name, constant_name, kind, elemName); list.add(elem);