() , implicitly, :
q"""{import ${c.prefix}._; _root_.scala.Predef.implicitly[$T] }
T - Type, .
, , Context.typeCheck silent=true , .
, infer, None, Some.
import scala.reflect.macros.Context
import scala.language.experimental.macros
def inferImplicitInPrefixContext[T:c.WeakTypeTag](c: Context): c.Tree = {
import c.universe._
val T = weakTypeOf[T]
c.typeCheck(
q"""{
import ${c.prefix}._
_root_.scala.Predef.implicitly[$T]
}""",
silent = true
)
}
def infer_impl[T:c.WeakTypeTag](c: Context): c.Expr[Option[T]] = {
import c.universe._
c.Expr[Option[T]](
inferImplicitInPrefixContext[T](c) match {
case EmptyTree => q"_root_.scala.None"
case tree => q"_root_.scala.Some($tree)"
}
)
}
trait InferOp {
def infer[T]: Option[T] = macro infer_impl[T]
}
:
object Foo extends InferOp {
implicit val s = "hello"
}
Foo.infer[String]
Foo.infer[Int]
implicit val lng: Long = 123L
Foo.infer[Long]