-
Notifications
You must be signed in to change notification settings - Fork 0
/
IgnoreLogging.scala
35 lines (34 loc) · 1.32 KB
/
IgnoreLogging.scala
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
import scala.annotation.StaticAnnotation
import scala.meta._
class IgnoreLogging extends StaticAnnotation {
inline def apply(defn: Any): Any = meta {
defn match {
case q"..$mods def $ename[..$tparams](...$paramss): $tpeopt = $expr"
if {
val modsStr = mods.map(_.structure)
modsStr.contains(mod"abstract".structure) && modsStr.contains(mod"override".structure)
} =>
val paramssTerm = paramss.map(_.map(param => Term.Name(param.name.value)))
val tparamsTerm = tparams.map(tparam => Type.Name(tparam.name.value))
if (paramssTerm.nonEmpty && tparamsTerm.nonEmpty) {
q"""..$mods def $ename[..$tparams](...$paramss): $tpeopt =
super.$ename[..$tparamsTerm](...$paramssTerm)
"""
} else if (paramssTerm.nonEmpty && tparamsTerm.isEmpty) {
q"""..$mods def $ename(...$paramss): $tpeopt =
super.$ename(...$paramssTerm)
"""
} else if (paramssTerm.isEmpty && tparamsTerm.nonEmpty) {
q"""..$mods def $ename[..$tparams]: $tpeopt =
super.$ename[..$tparamsTerm]
"""
} else {
q"""..$mods def $ename: $tpeopt =
super.$ename
"""
}
case _ =>
abort("@IgnoreLogging can only be used on override def with super callable.")
}
}
}