summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2014-01-27 22:47:36 +0300
committerEugene Burmako <xeno.by@gmail.com>2014-02-14 13:24:48 +0100
commitad7983b70a43ba9033a491c00ad22691e7a0a7b4 (patch)
treefded601a5fa3c4d7cea23d742e30e15f1ace7404 /test
parent3293d60531615f4accdee886fba52ddda0929b31 (diff)
downloadscala-ad7983b70a43ba9033a491c00ad22691e7a0a7b4.tar.gz
scala-ad7983b70a43ba9033a491c00ad22691e7a0a7b4.tar.bz2
scala-ad7983b70a43ba9033a491c00ad22691e7a0a7b4.zip
additional class tags for reflection API
Introduces a test that iterates all abstract types in reflection API and makes sure that every one of them has an associated class tag. After being introduced, the test has immediately failed exposing the lack of tags for TreeCopier, Mirror and RuntimeClass, which has been subsequently fixed in this commit.
Diffstat (limited to 'test')
-rw-r--r--test/files/run/reflection-tags.check1
-rw-r--r--test/files/run/reflection-tags.scala17
-rw-r--r--test/junit/scala/tools/nsc/symtab/SymbolTableForUnitTesting.scala6
3 files changed, 24 insertions, 0 deletions
diff --git a/test/files/run/reflection-tags.check b/test/files/run/reflection-tags.check
new file mode 100644
index 0000000000..375518e921
--- /dev/null
+++ b/test/files/run/reflection-tags.check
@@ -0,0 +1 @@
+List()
diff --git a/test/files/run/reflection-tags.scala b/test/files/run/reflection-tags.scala
new file mode 100644
index 0000000000..fba90f61e9
--- /dev/null
+++ b/test/files/run/reflection-tags.scala
@@ -0,0 +1,17 @@
+import scala.reflect.runtime.universe._
+import scala.reflect.ClassTag
+
+object Test extends App {
+ var typeMembers = typeOf[scala.reflect.api.Universe].members.filter(sym => sym.isType && !sym.isClass).toList
+ typeMembers = typeMembers.filter(_.name != TypeName("ModifiersCreator")) // type ModifiersCreator = ModifiersExtractor
+ val tags = typeOf[scala.reflect.api.Universe].members.filter(sym => sym.isImplicit).toList
+
+ typeMembers.foreach(_.typeSignature)
+ tags.foreach(_.typeSignature)
+
+ val outliers = typeMembers.filter(tm => !tags.exists(tag => tag.typeSignature match {
+ case NullaryMethodType(TypeRef(_, sym, targ :: Nil)) => sym == typeOf[ClassTag[_]].typeSymbol && targ.typeSymbol == tm
+ case _ => false
+ }))
+ println(outliers)
+} \ No newline at end of file
diff --git a/test/junit/scala/tools/nsc/symtab/SymbolTableForUnitTesting.scala b/test/junit/scala/tools/nsc/symtab/SymbolTableForUnitTesting.scala
index b42e9a07cb..25d8c4667f 100644
--- a/test/junit/scala/tools/nsc/symtab/SymbolTableForUnitTesting.scala
+++ b/test/junit/scala/tools/nsc/symtab/SymbolTableForUnitTesting.scala
@@ -1,6 +1,7 @@
package scala.tools.nsc
package symtab
+import scala.reflect.ClassTag
import scala.reflect.internal.{Phase, NoPhase, SomePhase}
import scala.tools.util.PathResolver
import util.ClassPath
@@ -89,4 +90,9 @@ class SymbolTableForUnitTesting extends SymbolTable {
val currentFreshNameCreator = new reflect.internal.util.FreshNameCreator
phase = SomePhase
+
+ type RuntimeClass = java.lang.Class[_]
+ implicit val RuntimeClassTag: ClassTag[RuntimeClass] = ClassTag[RuntimeClass](classOf[RuntimeClass])
+ implicit val MirrorTag: ClassTag[Mirror] = ClassTag[Mirror](classOf[GlobalMirror])
+ implicit val TreeCopierTag: ClassTag[TreeCopier] = ClassTag[TreeCopier](classOf[TreeCopier])
}