package io.vertx.codegen; import io.vertx.codegen.annotations.ModuleGen; import io.vertx.codegen.type.TypeNameTranslator; import javax.lang.model.element.PackageElement; import javax.lang.model.util.Elements; import java.util.ArrayList; import java.util.List; /** * Describes a module. * * @author <a href="mailto:julien@julienviet.com">Julien Viet</a> */ public class ModuleInfo { private final String packageName; private final String name; private final String groupPackage; public ModuleInfo(String packageName, String name, String groupPackage) { this.packageName = packageName; this.name = name; this.groupPackage = groupPackage; } /** * Resolve a module info for the specified {@code pkgElt} argument, returns null for undertermined. * * @param elementUtils the element utils * @param pkgElt the package element * @return the module info */ public static ModuleInfo resolve(Elements elementUtils, PackageElement pkgElt) { while (pkgElt != null) { ModuleGen annotation = pkgElt.getAnnotation(ModuleGen.class); if (annotation != null) { return new ModuleInfo(pkgElt.getQualifiedName().toString(), annotation.name(), annotation.groupPackage()); } String pkgQN = pkgElt.getQualifiedName().toString(); int pos = pkgQN.lastIndexOf('.'); if (pos == -1) { break; } else { pkgElt = elementUtils.getPackageElement(pkgQN.substring(0, pos)); } } return null; } public String getGroupPackage() { return groupPackage; } /** * @return the module package name, i.e the name of the package annotated with the {@link ModuleGen} annotation */ public String getPackageName() { return packageName; } /** * Translates the module package name for the specified {@code lang} parameter language. * * @param lang the language, for instance {@literal groovy} * @return the translated package name */ public String translatePackageName(String lang) { return translateQualifiedName(packageName, lang); } /** * Translate a given {@code qualified name} based on the module group package name and the specified * {@code lang} parameter. * * @param qualifiedName the qualified name * @param lang the language, for instance {@literal groovy} * @return the translated qualified name */ public String translateQualifiedName(String qualifiedName, String lang) { return TypeNameTranslator.hierarchical(lang).translate(this, qualifiedName); } /** * @return the module name */ public String getName() { return name; } /** * @param _case the formatting case * @return the module name in the specified case */ public String getName(Case _case) { return _case.format(Case.KEBAB.parse(name)); } }