private Annotation parseAnnotation(AnnotationVisibility visibility) throws IOException {
    requireLength(4);

    int typeIndex = input.readUnsignedShort();
    int numElements = input.readUnsignedShort();
    CstString typeString = (CstString) pool.get(typeIndex);
    CstType type = new CstType(Type.intern(typeString.getString()));

    if (observer != null) {
      parsed(2, "type: " + type.toHuman());
      parsed(2, "num_elements: " + numElements);
    }

    Annotation annotation = new Annotation(type, visibility);

    for (int i = 0; i < numElements; i++) {
      if (observer != null) {
        parsed(0, "elements[" + i + "]:");
        changeIndent(1);
      }

      NameValuePair element = parseElement();
      annotation.add(element);

      if (observer != null) {
        changeIndent(-1);
      }
    }

    annotation.setImmutable();
    return annotation;
  }
Parses a single annotation.

@param visibility {@code non-null;} visibility of the parsed annotation
@return {@code non-null;} the parsed annotation
android/android_framework/dex-maker/src/main/java/com/android/dx/cf/direct/AnnotationParser.java