boolean matchSuperTypeReference(
      SuperTypeReferencePattern pattern, Object binaryInfo, IBinaryType enclosingBinaryType) {
    if (!(binaryInfo instanceof IBinaryType)) return false;

    IBinaryType type = (IBinaryType) binaryInfo;
    if (pattern.superRefKind != SuperTypeReferencePattern.ONLY_SUPER_INTERFACES) {
      char[] vmName = type.getSuperclassName();
      if (vmName != null) {
        char[] superclassName = convertClassFileFormat(vmName);
        if (checkTypeName(
            pattern.superSimpleName,
            pattern.superQualification,
            superclassName,
            pattern.isCaseSensitive(),
            pattern.isCamelCase())) return true;
      }
    }

    if (pattern.superRefKind != SuperTypeReferencePattern.ONLY_SUPER_CLASSES) {
      char[][] superInterfaces = type.getInterfaceNames();
      if (superInterfaces != null) {
        for (int i = 0, max = superInterfaces.length; i < max; i++) {
          char[] superInterfaceName = convertClassFileFormat(superInterfaces[i]);
          if (checkTypeName(
              pattern.superSimpleName,
              pattern.superQualification,
              superInterfaceName,
              pattern.isCaseSensitive(),
              pattern.isCamelCase())) return true;
        }
      }
    }
    return false;
  }