Skip to content

Instantly share code, notes, and snippets.

@nightscape
Created December 30, 2016 02:10
Show Gist options
  • Save nightscape/cfedaa92071420dacb0420a186d5dbdd to your computer and use it in GitHub Desktop.
Save nightscape/cfedaa92071420dacb0420a186d5dbdd to your computer and use it in GitHub Desktop.
Scala meta macro with annotation and arguments
[error] java.lang.IllegalArgumentException: wrong number of arguments
[error] @unapply[BlockStmt](Array("getStmts", "getComment", "getOrphanComments")) object BlockStmtCompanion
[error] ^
[error] one error found
@unapply[BlockStmt](Array("getStmts", "getComment", "getOrphanComments")) object BlockStmtCompanion
import scala.annotation.StaticAnnotation
import scala.meta._
class unapply[T](readerMethods: Array[String]) extends scala.annotation.StaticAnnotation {
inline def apply(defn: Any): Any = meta {
val q"new $_(Array(..${readerMethods: Seq[Term.Arg]}))" = this
val unapplyBody = readerMethods.toVector.map(m => Term.Name(m.toString.replaceAll(""""""", ""))).map(a ⇒ q"obj.$a()")
val unapply = q"def unapply(obj: T) = Option((..$unapplyBody))"
val q"object $name {}" = defn
q"""
object $name {
$unapply
}"""
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment