docs: private static DescriptorProtoPOJO getDescritorProtoPOJO(FileDescriptorProtoPOJO fileDescriptorProto,
              MessageElement typeElement, Set<String> messageSet, Set<String> enumSet) {
  
          DescriptorProtoPOJO ret = new DescriptorProtoPOJO();
          ret.name = typeElement.name();
          ret.fields = new ArrayList<FieldDescriptorProtoPOJO>();
          ret.nestedTypes = new ArrayList<DescriptorProtoPOJO>();
          ret.enumTypes = new ArrayList<EnumDescriptorProtoPOJO>();
          ret.extensionRanges = new ArrayList<ExtensionRangePOJO>();
          ret.extensions = new ArrayList<FieldDescriptorProtoPOJO>();
          ret.options = new ArrayList<MessageOptionsPOJO>();
          ret.oneofDecls = new ArrayList<OneofDescriptorProtoPOJO>();
  
          List<FieldElement> fields = typeElement.fields();
          if (fields != null) {
              FieldDescriptorProtoPOJO fieldDescriptorProto;
              for (FieldElement fieldElement : fields) {
                  fieldDescriptorProto = new FieldDescriptorProtoPOJO();
                  fieldDescriptorProto.name = fieldElement.name();
                  fieldDescriptorProto.extendee = null; // XXX
                  fieldDescriptorProto.number = fieldElement.tag();
  
                  FieldElement.Label label = fieldElement.label();
                  if (label == FieldElement.Label.OPTIONAL) {
                      fieldDescriptorProto.label = Label.LABEL_OPTIONAL;
                  } else if (label == FieldElement.Label.REQUIRED) {
                      fieldDescriptorProto.label = Label.LABEL_REQUIRED;
                  } else if (label == FieldElement.Label.REPEATED) {
                      fieldDescriptorProto.label = Label.LABEL_REPEATED;
                  }
  
                  DataType type = fieldElement.type();
                  if (type.kind() == Kind.MAP) {
                      String messageName = StringUtils.capitalize(fieldDescriptorProto.name) + MAP_ENTRY_SUFFIX;
                      fieldDescriptorProto.type = Type.TYPE_MESSAGE;
                      fieldDescriptorProto.typeName = CodeGenerator.PACKAGE_SPLIT + fileDescriptorProto.pkg
                              + CodeGenerator.PACKAGE_SPLIT + ret.name + CodeGenerator.PACKAGE_SPLIT + messageName;
                      // refix label type
                      fieldDescriptorProto.label = Label.LABEL_REPEATED;
  
                      // here should add key and value type message type
                      DataType.MapType mapType = (DataType.MapType) type;
  
                      MessageElement messageElement = getMapKVMessageElements(messageName, mapType);
  
                      ret.nestedTypes
                              .add(getDescritorProtoPOJO(fileDescriptorProto, messageElement, messageSet, enumSet));
  
                  } else if (type.kind() == Kind.MAP || type.kind() == Kind.NAMED) {
                      fieldDescriptorProto.typeName = ((DataType.NamedType) type).name();
                      if (messageSet.contains(fieldDescriptorProto.typeName)) {
                          fieldDescriptorProto.type = Type.TYPE_MESSAGE;
                      } else {
                          fieldDescriptorProto.type = Type.TYPE_ENUM;
                      }
                  } else {
                      fieldDescriptorProto.type = Type.valueOf("TYPE_" + ((DataType.ScalarType) type).name());
                  }
  
                  ret.fields.add(fieldDescriptorProto);
              }
          }
  
          List<TypeElement> nestedElements = typeElement.nestedElements();
          if (nestedElements != null) {
  
              for (TypeElement nestedTypeElement : nestedElements) {
                  if (nestedTypeElement instanceof MessageElement) {
                      ret.nestedTypes.add(getDescritorProtoPOJO(fileDescriptorProto, (MessageElement) nestedTypeElement,
                              messageSet, enumSet));
                  } else if (nestedTypeElement instanceof EnumElement) {
                      ret.enumTypes.add(getDescritorProtoPOJO(fileDescriptorProto, (EnumElement) nestedTypeElement,
                              messageSet, enumSet));
                  }
              }
          }
  
          return ret;
      }