summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEugene Burmako <xeno.by@gmail.com>2013-02-08 14:08:54 +0100
committerEugene Burmako <xeno.by@gmail.com>2013-02-08 15:04:48 +0100
commitce867c74572b51cfcb6ac3e3bfa9dce36cc0b638 (patch)
treea4c05858cd9ebd60670aa3dbcb3d4033e6f42e10 /src
parent09ef8730d13eff1cf200bbfb0f6fda7f6d72524a (diff)
downloadscala-ce867c74572b51cfcb6ac3e3bfa9dce36cc0b638.tar.gz
scala-ce867c74572b51cfcb6ac3e3bfa9dce36cc0b638.tar.bz2
scala-ce867c74572b51cfcb6ac3e3bfa9dce36cc0b638.zip
term and type reftrees are now reified uniformly
Top-level (i.e. owned by a package) => Ident(symbol) Nested (i.e. owned by an object or a package object) => Select(owner, symbol) Inner (i.e. owned by a static class) => selectTerm/selectType(owner, name) Non-locatable (i.e. everything else) => see GenTrees.scala for more details Changes w.r.t the previous approaches: * Top-level refs are no longer reified as Select(This(package), symbol). Proposed reification scheme is as resistant to resetAttrs as previous one, but is at the same time much shorter. * Refs to definitions from package objects are no longer Ident(symbol). Otherwise reflective compilation of things like `_ :: _` fails. * Contents of Predef._ and scala._ are no longer treated specially. This increases the size of reificode, but is more hygienic.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/reflect/reify/codegen/GenTrees.scala12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/compiler/scala/reflect/reify/codegen/GenTrees.scala b/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
index 7c7a79e774..9894e359b4 100644
--- a/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
+++ b/src/compiler/scala/reflect/reify/codegen/GenTrees.scala
@@ -153,10 +153,12 @@ trait GenTrees {
else mirrorCall(nme.Ident, reify(name))
case Select(qual, name) =>
- if (sym == NoSymbol || sym.name == name)
- reifyProduct(tree)
- else
- reifyProduct(Select(qual, sym.name))
+ if (qual.symbol != null && qual.symbol.isPackage) {
+ mirrorBuildCall(nme.Ident, reify(sym))
+ } else {
+ val effectiveName = if (sym != null && sym != NoSymbol) sym.name else name
+ reifyProduct(Select(qual, effectiveName))
+ }
case _ =>
throw new Error("internal error: %s (%s, %s) is not supported".format(tree, tree.productPrefix, tree.getClass))
@@ -197,7 +199,7 @@ trait GenTrees {
}
}
else tree match {
- case Select(qual, name) if !qual.symbol.isPackage && !qual.symbol.isPackageObject && qual.symbol != definitions.PredefModule =>
+ case Select(qual, name) if !qual.symbol.isPackage =>
if (reifyDebug) println(s"reifying Select($qual, $name)")
mirrorCall(nme.Select, reify(qual), reify(name))
case SelectFromTypeTree(qual, name) =>