001package io.avaje.http.generator.core;
002
003import io.avaje.http.generator.core.openapi.DocContext;
004
005import javax.annotation.processing.Filer;
006import javax.annotation.processing.Messager;
007import javax.annotation.processing.ProcessingEnvironment;
008import javax.lang.model.SourceVersion;
009import javax.lang.model.element.Element;
010import javax.lang.model.element.TypeElement;
011import javax.lang.model.type.DeclaredType;
012import javax.lang.model.type.TypeMirror;
013import javax.lang.model.util.Elements;
014import javax.lang.model.util.Types;
015import javax.tools.Diagnostic;
016import javax.tools.JavaFileObject;
017import java.io.IOException;
018
019public class ProcessingContext {
020
021  private final PlatformAdapter readAdapter;
022  private final Messager messager;
023  private final Filer filer;
024  private final Elements elements;
025  private final Types types;
026  private final boolean openApiAvailable;
027  private final DocContext docContext;
028
029  ProcessingContext(ProcessingEnvironment env, PlatformAdapter readAdapter) {
030    this.readAdapter = readAdapter;
031    this.messager = env.getMessager();
032    this.filer = env.getFiler();
033    this.elements = env.getElementUtils();
034    this.types = env.getTypeUtils();
035    this.openApiAvailable = isTypeAvailable(Constants.OPENAPIDEFINITION);
036    this.docContext = new DocContext(env, openApiAvailable);
037  }
038
039  private boolean isTypeAvailable(String canonicalName) {
040    return null != getTypeElement(canonicalName);
041  }
042
043  public TypeElement getTypeElement(String canonicalName) {
044    return elements.getTypeElement(canonicalName);
045  }
046
047  public boolean isOpenApiAvailable() {
048    return openApiAvailable;
049  }
050
051  public void logError(Element e, String msg, Object... args) {
052    messager.printMessage(Diagnostic.Kind.ERROR, String.format(msg, args), e);
053  }
054
055  /**
056   * Create a file writer for the given class name.
057   */
058  public JavaFileObject createWriter(String cls, Element origin) throws IOException {
059    return filer.createSourceFile(cls, origin);
060  }
061
062  public String getDocComment(Element param) {
063    return elements.getDocComment(param);
064  }
065
066  public DocContext doc() {
067    return docContext;
068  }
069
070  public Element asElement(TypeMirror typeMirror) {
071    return types.asElement(typeMirror);
072  }
073
074  public TypeMirror asMemberOf(DeclaredType declaredType, Element element) {
075    return types.asMemberOf(declaredType, element);
076  }
077
078  public PlatformAdapter platform() {
079    return readAdapter;
080  }
081}