package org.checkerframework.javacutil;

import com.sun.source.tree.Tree;
import java.lang.annotation.Annotation;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.Element;
import org.checkerframework.checker.nullness.qual.Nullable;

// This class exists to break a circular dependency between the dataflow framework and
// type-checkers.
/** An implementation of AnnotationProvider returns annotations on Java AST elements. */
public interface AnnotationProvider {

    /**
     * Returns the AnnotationMirror, of the given class or an alias of it, used to annotate the
     * element. Returns null if no annotation equivalent to {@code anno} exists on {@code elt}.
     *
     * @param elt the element
     * @param anno annotation class
     * @return an annotation mirror of class {@code anno} on {@code elt}, or an equivalent one, or
     *     null if none exists on {@code anno}
     */
    @Nullable AnnotationMirror getDeclAnnotation(Element elt, Class<? extends Annotation> anno);

    /**
     * Return the annotation on {@code tree} that is in the hierarchy that contains the qualifier
     * {@code target}. Returns null if none exists.
     *
     * @param tree the tree of which the annotation is returned
     * @param target the class of the annotation
     * @return the annotation on {@code tree} that has the class {@code target}, or null
     */
    @Nullable AnnotationMirror getAnnotationMirror(Tree tree, Class<? extends Annotation> target);
}
