summaryrefslogtreecommitdiff
path: root/src/reflect/scala/reflect/internal/AnnotationInfos.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan.moors@typesafe.com>2015-10-01 14:51:48 -0700
committerAdriaan Moors <adriaan.moors@typesafe.com>2015-11-12 13:28:16 -0800
commit57de5b8bd811014b446c7c344aa4504e828888e6 (patch)
tree54fb3d320dae80b851fbfe7f6a8ef881cc1562e0 /src/reflect/scala/reflect/internal/AnnotationInfos.scala
parentc0454b1ea635ca0b6a57805572a6da96c76aff2e (diff)
downloadscala-57de5b8bd811014b446c7c344aa4504e828888e6.tar.gz
scala-57de5b8bd811014b446c7c344aa4504e828888e6.tar.bz2
scala-57de5b8bd811014b446c7c344aa4504e828888e6.zip
Annotation filtering & derivation in one place.
This logic was scattered all over the hierarchy, even though it's only needed in one spot, and is unlikely to evolve.
Diffstat (limited to 'src/reflect/scala/reflect/internal/AnnotationInfos.scala')
-rw-r--r--src/reflect/scala/reflect/internal/AnnotationInfos.scala16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/AnnotationInfos.scala b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
index 207a66e360..c0772c8cc0 100644
--- a/src/reflect/scala/reflect/internal/AnnotationInfos.scala
+++ b/src/reflect/scala/reflect/internal/AnnotationInfos.scala
@@ -169,6 +169,22 @@ trait AnnotationInfos extends api.Annotations { self: SymbolTable =>
def unapply(info: AnnotationInfo): Option[(Type, List[Tree], List[(Name, ClassfileAnnotArg)])] =
Some((info.atp, info.args, info.assocs))
+
+ def mkFilter(category: Symbol, defaultRetention: Boolean)(ann: AnnotationInfo) =
+ (ann.metaAnnotations, ann.defaultTargets) match {
+ case (Nil, Nil) => defaultRetention
+ case (Nil, defaults) => defaults contains category
+ case (metas, _) => metas exists (_ matches category)
+ }
+
+ def mkFilter(categories: List[Symbol], defaultRetention: Boolean)(ann: AnnotationInfo) =
+ (ann.metaAnnotations, ann.defaultTargets) match {
+ case (Nil, Nil) => defaultRetention
+ case (Nil, defaults) => categories exists defaults.contains
+ case (metas, _) =>
+ val metaSyms = metas collect { case ann if !ann.symbol.isInstanceOf[StubSymbol] => ann.symbol }
+ categories exists (category => metaSyms exists (_ isNonBottomSubClass category))
+ }
}
class CompleteAnnotationInfo(