diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala index c1981f6c6edd..e63bc4c2754f 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala @@ -940,6 +940,13 @@ object TastyImpl extends scala.tasty.Tasty { } } + object ClassTag extends ClassTagExtractor { + def unapply(x: Constant): Option[Type] = x match { + case x: Constants.Constant if x.tag == Constants.ClazzTag => Some(x.typeValue) + case _ => None + } + } + } // ===== Signature ================================================ diff --git a/library/src/scala/tasty/Tasty.scala b/library/src/scala/tasty/Tasty.scala index 4c6f11350f8e..78067edf68fa 100644 --- a/library/src/scala/tasty/Tasty.scala +++ b/library/src/scala/tasty/Tasty.scala @@ -731,6 +731,10 @@ abstract class Tasty { tasty => def unapply(x: Constant): Option[String] } + val ClassTag: ClassTagExtractor + abstract class ClassTagExtractor { + def unapply(x: Constant): Option[Type] + } } // ===== Signature ================================================ diff --git a/library/src/scala/tasty/util/ShowExtractors.scala b/library/src/scala/tasty/util/ShowExtractors.scala index 72c143c41db6..a75791d8944d 100644 --- a/library/src/scala/tasty/util/ShowExtractors.scala +++ b/library/src/scala/tasty/util/ShowExtractors.scala @@ -150,6 +150,7 @@ class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Constant.Float(value) => this += "Constant.Float(" += value += ")" case Constant.Double(value) => this += "Constant.Double(" += value += ")" case Constant.String(value) => this += "Constant.String(\"" += value += "\")" + case Constant.ClassTag(value) => this += "Constant.ClassTag(" += value += ")" } def visitType(x: TypeOrBounds): Buffer = x match { diff --git a/library/src/scala/tasty/util/ShowSourceCode.scala b/library/src/scala/tasty/util/ShowSourceCode.scala index b128ebe8d4ec..715f1a32d7e7 100644 --- a/library/src/scala/tasty/util/ShowSourceCode.scala +++ b/library/src/scala/tasty/util/ShowSourceCode.scala @@ -237,7 +237,7 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Term.Select(qual, name, sig) => printTree(qual) - if (name != "") + if (name != "" && name != "package") this += "." += name this @@ -664,6 +664,10 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Constant.Double(v) => this += v case Constant.Char(v) => this += '\'' += escapedChar(v) += '\'' case Constant.String(v) => this += '"' += escapedString(v) += '"' + case Constant.ClassTag(v) => + this += "classOf[" + printType(v) + this += "]" } def printTypeOrBoundsTree(tpt: TypeOrBoundsTree): Buffer = tpt match { diff --git a/tests/pos/i566.decompiled b/tests/pos/i566.decompiled new file mode 100644 index 000000000000..60c719c5d4d7 --- /dev/null +++ b/tests/pos/i566.decompiled @@ -0,0 +1,6 @@ +/** Decompiled from out/posTestFromTasty/pos/i566/Test.class */ +class Test() { + type T = scala.Predef.String + type U + scala.reflect.classTag[Test.this.T](scala.reflect.ClassTag.apply[Test.this.T](classOf[java.lang.String])) +}