docs: public static Descriptor getDescriptor(Class<?> cls) throws IOException {
  
          String idl = ProtobufIDLGenerator.getIDL(cls);
          ProtoFile file = ProtoSchemaParser.parse(ProtobufIDLProxy.DEFAULT_FILE_NAME, idl);
  
          FileDescriptorProtoPOJO fileDescriptorProto = new FileDescriptorProtoPOJO();
  
          fileDescriptorProto.name = ProtobufIDLProxy.DEFAULT_FILE_NAME;
          fileDescriptorProto.pkg = file.getPackageName();
          fileDescriptorProto.dependencies = file.getDependencies();
          fileDescriptorProto.publicDependency = convertList(file.getPublicDependencies());
          fileDescriptorProto.weakDependency = null; // XXX
  
          fileDescriptorProto.messageTypes = new ArrayList<DescriptorProtoPOJO>();
          fileDescriptorProto.enumTypes = new ArrayList<EnumDescriptorProtoPOJO>();
          fileDescriptorProto.services = new ArrayList<ServiceDescriptorProtoPOJO>();
  
          Set<String> messageSet = new HashSet<String>();
          Set<String> enumSet = new HashSet<String>();
  
          List<com.squareup.protoparser.Type> typeElements = file.getTypes();
          if (typeElements != null) {
  
              for (com.squareup.protoparser.Type typeElement : typeElements) {
                  if (typeElement instanceof MessageType) {
                      messageSet.add(typeElement.getName());
                  } else if (typeElement instanceof EnumType) {
                      enumSet.add(typeElement.getName());
                  }
  
              }
  
              for (com.squareup.protoparser.Type typeElement : typeElements) {
  
                  if (typeElement instanceof MessageType) {
                      fileDescriptorProto.messageTypes.add(
                              getDescritorProtoPOJO(fileDescriptorProto, (MessageType) typeElement, messageSet, enumSet));
                  } else if (typeElement instanceof EnumType) {
                      fileDescriptorProto.enumTypes.add(
                              getDescritorProtoPOJO(fileDescriptorProto, (EnumType) typeElement, messageSet, enumSet));
                  }
  
              }
          }
  
          FileDescriptorProto fileproto;
          try {
              Codec<FileDescriptorProtoPOJO> descriptorCodec = ProtobufProxy.create(FileDescriptorProtoPOJO.class,
                      ProtobufProxy.isCacheEnabled(), ProtobufProxy.OUTPUT_PATH.get());
              byte[] bs = descriptorCodec.encode(fileDescriptorProto);
              fileproto = FileDescriptorProto.parseFrom(bs);
          } catch (InvalidProtocolBufferException e) {
              throw new IOException("Failed to parse protocol buffer descriptor for generated code.", e);
          }
  
          FileDescriptor fileDescriptor;
          try {
              fileDescriptor =
                      FileDescriptor.buildFrom(fileproto, new com.google.protobuf.Descriptors.FileDescriptor[] {});
          } catch (DescriptorValidationException e) {
              throw new IOException(e.getMessage(), e);
          }
  
          return fileDescriptor.getMessageTypes().get(0);
      }