summaryrefslogtreecommitdiff
path: root/src/library/scala/reflect/base/Annotations.scala
blob: e3453b1cdf23a7a8e4e8d3886108417095961271 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
package scala.reflect
package base

import scala.collection.immutable.ListMap

trait Annotations { self: Universe =>

  type Annotation >: Null <: AnyRef
  implicit val AnnotationTag: ClassTag[Annotation]
  val Annotation: AnnotationExtractor

  abstract class AnnotationExtractor {
    def apply(tpe: Type, scalaArgs: List[Tree], javaArgs: ListMap[Name, JavaArgument]): Annotation
    def unapply(ann: Annotation): Option[(Type, List[Tree], ListMap[Name, JavaArgument])]
  }

  type JavaArgument >: Null <: AnyRef
  implicit val JavaArgumentTag: ClassTag[JavaArgument]

  type LiteralArgument >: Null <: AnyRef with JavaArgument
  implicit val LiteralArgumentTag: ClassTag[LiteralArgument]
  val LiteralArgument: LiteralArgumentExtractor

  abstract class LiteralArgumentExtractor {
    def apply(value: Constant): LiteralArgument
    def unapply(arg: LiteralArgument): Option[Constant]
  }

  type ArrayArgument >: Null <: AnyRef with JavaArgument
  implicit val ArrayArgumentTag: ClassTag[ArrayArgument]
  val ArrayArgument: ArrayArgumentExtractor

  abstract class ArrayArgumentExtractor {
    def apply(args: Array[JavaArgument]): ArrayArgument
    def unapply(arg: ArrayArgument): Option[Array[JavaArgument]]
  }

  type NestedArgument >: Null <: AnyRef with JavaArgument
  implicit val NestedArgumentTag: ClassTag[NestedArgument]
  val NestedArgument: NestedArgumentExtractor

  abstract class NestedArgumentExtractor {
    def apply(annotation: Annotation): NestedArgument
    def unapply(arg: NestedArgument): Option[Annotation]
  }
}