summaryrefslogblamecommitdiff
path: root/test/files/run/macro-reify-type/Macros_1.scala
blob: 06de05735dbf731b3996b4dfe82feb49430bb6cb (plain) (tree)


















                                                                                                                                 
                                                                                                                                        






                                                    
import scala.reflect.macros.Context
import scala.reflect.runtime.{universe => ru}

object StaticReflect {
  def method[A](name: String): ru.Type = macro methodImpl[A]

  def methodImpl[A: c.WeakTypeTag](c: Context)(name: c.Expr[String]): c.Expr[ru.Type] = {
    import c.universe._

    val nameName: TermName = name.tree match {
      case Literal(Constant(str: String)) => newTermName(str)
      case _                              => c.error(c.enclosingPosition, s"Method name not constant.") ; return reify(ru.NoType)
    }
    val clazz  = weakTypeOf[A]

    clazz member nameName match {
      case NoSymbol => c.error(c.enclosingPosition, s"No member called $nameName in $clazz.") ; reify(ru.NoType)
      case member   =>
        val mtpe  = member typeSignatureIn clazz
        val mtag  = c.reifyType(treeBuild.mkRuntimeUniverseRef, Select(treeBuild.mkRuntimeUniverseRef, newTermName("rootMirror")), mtpe)
        val mtree = Select(mtag, newTermName("tpe"))

        c.Expr[ru.Type](mtree)
    }
  }

}