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

io.vertx.codegen.EnumModel Maven / Gradle / Ivy

There is a newer version: 3.6.3
Show newest version
package io.vertx.codegen;

import io.vertx.codegen.doc.Doc;
import io.vertx.codegen.type.EnumTypeInfo;
import io.vertx.codegen.type.TypeMirrorFactory;

import javax.annotation.processing.Messager;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.util.Elements;
import javax.lang.model.util.Types;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * A processed enum.
 *
 * @author Julien Viet
 */
public class EnumModel implements Model  {

  private final Doc.Factory docFactory;
  protected final Elements elementUtils;
  protected final Types typeUtils;
  protected final TypeElement modelElt;
  protected EnumTypeInfo type;
  private Doc doc;
  private List values;
  private boolean processed;

  public EnumModel(Messager messager, Elements elementUtils, Types typeUtils, TypeElement modelElt) {
    this.docFactory = new Doc.Factory(messager, elementUtils, typeUtils, new TypeMirrorFactory(elementUtils, typeUtils), modelElt);
    this.typeUtils = typeUtils;
    this.elementUtils = elementUtils;
    this.modelElt = modelElt;
  }

  boolean process() {
    if (!processed) {
      if (modelElt.getKind() != ElementKind.ENUM) {
        throw new GenException(modelElt, "@VertxGen can only be used with interfaces or enums" + modelElt.asType().toString());
      }
      doc = docFactory.createDoc(modelElt);
      type = (EnumTypeInfo) new TypeMirrorFactory(elementUtils, typeUtils).create(modelElt.asType());
      Helper.checkUnderModule(this, "@VertxGen");
      values = elementUtils.
          getAllMembers(modelElt).
          stream().
          filter(elt -> elt.getKind() == ElementKind.ENUM_CONSTANT).
          flatMap(Helper.cast(VariableElement.class)).
          map(elt -> new EnumValueInfo(elt.getSimpleName().toString(), docFactory.createDoc(elt))).
          collect(Collectors.toList());
      if (values.isEmpty()) {
        throw new GenException(modelElt, "No empty enums");
      }
      processed = true;
      return true;
    } else {
      return false;
    }
  }

  /**
   * @return the type of this enum model
   */
  public EnumTypeInfo getType() {
    return type;
  }

  /**
   * @return the possible enum values
   */
  public List getValues() {
    return values;
  }

  /**
   * @return the enum doc
   */
  public Doc getDoc() {
    return doc;
  }

  @Override
  public String getKind() {
    return "enum";
  }

  @Override
  public Element getElement() {
    return modelElt;
  }

  @Override
  public String getFqn() {
    return modelElt.getQualifiedName().toString();
  }

  @Override
  public Map getVars() {
    Map vars = new HashMap<>();
    vars.put("type", getType());
    vars.put("doc", doc);
    vars.put("helper", new Helper());
    vars.put("values", values);
    return vars;
  }

  @Override
  public ModuleInfo getModule() {
    return type.getModule();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy