@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 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;
   }
 }
 @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);
   }
 }