Skip to content

Instantly share code, notes, and snippets.

@alexarchambault
Last active February 15, 2016 13:20
Show Gist options
  • Save alexarchambault/daff0a6c4b45af575085 to your computer and use it in GitHub Desktop.
Save alexarchambault/daff0a6c4b45af575085 to your computer and use it in GitHub Desktop.
scalaVersion := "2.11.5"
libraryDependencies ++= Seq(
"org.scala-lang" % "scala-reflect" % scalaVersion.value
)
import scala.language.experimental.macros
import scala.reflect.macros.whitebox
import scala.annotation.meta.getter
object FirstAnnotation {
def applyImpl[T: c.WeakTypeTag, Ann: c.WeakTypeTag](c: whitebox.Context): c.Tree = {
import c.universe._
val tpe = weakTypeOf[T]
val annTpe = weakTypeOf[Ann]
val constructor = tpe.decl(termNames.CONSTRUCTOR).asMethod
val l =
constructor.paramLists.flatten.flatMap { sym =>
tpe.member(sym.name).annotations.filter(_.tree.tpe =:= annTpe).map(_.tree)
}
l match {
case h :: _ =>
h
case Nil =>
c.abort(c.enclosingPosition, s"No $annTpe annotation found")
}
}
def apply[T, Ann]: Ann = macro applyImpl[T, Ann]
}
@getter case class TestAnnotation(value: String) extends annotation.StaticAnnotation
case class Test(
@TestAnnotation("test") member: String
)
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
// Launch sbt console, and enter the following
FirstAnnotation[Test, TestAnnotation]
@alexarchambault
Copy link
Author

To decode output.xz.base64, do

openssl base64 -d < output.xz.base64 | xz -d | less

Output obtained with echo "FirstAnnotation[Test, TestAnnotation]" | sbt console > output 2>&1 with FirstAnnotation.scala and build.sbt in the current directory.

@kralikba
Copy link

Hi,
Did you find a simple solution to this?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment