summaryrefslogtreecommitdiff
path: root/test/files/run/t7046-1/Macros_1.scala
diff options
context:
space:
mode:
authorAdriaan Moors <adriaan@lightbend.com>2016-11-30 17:45:59 -0800
committerGitHub <noreply@github.com>2016-11-30 17:45:59 -0800
commitc2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b (patch)
treeb184b8e08dc9077a39b4f48e86e5e4959ffb3c01 /test/files/run/t7046-1/Macros_1.scala
parent038c15e405b9498863a2236707686a7933748c60 (diff)
parentdde13b56f421a6f956abebc58f041acec8744149 (diff)
downloadscala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.tar.gz
scala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.tar.bz2
scala-c2eb299b0e1ed2f321a81d4afbdb36762e2c0e7b.zip
Merge pull request #5284 from milessabin/topic/si-7046
SI-7046 reflection doesn't see all knownDirectSubclasses This appears to do the right thing in the most typical scenarios in which `knownDirectSubclasses` would be used. The missing 5% is that subclasses defined in local scopes might not be seen by `knownDirectSubclasses` (see `Local` and `Riddle` in the test below). In mitigation, though, it is almost certain that a local subclass would represent an error in any scenario where `knownDirectSubclasses` might be used. Errors for such situations are reported by recording (via a symbol attachment) that `knownDirectSubclasses` has been called and reporting an error if any additional children are added subsequently. Despite these limitations and caveats, I believe that this represents a huge improvement over the status quo, and would eliminate 100% of the failures that I've seen in practice with people using shapeless for type class derivation.
Diffstat (limited to 'test/files/run/t7046-1/Macros_1.scala')
-rw-r--r--test/files/run/t7046-1/Macros_1.scala15
1 files changed, 15 insertions, 0 deletions
diff --git a/test/files/run/t7046-1/Macros_1.scala b/test/files/run/t7046-1/Macros_1.scala
new file mode 100644
index 0000000000..2a5bf82f62
--- /dev/null
+++ b/test/files/run/t7046-1/Macros_1.scala
@@ -0,0 +1,15 @@
+import scala.language.experimental.macros
+import scala.reflect.macros.blackbox.Context
+
+object Macros {
+ def impl[T](c: Context)(implicit ttag: c.WeakTypeTag[T]): c.Expr[List[String]] = {
+ import c.universe._;
+ val ttpe = ttag.tpe
+ val tsym = ttpe.typeSymbol.asClass
+ val subclasses = tsym.knownDirectSubclasses.toList.map(_.name.toString)
+
+ c.Expr[List[String]](q"$subclasses")
+ }
+
+ def knownDirectSubclasses[T]: List[String] = macro impl[T]
+}