All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertx.lang.jphp.generator.PhpClassGenerator Maven / Gradle / Ivy

package io.vertx.lang.jphp.generator;

import io.vertx.codegen.ClassModel;
import io.vertx.codegen.ConstantInfo;
import io.vertx.codegen.MethodInfo;
import io.vertx.codegen.ParamInfo;
import io.vertx.codegen.doc.Tag;
import io.vertx.codegen.doc.Text;
import io.vertx.codegen.doc.Token;
import io.vertx.codegen.type.TypeInfo;
import io.vertx.codegen.writer.CodeWriter;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static java.lang.String.join;

public class PhpClassGenerator extends AbstractPhpClassGenerator {
  @Override
  public String filename(ClassModel model) {
    return phpFileName(model);
  }

  @Override
  void genPackageOrNamespace(CodeWriter writer, String packageOrNamespace) {
    genPhpNamespace(writer, packageOrNamespace);
  }

  @Override
  void genImportsOrUses(ClassModel model, CodeWriter writer) {
    Set importClassSet = new TreeSet<>();
    for (MethodInfo method : model.getMethods()) {
      addImport(model, importClassSet, method.getReturnType());
      for (ParamInfo param : method.getParams()) {
        addImport(model, importClassSet, param.getType());
      }
    }
    TypeInfo concreateSuper = getSuper(model);
    if (concreateSuper != null) {
      addImport(model, importClassSet, concreateSuper);
    }
    for (String importClass : importClassSet) {
      writer.format("use %s;", importClass.replace(".", "\\")).println();
    }
  }
  private TypeInfo getSuper(ClassModel model){
    TypeInfo concreateSuper = model.getConcreteSuperType();
    List superTypes = model.getSuperTypes();
    if (concreateSuper == null && superTypes.size() == 1) {
      concreateSuper = superTypes.get(0);
    }
//    return concreateSuper;
    return null;
  }

  @Override
  void genDeprecatedDoc(ClassModel model, CodeWriter writer) {
    writer.println(" * @deprecated");
  }

  @Override
  void genClassStartTemplate(ClassModel model, CodeWriter writer) {
    TypeInfo concreateSuper = getSuper(model);
    writer.format("class %s", model.getIfaceSimpleName());
    if (concreateSuper != null) {
      writer.print(" extends " + concreateSuper.getRaw().getSimpleName());
    }
    writer.println();
    writer.println("{");
  }

  @Override
  void genConstant(ClassModel model, ConstantInfo constant, CodeWriter writer) {
    writer.println("/**");
    if (constant.getDoc() != null) {
      Token.toHtml(constant.getDoc().getTokens(), " *", this::renderLinkToHtml, "\n", writer);
    }
    writer.format(" * @var %s", join("|", getPHPDocType(constant.getType(), false))).println();
    writer.println(" * php文件只是为了写代码方便,常量的实际值请参考原java文件");
    writer.println(" */");
    writer.format("const %s = %s;", constant.getName(), getReturnInfo(constant.getType())).println();
  }

  @Override
  void genConstructor(ClassModel model, CodeWriter writer) {
    writer.println("private function __construct()");
    writer.println("{");
    writer.indent().println();
    writer.unindent().println("}");
  }

  @Override
  void genMethod(ClassModel model, String methodName, CodeWriter writer) {
    List methods = model.getMethodMap().get(methodName);
    TypeInfo returnType = null;
    String returnDescription = "";
    int minParamSize = Integer.MAX_VALUE;
    int maxParamSize = 0;
    boolean isStatic = false;
    boolean isFluent = false;
    for (MethodInfo method : methods) {
      if (returnType == null) {
        if (method.isFluent()) {
          returnType = model.getType();
        } else {
          returnType = method.getReturnType();
        }
        if (method.getReturnDescription() != null) {
          returnDescription = method.getReturnDescription().getValue();
        }
      }
      int methodParamSize = method.getParams().size();
      if (methodParamSize > maxParamSize) {
        maxParamSize = methodParamSize;
      }
      if (methodParamSize < minParamSize) {
        minParamSize = methodParamSize;
      }
      isStatic = method.isStaticMethod();
      isFluent = method.isFluent();
    }
    writer.println("/**");
    List> paramTypes = new ArrayList<>();
    boolean allDeprecated = true;
    for (MethodInfo method : methods) {
      if (method.getDoc() != null) {
        Token.toHtml(method.getDoc().getTokens(), " *", this::renderLinkToHtml, "\n", writer);
        writer.println(" *");
      }
      allDeprecated = allDeprecated && method.isDeprecated();
      if (methods.size() > 1) {
        for (ParamInfo param : method.getParams()) {
          Text t = param.getDescription();
          writer.format(" * param $%s %s %s", param.getName(), getPHPDocType(param.getType(), true).stream().collect(Collectors.joining(" | ", "[", "]")), t == null ? "" : t.getValue()).println();
        }
        writer.println(" * ");
        if (method.isDeprecated()) {
          writer.println(" * this method is deprecated");
          writer.println(" * ");
        }
        writer.format(" * %s(", methodName);
        for (int index = 0; index < method.getParams().size(); index++) {
          ParamInfo param = method.getParam(index);
//          Set params = index < paramTypes.size() ? paramTypes.get(index) : null;
//          if (params == null) {
//            params = new HashSet<>();
//            paramTypes.add(params);
//          }
//          List paramTypeList = getPHPDocType(param.getType());
//          params.addAll(paramTypeList);
          if (index > 0) {
            writer.print(", ");
          }
          writer.print("$" + param.getName());
        }
        writer.println(")");
        if (method.isDeprecated()) {
          writer.println(" * ");
        }
        writer.println(" * ");
        writer.println(" *");
      }
      for (int index = 0; index < method.getParams().size(); index++) {
        ParamInfo param = method.getParam(index);
        Set params = index < paramTypes.size() ? paramTypes.get(index) : null;
        if (params == null) {
          params = new HashSet<>();
          paramTypes.add(params);
        }
        List paramTypeList = getPHPDocType(param.getType(), true);
        params.addAll(paramTypeList);
//        if (index > 0) {
//          writer.print(", ");
//        }
//        writer.print("$" + param.getName());
      }
    }

    for (int index = 0; index < paramTypes.size(); index++) {
      writer.format(" * @param $arg%d %s", index, join(" | ", paramTypes.get(index))).println();
    }
    String returnTypeInfo = isFluent ? "$this" : (returnType == null ? "" : join(" | ", getPHPDocType(returnType, false)));
    writer.format(" * @return %s %s", returnTypeInfo, returnDescription).println();
    if (allDeprecated) {
      writer.println(" * @deprecated");
    }
    writer.println(" */");
    writer.print("public");
    if (isStatic) {
      writer.print(" static");
    }
    writer.format(" function %s(%s)", methodName, getParamName(minParamSize, maxParamSize)).println();
    writer.println("{");
    writer.indent();
    if (returnType != null && returnType.getName().equals("void")) {
      writer.println();
    } else {
      writer.format("return %s;", isFluent ? "$this" : getReturnInfo(returnType)).println();
    }
    writer.unindent().println("}");
  }

  private String getParamName(int min, int max) {
    return IntStream.range(0, max).mapToObj(i -> "$arg" + i + (i >= min ? " = null" : "")).collect(Collectors.joining(", "));
  }

  @Override
  String renderLinkToHtml(Tag.Link link) {
    return renderPhpLinkToHtml(link);
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy