docs: private static List<Class<?>> createMessageClass(ProtoFile protoFile, boolean multi, boolean debug,
              boolean generateSouceOnly, File sourceOutputDir, List<CodeDependent> cds, Set<String> compiledClass,
              Set<String> enumNames, Set<String> packages, Map<String, String> mappedUniName, boolean isUniName) {
  
          List<Type> types = protoFile.getTypes();
          if (types == null || types.isEmpty()) {
              throw new RuntimeException("No message defined in '.proto' IDL");
          }
  
          int count = 0;
          Iterator<Type> iter = types.iterator();
          while (iter.hasNext()) {
              Type next = iter.next();
              if (next instanceof EnumType) {
                  continue;
              }
              count++;
          }
  
          if (!multi && count != 1) {
              throw new RuntimeException("Only one message defined allowed in '.proto' IDL");
          }
  
          List<Class<?>> ret = new ArrayList<Class<?>>(types.size());
  
          List<MessageType> messageTypes = new ArrayList<MessageType>();
          for (Type type : types) {
              Class checkClass = checkClass(protoFile, type, mappedUniName, isUniName);
              if (checkClass != null) {
                  ret.add(checkClass);
                  continue;
              }
  
              CodeDependent cd;
              if (type instanceof MessageType) {
                  messageTypes.add((MessageType) type);
                  continue;
              }
          }
  
          for (MessageType mt : messageTypes) {
              CodeDependent cd;
              cd = createCodeByType(protoFile, (MessageType) mt, enumNames, true, new ArrayList<Type>(), cds, packages,
                      mappedUniName, isUniName);
  
              if (cd.isDepndency()) {
                  cds.add(cd);
              } else {
                  cds.add(0, cd);
              }
          }
          CodeDependent codeDependent;
          // copy cds
          List<CodeDependent> copiedCds = new ArrayList<ProtobufIDLProxy.CodeDependent>(cds);
          while ((codeDependent = hasDependency(copiedCds, compiledClass)) != null) {
              if (debug) {
                  CodePrinter.printCode(codeDependent.code, "generate jprotobuf code");
              }
              if (!generateSouceOnly) {
                  Class<?> newClass = JDKCompilerHelper.getJdkCompiler().compile(codeDependent.getClassName(),
                          codeDependent.code, ProtobufIDLProxy.class.getClassLoader(), null, -1);
                  ret.add(newClass);
              } else {
                  // need to output source code to target path
                  writeSourceCode(codeDependent, sourceOutputDir);
              }
          }
  
          return ret;
      }