summaryrefslogtreecommitdiff
path: root/src/reflect
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@gmail.com>2012-09-21 14:10:33 +0200
committerHubert Plociniczak <hubert.plociniczak@gmail.com>2012-10-18 09:43:16 +0200
commit4c86dbbc49266684f66b8731d998b5a3ed508f21 (patch)
tree606db3f2db4c901b752878e89a1504428ce925e9 /src/reflect
parent87c5895d4bae62f1b5bacbd145f2e0fddcccf423 (diff)
downloadscala-4c86dbbc49266684f66b8731d998b5a3ed508f21.tar.gz
scala-4c86dbbc49266684f66b8731d998b5a3ed508f21.tar.bz2
scala-4c86dbbc49266684f66b8731d998b5a3ed508f21.zip
Closes SI-6358. Move accessor generation for lazy vals to typers.
Until now lazy accessors were handled somehow special because their symbol was created in typers but the corresponding tree was only added in Refchecks. This irregularity caused serious problems for value classes. Also it now looks just better when lazy value is treated in a similar way as other fields. I needed to adapt reifier so that it handles the new implementation correctly. Previously it had to recreate lazy val only by removing defdef and renaming. Now we basically need to recreate lazy val from scratch. There is one minor change to cps plugin but that is still fine because lazy vals were never really part of the transformation. Some range positions needed to be fixed manually. We could do it at the creation time but that would require a lot more "if (symbol.isLazy)" conditions for MethodSyntheis and Symbol/Tree creation and would just unnecessary complicate api. If someone has a better idea, please speak up. Range positions changes were necessary because previously accessors were created at refchecks and they weren't checked by validator (even though they were wrong). This commit removes lazy val implementation restriction introduced for 2.10.0. (cherry-picked from 981424b)
Diffstat (limited to 'src/reflect')
-rw-r--r--src/reflect/scala/reflect/internal/Trees.scala18
1 files changed, 12 insertions, 6 deletions
diff --git a/src/reflect/scala/reflect/internal/Trees.scala b/src/reflect/scala/reflect/internal/Trees.scala
index 7ec9f7086d..2bffcba6a8 100644
--- a/src/reflect/scala/reflect/internal/Trees.scala
+++ b/src/reflect/scala/reflect/internal/Trees.scala
@@ -178,9 +178,12 @@ trait Trees extends api.Trees { self: SymbolTable =>
new ForeachPartialTreeTraverser(pf).traverse(this)
}
- def changeOwner(pairs: (Symbol, Symbol)*): Tree = {
+ def changeOwner(pairs: (Symbol, Symbol)*): Tree =
+ changeOwner(false, pairs: _*)
+
+ def changeOwner(followModuleClass: Boolean, pairs: (Symbol, Symbol)*): Tree = {
pairs.foldLeft(this) { case (t, (oldOwner, newOwner)) =>
- new ChangeOwnerTraverser(oldOwner, newOwner) apply t
+ new ChangeOwnerTraverser(oldOwner, newOwner, followModuleClass) apply t
}
}
@@ -1299,7 +1302,11 @@ trait Trees extends api.Trees { self: SymbolTable =>
}
}
- class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol) extends Traverser {
+ class ChangeOwnerTraverser(val oldowner: Symbol, val newowner: Symbol, followModuleClass: Boolean = false) extends Traverser {
+ def changeSymboOwnerIfCorrect(sym: Symbol) = {
+ if (sym != NoSymbol && sym.owner == oldowner)
+ sym.owner = newowner
+ }
def changeOwner(tree: Tree) = tree match {
case Return(expr) =>
if (tree.symbol == oldowner) {
@@ -1312,9 +1319,8 @@ trait Trees extends api.Trees { self: SymbolTable =>
}
}
case _: DefTree | _: Function =>
- if (tree.symbol != NoSymbol && tree.symbol.owner == oldowner) {
- tree.symbol.owner = newowner
- }
+ changeSymboOwnerIfCorrect(tree.symbol)
+ if (followModuleClass) changeSymboOwnerIfCorrect(tree.symbol.moduleClass)
case _ =>
}
override def traverse(tree: Tree) {