summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/reflect/scala/reflect/api/TypeTags.scala6
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala2
-rw-r--r--src/reflect/scala/reflect/macros/Aliases.scala5
-rw-r--r--test/files/run/typetags_symbolof_x.check6
-rw-r--r--test/files/run/typetags_symbolof_x.scala15
5 files changed, 34 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/api/TypeTags.scala b/src/reflect/scala/reflect/api/TypeTags.scala
index d6af68f923..1d5bf5d28b 100644
--- a/src/reflect/scala/reflect/api/TypeTags.scala
+++ b/src/reflect/scala/reflect/api/TypeTags.scala
@@ -345,6 +345,12 @@ trait TypeTags { self: Universe =>
* @group TypeTags
*/
def typeOf[T: TypeTag](x: => T): Type = typeOf[T]
+
+ /**
+ * Type symbol of `x` as derived from a type tag.
+ * @group TypeTags
+ */
+ def symbolOf[T: WeakTypeTag]: TypeSymbol
}
private[scala] class SerializedTypeTag(var tpec: TypeCreator, var concrete: Boolean) extends Serializable {
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 94b60bafae..31fb7d2a6e 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -77,6 +77,8 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
}
}
+ def symbolOf[T: WeakTypeTag]: TypeSymbol = weakTypeOf[T].typeSymbolDirect.asType
+
abstract class SymbolContextApiImpl extends SymbolContextApi {
this: Symbol =>
diff --git a/src/reflect/scala/reflect/macros/Aliases.scala b/src/reflect/scala/reflect/macros/Aliases.scala
index 8651661c63..bd918bbe56 100644
--- a/src/reflect/scala/reflect/macros/Aliases.scala
+++ b/src/reflect/scala/reflect/macros/Aliases.scala
@@ -126,4 +126,9 @@ trait Aliases {
* Type of `x` as derived from a type tag.
*/
def typeOf[T: TypeTag](x: => T): Type = typeOf[T]
+
+ /**
+ * Type symbol of `x` as derived from a type tag.
+ */
+ def symbolOf[T: WeakTypeTag]: universe.TypeSymbol = universe.symbolOf[T]
}
diff --git a/test/files/run/typetags_symbolof_x.check b/test/files/run/typetags_symbolof_x.check
new file mode 100644
index 0000000000..fd0e069bca
--- /dev/null
+++ b/test/files/run/typetags_symbolof_x.check
@@ -0,0 +1,6 @@
+class Int
+object C
+type T
+type Id
+class Nothing
+class Null
diff --git a/test/files/run/typetags_symbolof_x.scala b/test/files/run/typetags_symbolof_x.scala
new file mode 100644
index 0000000000..333c4e7da4
--- /dev/null
+++ b/test/files/run/typetags_symbolof_x.scala
@@ -0,0 +1,15 @@
+import scala.reflect.runtime.universe._
+
+class C
+object C
+
+object Test extends App {
+ type T = Int
+ type Id[X] = X
+ println(symbolOf[Int])
+ println(symbolOf[C.type])
+ println(symbolOf[T])
+ println(symbolOf[Id[_]])
+ println(symbolOf[Nothing])
+ println(symbolOf[Null])
+}