| "An annotation constrained to appear only on certain program |
| elements, and only with certain values. |
| |
| This interface should never be satisfied directly by any |
| annotation type. Instead, either [[OptionalAnnotation]] or |
| [[SequencedAnnotation]] should be satisfied by the |
| annotation type. |
| |
| The type parameters encode information about the annotation |
| type and its constraints: |
| |
| - [[Value]] represents the type of the annotation itself, |
| - [[ProgramElement]] represents a constraint on the |
| _reference expression type_ of the annotated program |
| element, for example, |
| [[ceylon.language.meta.declaration::ClassDeclaration]] |
| or [[ceylon.language.meta.declaration::Module]], where |
| [[Annotated]] means there is no constraint, and |
| - [[Type]] is a constraint on the _metamodel type_ of the |
| annotated program element, for example, |
| [[`Function<Float,[Float,Float]>` |
| |ceylon.language.meta.model::Function]], |
| where `Anything` means there is no constraint, and that |
| the program element need not have a metamodel type." |
| see (`interface Annotation`, |
| `interface OptionalAnnotation`, |
| `interface SequencedAnnotation`) |
| shared interface ConstrainedAnnotation<out Value=Annotation, |
| out Values=Anything, in ProgramElement=Nothing, |
| out Type=Anything> |
| |
| |
| |
| |
| |
| |
| satisfies Annotation |
| given Value satisfies Annotation |
| given ProgramElement satisfies Annotated { |
| |
| } |
| |