diff --git a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala index ff9e8ca1d556..27e1e849b9d4 100644 --- a/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala +++ b/compiler/src/dotty/tools/dotc/tastyreflect/TastyImpl.scala @@ -1072,6 +1072,12 @@ class TastyImpl(val rootContext: Contexts.Context) extends scala.tasty.Tasty { s } } + object Symbol extends SymbolExtractor { + def unapply(x: Constant): Option[scala.Symbol] = x match { + case x: Constants.Constant if x.tag == Constants.ScalaSymbolTag => Some(x.scalaSymbolValue) + case _ => None + } + } } // ===== Signature ================================================ diff --git a/compiler/test/dotc/pos-decompilation.blacklist b/compiler/test/dotc/pos-decompilation.blacklist index 097f55b6717b..b626d249ddf0 100644 --- a/compiler/test/dotc/pos-decompilation.blacklist +++ b/compiler/test/dotc/pos-decompilation.blacklist @@ -1,10 +1,3 @@ -# Constant(Symbol) -desugar.scala -sip23-symbols.scala -t389.scala -t4812.scala -t4579.scala - # assertion failed: asTerm called on not-a-Term val cls.scala escapes2.scala diff --git a/compiler/test/dotc/run-decompilation.blacklist b/compiler/test/dotc/run-decompilation.blacklist index d530d08146cf..4983c825c3dd 100644 --- a/compiler/test/dotc/run-decompilation.blacklist +++ b/compiler/test/dotc/run-decompilation.blacklist @@ -32,14 +32,6 @@ t3651.scala protectedacc.scala t7436.scala -# Constant(Symbol) -fors.scala -t6634.scala -t6632.scala -t4601.scala -t6633.scala -arrays.scala - # scala.MatchError: SeqLiteral in pattern i3248.scala t6541.scala diff --git a/library/src/scala/tasty/Tasty.scala b/library/src/scala/tasty/Tasty.scala index 7312ecb393ae..32a6955a8d49 100644 --- a/library/src/scala/tasty/Tasty.scala +++ b/library/src/scala/tasty/Tasty.scala @@ -825,6 +825,13 @@ abstract class Tasty { tasty => abstract class ClassTagExtractor { def unapply(x: Constant): Option[Type] } + + /** Extractor for scala.Symbol literals */ + val Symbol: SymbolExtractor + /** Extractor for scala.Symbol literals */ + abstract class SymbolExtractor { + def unapply(x: Constant): Option[scala.Symbol] + } } // ===== Signature ================================================ diff --git a/library/src/scala/tasty/util/ShowExtractors.scala b/library/src/scala/tasty/util/ShowExtractors.scala index f458b0d73c62..90b8889fff4a 100644 --- a/library/src/scala/tasty/util/ShowExtractors.scala +++ b/library/src/scala/tasty/util/ShowExtractors.scala @@ -153,6 +153,7 @@ class ShowExtractors[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Constant.Double(value) => this += "Constant.Double(" += value += ")" case Constant.String(value) => this += "Constant.String(\"" += value += "\")" case Constant.ClassTag(value) => this += "Constant.ClassTag(" += value += ")" + case Constant.Symbol(value) => this += "Constant.Symbol('" += value.name += ")" } 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 71251847299f..ea83df5eb241 100644 --- a/library/src/scala/tasty/util/ShowSourceCode.scala +++ b/library/src/scala/tasty/util/ShowSourceCode.scala @@ -722,6 +722,8 @@ class ShowSourceCode[T <: Tasty with Singleton](tasty0: T) extends Show[T](tasty case Constant.ClassTag(v) => this += "classOf" inSquare(printType(v)) + case Constant.Symbol(v) => + this += "'" += v.name } def printTypeOrBoundsTree(tpt: TypeOrBoundsTree): Buffer = tpt match {