From 9232ae1e38d57212a93719fc3f84ee57ea57b6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=BF=97=E8=B1=AA?= Date: Fri, 28 Apr 2017 22:30:15 +0800 Subject: [PATCH] #9 Add `Caller` --- .../main/scala/sourcecode/SourceContext.scala | 10 ++++++++++ .../src/test/scala/sourcecode/CallerTest.scala | 16 ++++++++++++++++ .../shared/src/test/scala/sourcecode/Tests.scala | 1 + 3 files changed, 27 insertions(+) create mode 100644 sourcecode/shared/src/test/scala/sourcecode/CallerTest.scala diff --git a/sourcecode/shared/src/main/scala/sourcecode/SourceContext.scala b/sourcecode/shared/src/main/scala/sourcecode/SourceContext.scala index 66d67f7..e716a6b 100644 --- a/sourcecode/shared/src/main/scala/sourcecode/SourceContext.scala +++ b/sourcecode/shared/src/main/scala/sourcecode/SourceContext.scala @@ -1,6 +1,7 @@ package sourcecode import language.experimental.macros +import scala.reflect.macros.whitebox object Util{ @@ -105,6 +106,15 @@ object Pkg extends SourceCompanion[String, Pkg](new Pkg(_)){ def impl(c: Compat.Context): c.Expr[Pkg] = Impls.enclosing[Pkg](c)(_.isPackage) } +case class Caller[A](value: A) +object Caller { + implicit def generate: Caller[_] = macro impl + def impl(c: whitebox.Context): c.Tree = { + import c.universe._ + q"new _root_.sourcecode.Caller(this)" + } +} + case class Text[T](value: T, source: String) object Text{ implicit def generate[T](v: T): Text[T] = macro Impls.text[T] diff --git a/sourcecode/shared/src/test/scala/sourcecode/CallerTest.scala b/sourcecode/shared/src/test/scala/sourcecode/CallerTest.scala new file mode 100644 index 0000000..b7bb8e6 --- /dev/null +++ b/sourcecode/shared/src/test/scala/sourcecode/CallerTest.scala @@ -0,0 +1,16 @@ +package sourcecode + +/** + * @author 张志豪 (izhangzhihao) <izhangzhihao@hotmail.com> + */ +object CallerTest { + def run(): Unit = { + assert(Foo.call == CallerTest.getClass.getName) + } +} + +object Foo { + def call(implicit caller: Caller[_]): String = { + caller.value.getClass.getName + } +} \ No newline at end of file diff --git a/sourcecode/shared/src/test/scala/sourcecode/Tests.scala b/sourcecode/shared/src/test/scala/sourcecode/Tests.scala index 4bfd38b..d6f14ac 100644 --- a/sourcecode/shared/src/test/scala/sourcecode/Tests.scala +++ b/sourcecode/shared/src/test/scala/sourcecode/Tests.scala @@ -21,6 +21,7 @@ object Tests{ ManualImplicit() TextTests() ArgsTests() + CallerTest.run() println("================LogExample================") logExample()