Annotations are applied to definitions, declarations, types, or expressions.
Annotations are applied to declarations using withAnnots(annot, ...)
. This takes vararg of AnnotationInfo
, which is created using ANNOT(typ|"C", arg, ...)
.
CLASSDEF("C")
withAnnots(ANNOT(SerializableAttr)) := BLOCK(
DEF("get", IntClass) := LIT(0)
)
This prints as:
@serializable class C {
def get: Int = 0
}
Type annotations are written by calling withAnnots(annot, ...)
on TYPEVAR(...)
.
val annot = ANNOT(SpecializedClass, REF(IntClass))
TRAITDEF("Function0")
withTypeParams(TYPEVAR("T") withAnnots(annot)) := BLOCK(
DEF("apply", "T")
)
This prints as:
trait Function0[@specialized(Int) T] {
def apply: T
}
Annotated expressions are written as tree withAnnots(annot, ...)
:
REF("e") withAnnots(ANNOT(UncheckedClass))
This prints as:
(e: @unchecked)