package annotations;

/*>>>
import org.checkerframework.checker.nullness.qual.*;
*/

import java.util.Map;
import java.util.Set;

import annotations.el.AnnotationDef;

/**
 * A very simple {@link annotations.AnnotationFactory AnnotationFactory} that
 * creates {@link Annotation}s. It is interested in all annotations and
 * determines their definitions automatically from the fields supplied. Use the
 * singleton {@link #saf}.
 */
public final class AnnotationFactory {
    private AnnotationFactory() {
    }

    /**
     * The singleton {@link AnnotationFactory}.
     */
    public static final AnnotationFactory saf = new AnnotationFactory();

    /**
     * Returns an {@link AnnotationBuilder} appropriate for building a
     * {@link Annotation} of the given type name.
     */
    public AnnotationBuilder beginAnnotation(AnnotationDef def) {
        return new AnnotationBuilder(def);
    }

    /**
     * Returns an {@link AnnotationBuilder}.
     * Tries to look up the AnnotationDef in adefs; if not found, inserts in adefs.
     */
    public AnnotationBuilder beginAnnotation(java.lang.annotation.Annotation a, Map<String, AnnotationDef> adefs) {
        AnnotationDef def = AnnotationDef.fromClass(a.getClass(), adefs);
        return new AnnotationBuilder(def);
    }

    /**
     * Returns an {@link AnnotationBuilder} appropriate for building a
     * {@link Annotation} of the given type name.
     */
    public AnnotationBuilder beginAnnotation(String typeName, Set<Annotation> tlAnnotationsHere) {
        assert typeName != null;
        return new AnnotationBuilder(typeName, tlAnnotationsHere);
    }
}