diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2014-03-25 16:01:10 +0100 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2014-03-25 16:01:10 +0100 |
commit | 4e3f290e375e7c99cfbf80be9559212fc158481c (patch) | |
tree | cc622b21e2d32585eaa968bc82c2f7b7e20cc9f7 | |
parent | 49f54abed4f82d9b58f416915edaaea889734344 (diff) | |
parent | f9a5880bf82b71174eb3dbd6b67646bbc27a975a (diff) | |
download | scala-4e3f290e375e7c99cfbf80be9559212fc158481c.tar.gz scala-4e3f290e375e7c99cfbf80be9559212fc158481c.tar.bz2 scala-4e3f290e375e7c99cfbf80be9559212fc158481c.zip |
Merge pull request #3636 from xeno-by/topic/mirror-typeof
introduces Mirror.typeOf
-rw-r--r-- | bincompat-backward.whitelist.conf | 12 | ||||
-rw-r--r-- | bincompat-forward.whitelist.conf | 14 | ||||
-rw-r--r-- | src/reflect/scala/reflect/api/Mirror.scala | 18 | ||||
-rw-r--r-- | src/reflect/scala/reflect/internal/Mirrors.scala | 2 | ||||
-rw-r--r-- | test/files/run/mirror_symbolof_x.check | 13 | ||||
-rw-r--r-- | test/files/run/mirror_symbolof_x.scala | 43 |
6 files changed, 101 insertions, 1 deletions
diff --git a/bincompat-backward.whitelist.conf b/bincompat-backward.whitelist.conf index f9760b5c3f..b799b17c21 100644 --- a/bincompat-backward.whitelist.conf +++ b/bincompat-backward.whitelist.conf @@ -132,6 +132,18 @@ filter { { matchName="scala.reflect.api.Internals#ReificationSupportApi.SyntacticPartialFunction" problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.symbolOf" + problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.typeOf" + problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.weakTypeOf" + problemName=MissingMethodProblem } ] } diff --git a/bincompat-forward.whitelist.conf b/bincompat-forward.whitelist.conf index b84417e04a..58bf98a173 100644 --- a/bincompat-forward.whitelist.conf +++ b/bincompat-forward.whitelist.conf @@ -111,7 +111,7 @@ filter { matchName="scala.reflect.api.StandardLiftables#StandardLiftableInstances.liftTree" problemName=MissingMethodProblem }, - // see SI-8331 + // see SI-8331 { matchName="scala.reflect.api.Internals#ReificationSupportApi.SyntacticSelectType" problemName=MissingMethodProblem @@ -152,6 +152,18 @@ filter { { matchName="scala.collection.Iterator#ConcatIterator.this" problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.symbolOf" + problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.typeOf" + problemName=MissingMethodProblem + }, + { + matchName="scala.reflect.api.Mirror.weakTypeOf" + problemName=MissingMethodProblem } ] } diff --git a/src/reflect/scala/reflect/api/Mirror.scala b/src/reflect/scala/reflect/api/Mirror.scala index da3afd89ff..318fdb369a 100644 --- a/src/reflect/scala/reflect/api/Mirror.scala +++ b/src/reflect/scala/reflect/api/Mirror.scala @@ -118,4 +118,22 @@ abstract class Mirror[U <: Universe with Singleton] { * @group Mirror */ def staticPackage(fullName: String): U#ModuleSymbol + + /** + * Shortcut for `implicitly[WeakTypeTag[T]].tpe` + * @group TypeTags + */ + def weakTypeOf[T: universe.WeakTypeTag]: U#Type = universe.weakTypeTag[T].in(this).tpe + + /** + * Shortcut for `implicitly[TypeTag[T]].tpe` + * @group TypeTags + */ + def typeOf[T: universe.TypeTag]: U#Type = universe.typeTag[T].in(this).tpe + + /** + * Type symbol of `x` as derived from a type tag. + * @group TypeTags + */ + def symbolOf[T: universe.WeakTypeTag]: U#TypeSymbol } diff --git a/src/reflect/scala/reflect/internal/Mirrors.scala b/src/reflect/scala/reflect/internal/Mirrors.scala index 7065a8cd6d..4a35e024de 100644 --- a/src/reflect/scala/reflect/internal/Mirrors.scala +++ b/src/reflect/scala/reflect/internal/Mirrors.scala @@ -30,6 +30,8 @@ trait Mirrors extends api.Mirrors { val EmptyPackageClass: ClassSymbol val EmptyPackage: ModuleSymbol + def symbolOf[T: universe.WeakTypeTag]: universe.TypeSymbol = universe.weakTypeTag[T].in(this).tpe.typeSymbolDirect.asType + def findMemberFromRoot(fullName: Name): Symbol = { val segs = nme.segments(fullName.toString, fullName.isTermName) if (segs.isEmpty) NoSymbol diff --git a/test/files/run/mirror_symbolof_x.check b/test/files/run/mirror_symbolof_x.check new file mode 100644 index 0000000000..cc9cad7a13 --- /dev/null +++ b/test/files/run/mirror_symbolof_x.check @@ -0,0 +1,13 @@ +class Int +object C +type T +type Id +class Nothing +class Null +class Int +object C +type T +type Id +class Nothing +class Null +exception: class C not found. diff --git a/test/files/run/mirror_symbolof_x.scala b/test/files/run/mirror_symbolof_x.scala new file mode 100644 index 0000000000..8fec301f56 --- /dev/null +++ b/test/files/run/mirror_symbolof_x.scala @@ -0,0 +1,43 @@ +import scala.reflect.runtime.universe._ +import scala.reflect.runtime.{universe => ru} +import scala.reflect.runtime.{currentMirror => cm} +import scala.reflect.api.Mirror + +class C +object C + +object Test extends App { + object test1 { + val m = cm + type T = Int + type Id[X] = X + println(m.symbolOf[Int]: ru.TypeSymbol) + println(m.symbolOf[C.type]: ru.TypeSymbol) + println(m.symbolOf[T]: ru.TypeSymbol) + println(m.symbolOf[Id[_]]: ru.TypeSymbol) + println(m.symbolOf[Nothing]: ru.TypeSymbol) + println(m.symbolOf[Null]: ru.TypeSymbol) + } + + object test2 { + val m: Mirror[ru.type] = cm + type T = Int + type Id[X] = X + println(m.symbolOf[Int]: ru.TypeSymbol) + println(m.symbolOf[C.type]: ru.TypeSymbol) + println(m.symbolOf[T]: ru.TypeSymbol) + println(m.symbolOf[Id[_]]: ru.TypeSymbol) + println(m.symbolOf[Nothing]: ru.TypeSymbol) + println(m.symbolOf[Null]: ru.TypeSymbol) + } + + object test3 { + val m = ru.runtimeMirror(classOf[Int].getClass.getClassLoader) + try println(m.symbolOf[C]) + catch { case ex: ScalaReflectionException => println(s"exception: ${ex.getMessage}") } + } + + test1 + test2 + test3 +} |