"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>
//of Value
//Note: adding the following constraint would
// make ConstrainedAnnotation a GADT, which
// the language does not currently support
//of OptionalAnnotation<Value,ProgramElement> |
// SequencedAnnotation<Value,ProgramElement>
satisfies Annotation
given Value satisfies Annotation
given ProgramElement satisfies Annotated {
}