简体   繁体   中英

get annotations from class in scala 3 macros

i am writing a macro to get annotations from a 'Class'

inline def getAnnotations(clazz: Class[?]): Seq[Any] = ${ getAnnotationsImpl('clazz) }
def getAnnotationsImpl(expr: Expr[Class[?]])(using Quotes): Expr[Seq[Any]] =
  import quotes.reflect.*

  val cls = expr.valueOrError // error: value value is not a member of quoted.Expr[Class[?]]
  val tpe = TypeRepr.typeConstructorOf(cls)
  val annotations = tpe.typeSymbol.annotations.map(_.asExpr)
  Expr.ofSeq(annotations)

but i get an error when i get class value from expr parameter

@main def test(): Unit =
  val cls = getCls
  val annotations = getAnnotations(cls)

def getCls: Class[?] = Class.forName("Foo")

is it possible to get annotations of a Class at compile time by this macro?!

By the way, eval for Class[_] doesn't work even in Scala 2 macros: c.eval(c.Expr[Class[_]](clazz)) produces

java.lang.ClassCastException: 
scala.reflect.internal.Types$ClassNoArgsTypeRef cannot be cast to java.lang.Class.

Class[_] is too runtimy thing. How can you extract its value from its tree ( Expr is a wrapper over tree)?

If you already have a Class[?] you should use Java reflection rather than Scala 3 macros (with Tasty reflection).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM