From 1585b52b6cbf2e2985ef3a02009466e56baf6e74 Mon Sep 17 00:00:00 2001 From: Den Shabalin Date: Thu, 5 Sep 2013 13:22:22 +0200 Subject: reify ScalaPackage symbol with the help of ScalaDot --- src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala | 6 ++++++ src/reflect/scala/reflect/api/BuildUtils.scala | 7 +++++++ src/reflect/scala/reflect/internal/BuildUtils.scala | 8 ++++++++ src/reflect/scala/reflect/internal/StdNames.scala | 1 + .../scalacheck/quasiquotes/DefinitionConstructionProps.scala | 3 ++- 5 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala index 62c246366d..a817afe741 100644 --- a/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala +++ b/src/compiler/scala/tools/reflect/quasiquotes/Reifiers.scala @@ -62,6 +62,12 @@ trait Reifiers { self: Quasiquotes => reifyBuildCall(nme.SyntacticTypeApplied, fun, targs) case Block(stats, last) => reifyBuildCall(nme.SyntacticBlock, stats :+ last) + // parser emits trees with scala package symbol to ensure + // that some names hygienically point to various scala package + // members; we need to preserve this symbol to preserve + // correctness of the trees produced by quasiquotes + case Select(id @ Ident(nme.scala_), name) if id.symbol == ScalaPackage => + reifyBuildCall(nme.ScalaDot, name) case _ => super.reifyTreeSyntactically(tree) } diff --git a/src/reflect/scala/reflect/api/BuildUtils.scala b/src/reflect/scala/reflect/api/BuildUtils.scala index ef9f9ab834..a0a47fe23c 100644 --- a/src/reflect/scala/reflect/api/BuildUtils.scala +++ b/src/reflect/scala/reflect/api/BuildUtils.scala @@ -80,6 +80,13 @@ private[reflect] trait BuildUtils { self: Universe => def RefTree(qual: Tree, sym: Symbol): Tree + val ScalaDot: ScalaDotExtractor + + trait ScalaDotExtractor { + def apply(name: Name): Tree + def unapply(tree: Tree): Option[Name] + } + val FlagsRepr: FlagsReprExtractor trait FlagsReprExtractor { diff --git a/src/reflect/scala/reflect/internal/BuildUtils.scala b/src/reflect/scala/reflect/internal/BuildUtils.scala index 928395b7c9..abe9e39067 100644 --- a/src/reflect/scala/reflect/internal/BuildUtils.scala +++ b/src/reflect/scala/reflect/internal/BuildUtils.scala @@ -82,6 +82,14 @@ trait BuildUtils { self: SymbolTable => def mkRefineStat(stats: List[Tree]): List[Tree] = stats.map(mkRefineStat) + object ScalaDot extends ScalaDotExtractor { + def apply(name: Name): Tree = gen.scalaDot(name) + def unapply(tree: Tree): Option[Name] = tree match { + case Select(id @ Ident(nme.scala_), name) if id.symbol == ScalaPackage => Some(name) + case _ => None + } + } + def RefTree(qual: Tree, sym: Symbol) = self.RefTree(qual, sym.name) setSymbol sym object FlagsRepr extends FlagsReprExtractor { diff --git a/src/reflect/scala/reflect/internal/StdNames.scala b/src/reflect/scala/reflect/internal/StdNames.scala index 6cbf1f1046..0b1f444772 100644 --- a/src/reflect/scala/reflect/internal/StdNames.scala +++ b/src/reflect/scala/reflect/internal/StdNames.scala @@ -724,6 +724,7 @@ trait StdNames { val staticModule : NameType = "staticModule" val staticPackage : NameType = "staticPackage" val synchronized_ : NameType = "synchronized" + val ScalaDot: NameType = "ScalaDot" val TermName: NameType = "TermName" val this_ : NameType = "this" val thisPrefix : NameType = "thisPrefix" diff --git a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala index dc3fc60f8c..707394fdba 100644 --- a/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala +++ b/test/files/scalacheck/quasiquotes/DefinitionConstructionProps.scala @@ -4,6 +4,7 @@ import Gen._ import Arbitrary._ import scala.reflect.runtime.universe._ +import scala.reflect.runtime.universe.build.ScalaDot import Flag._ object DefinitionConstructionProps @@ -14,7 +15,7 @@ object DefinitionConstructionProps with ValDefConstruction trait ClassConstruction { self: QuasiquoteProperties => - val anyRef = Select(Ident(TermName("scala")), TypeName("AnyRef")) + val anyRef = ScalaDot(TypeName("AnyRef")) val emtpyConstructor = DefDef(Modifiers(), nme.CONSTRUCTOR, List(), List(List()), TypeTree(), Block(List(pendingSuperCall), Literal(Constant(())))) -- cgit v1.2.3