diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-02-08 14:08:54 +0100 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-02-08 15:04:48 +0100 |
commit | ce867c74572b51cfcb6ac3e3bfa9dce36cc0b638 (patch) | |
tree | a4c05858cd9ebd60670aa3dbcb3d4033e6f42e10 /src | |
parent | 09ef8730d13eff1cf200bbfb0f6fda7f6d72524a (diff) | |
download | scala-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.scala | 12 |
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) => |