@Override public AnnotationVisitor visitAnnotation(final String name, final String desc) { AnnotationValueDescriptor valueDescriptor = createValue(AnnotationValueDescriptor.class, name); valueDescriptor.setType(visitorHelper.getTypeDescriptor(visitorHelper.getType(desc))); addValue(name, valueDescriptor); return new AnnotationVisitor(valueDescriptor, visitorHelper); }
@Override public org.objectweb.asm.AnnotationVisitor visitParameterAnnotation( final int parameter, final String desc, final boolean visible) { String annotationType = SignatureHelper.getType(desc); if (JAVA_LANG_SYNTHETIC.equals(annotationType)) { // Ignore synthetic parameters add the start of the signature, i.e. // determine the number of synthetic parameters syntheticParameters = Math.max(syntheticParameters, parameter + 1); return null; } ParameterDescriptor parameterDescriptor = visitorHelper.getParameterDescriptor(methodDescriptor, parameter - syntheticParameters); if (parameterDescriptor == null) { LOGGER.warn( "Cannot find parameter with index " + (parameter - syntheticParameters) + " in method signature " + containingType.getTypeDescriptor().getFullQualifiedName() + "#" + methodDescriptor.getSignature()); return null; } AnnotationValueDescriptor annotationDescriptor = visitorHelper.addAnnotation( containingType, parameterDescriptor, SignatureHelper.getType(desc)); return new AnnotationVisitor(containingType, annotationDescriptor, visitorHelper); }
@Override public void visitMethodInsn( final int opcode, final String owner, final String name, final String desc, boolean itf) { String methodSignature = SignatureHelper.getMethodSignature(name, desc); TypeCache.CachedType targetType = visitorHelper.resolveType(SignatureHelper.getObjectType(owner), containingType); MethodDescriptor invokedMethodDescriptor = visitorHelper.getMethodDescriptor(targetType, methodSignature); visitorHelper.addInvokes(methodDescriptor, line, invokedMethodDescriptor); }
@Override public void visitEnum(final String name, final String desc, final String value) { EnumValueDescriptor valueDescriptor = createValue(EnumValueDescriptor.class, name); TypeDescriptor typeDescriptor = visitorHelper.getTypeDescriptor(visitorHelper.getType(desc)); FieldDescriptor fieldDescriptor = visitorHelper.getFieldDescriptor( typeDescriptor, visitorHelper.getFieldSignature(value, desc)); valueDescriptor.setType(visitorHelper.getTypeDescriptor(Enum.class.getName())); valueDescriptor.setValue(fieldDescriptor); addValue(name, valueDescriptor); }
@Override public void visit(final String name, final Object value) { if (value instanceof Type) { String type = visitorHelper.getType((Type) value); ClassValueDescriptor valueDescriptor = createValue(ClassValueDescriptor.class, name); valueDescriptor.setValue(visitorHelper.getTypeDescriptor(type)); addValue(name, valueDescriptor); } else { PrimitiveValueDescriptor valueDescriptor = createValue(PrimitiveValueDescriptor.class, name); TypeDescriptor typeDescriptor = visitorHelper.getTypeDescriptor(value.getClass().getName()); valueDescriptor.setType(typeDescriptor); valueDescriptor.setValue(value); addValue(name, valueDescriptor); } }
@Override public AnnotationVisitor visitAnnotation(final String desc, final boolean visible) { AnnotationValueDescriptor annotationDescriptor = visitorHelper.addAnnotation( containingType, methodDescriptor, SignatureHelper.getType(desc)); return new AnnotationVisitor(containingType, annotationDescriptor, visitorHelper); }
@Override public void visitClassType(String name) { resolvedTypeDescriptor = visitorHelper .resolveType(SignatureHelper.getObjectType(name), containingType) .getTypeDescriptor(); }
@Override public void visitTryCatchBlock( final Label start, final Label end, final Label handler, final String type) { if (type != null) { String fullQualifiedName = SignatureHelper.getObjectType(type); visitorHelper.resolveType(fullQualifiedName, containingType); } }
@Override public void visitFieldInsn( final int opcode, final String owner, final String name, final String desc) { String fieldSignature = SignatureHelper.getFieldSignature(name, desc); TypeCache.CachedType targetType = visitorHelper.resolveType(SignatureHelper.getObjectType(owner), containingType); FieldDescriptor fieldDescriptor = visitorHelper.getFieldDescriptor(targetType, fieldSignature); switch (opcode) { case Opcodes.GETFIELD: case Opcodes.GETSTATIC: visitorHelper.addReads(methodDescriptor, line, fieldDescriptor); break; case Opcodes.PUTFIELD: case Opcodes.PUTSTATIC: visitorHelper.addWrites(methodDescriptor, line, fieldDescriptor); break; } }
/** * Create a value descriptor of given type and name and initializes it. * * @param type The class type. * @param name The name * @param <T> The type. * @return The initialized descriptor. */ private <T extends ValueDescriptor> T createValue(Class<T> type, String name) { if (name != null) { this.arrayValueDescriptor = null; } String valueName; if (arrayValueDescriptor != null) { valueName = "[" + getListValue(this.arrayValueDescriptor).size() + "]"; } else { valueName = name; } T valueDescriptor = visitorHelper.getValueDescriptor(type); valueDescriptor.setName(valueName); return valueDescriptor; }
@Override public void visitTypeInsn(final int opcode, final String type) { visitorHelper.resolveType(SignatureHelper.getObjectType(type), containingType); }
@Override public void visitMultiANewArrayInsn(final String desc, final int dims) { visitorHelper.resolveType(SignatureHelper.getType(desc), containingType); }
@Override public void visitLdcInsn(final Object cst) { if (cst instanceof Type) { visitorHelper.resolveType(SignatureHelper.getType((Type) cst), containingType); } }
@Override public void visitInnerClassType(String name) { String innerClassName = resolvedTypeDescriptor.getFullQualifiedName() + "$" + name; resolvedTypeDescriptor = visitorHelper.resolveType(innerClassName, containingType).getTypeDescriptor(); }