import ceylon.language.meta {
    annotations, 
    optionalAnnotation, 
    sequencedAnnotations
}

"""The supertype of all *annotation classes*. 
   
   ### Annotation classes
 
   An *annotation class* must satisfy `Annotation`,
   [[OptionalAnnotation]],  or [[SequencedAnnotation]] and 
   must be annotated `final annotation`. For example:
   
       "An annotation class."
       final annotation class Example(shared String description) 
             satisfies Annotation {}
 
   Annotation classes which satisfy `Annotation` directly 
   may be applied to any program element that supports 
   annotations (see [[Annotated]]). In practice, annotation 
   classes often satisfy [[OptionalAnnotation]] or 
   [[SequencedAnnotation]] in order to prevent annotations 
   being applied to inappropriate program elements.
   
   Each initializer parameter of an annotation class must 
   have one of the following types:
   
   * `Integer`, `Float`, `Character`, or `String`,
   * an enumerated type whose cases are all anonymous 
     classes, such as `Boolean`,
   * a subtype of [[ceylon.language.meta.declaration::Declaration]]
   * an annotation class,
   * `{T*}` or `[T*]` where `T` is a legal annotation 
     parameter type, or
   * any tuple type whose element types are legal annotation 
     parameter types.
   
   An initializer parameter of an annotation class may be 
   variadic or defaulted.
   
   ### Annotation constructors
   
   An *annotation constructor* is simply a top level 
   function, annotated with `annotation` whose return type 
   is an annotation class type. For example:
   
       "An annotation constructor."
       annotation Example example(String description="") 
           => Example(description);
   
   Each parameter of an annotation constructor must have one 
   of the following types:
   
   * `Integer`, `Float`, `Character`, or `String`,
   * an enumerated type whose cases are all anonymous classes, 
     such as `Boolean`,
   * a subtype of [[ceylon.language.meta.declaration::Declaration]],
   * an annotation type,
   * `{T*}` or `[T*]` where `T` is a legal annotation 
     constructor parameter type, or
   * any tuple type whose element types are legal annotation 
     constructor parameter types.
   
   A parameter of an annotation constructor may be variadic 
   or defaulted.
   
   The constructor must simply instantiate and return the 
   annotation class, and there are strict rules about the 
   arguments to the instantiation.
   
   A given annotation class can have multiple annotation 
   constructors."""
see(`interface OptionalAnnotation`,
    `interface SequencedAnnotation`,
    `function annotations`, 
    `function optionalAnnotation`, 
    `function sequencedAnnotations`)
shared interface Annotation 
        of ConstrainedAnnotation<> {}