summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-10-01 17:10:27 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-10-01 17:10:27 +0000
commit256aca612204f1316e5281af6d10a14300d58ad1 (patch)
tree207ec6cdb99b473b9a21811d4d903ed75a289ed7 /src/library
parent1148daec9c6aeba69d5d37fde877ab20b310db5b (diff)
downloadscala-256aca612204f1316e5281af6d10a14300d58ad1.tar.gz
scala-256aca612204f1316e5281af6d10a14300d58ad1.tar.bz2
scala-256aca612204f1316e5281af6d10a14300d58ad1.zip
Another attempt for #1591.
Diffstat (limited to 'src/library')
-rwxr-xr-xsrc/library/scala/reflect/generic/StdNames.scala4
-rwxr-xr-xsrc/library/scala/reflect/generic/Symbols.scala5
-rwxr-xr-xsrc/library/scala/reflect/generic/UnPickler.scala17
3 files changed, 25 insertions, 1 deletions
diff --git a/src/library/scala/reflect/generic/StdNames.scala b/src/library/scala/reflect/generic/StdNames.scala
index 7a3b9169d8..03cee8c909 100755
--- a/src/library/scala/reflect/generic/StdNames.scala
+++ b/src/library/scala/reflect/generic/StdNames.scala
@@ -17,10 +17,14 @@ trait StdNames { self: Universe =>
val ROOT = newTermName("<root>")
val ROOTPKG = newTermName("_root_")
val EMPTY = newTermName("")
+ val MODULE_SUFFIX = newTermName("$module")
/** The expanded name of `name' relative to this class `base` with given `separator`
*/
def expandedName(name: Name, base: Symbol, separator: String = EXPAND_SEPARATOR_STRING): Name =
newTermName(base.fullName('$') + separator + name)
+
+ def moduleVarName(name: Name): Name =
+ newTermName(name.toString() + MODULE_SUFFIX)
}
}
diff --git a/src/library/scala/reflect/generic/Symbols.scala b/src/library/scala/reflect/generic/Symbols.scala
index f1226c7e19..a1c9a0c18d 100755
--- a/src/library/scala/reflect/generic/Symbols.scala
+++ b/src/library/scala/reflect/generic/Symbols.scala
@@ -107,6 +107,11 @@ trait Symbols { self: Universe =>
*/
def moduleClass: Symbol
+ /**
+ * If symbol is a lazy val, it's lazy accessor
+ */
+ def lazyAccessor: Symbol
+
// flags and kind tests
def isTerm = false // to be overridden
diff --git a/src/library/scala/reflect/generic/UnPickler.scala b/src/library/scala/reflect/generic/UnPickler.scala
index 54ac1acc3d..d5e2bd9f11 100755
--- a/src/library/scala/reflect/generic/UnPickler.scala
+++ b/src/library/scala/reflect/generic/UnPickler.scala
@@ -191,7 +191,22 @@ abstract class UnPickler {
// right member => return NoSymbol. This can only happen when unpickling a tree.
// the "case Apply" in readTree() takes care of selecting the correct alternative
// after parsing the arguments.
- if (sym == NoSymbol && !owner.isOverloaded) errorMissingRequirement(name, owner)
+ if (sym == NoSymbol && !owner.isOverloaded) {
+ // Possibly a nested object symbol
+ tag match {
+ case EXTMODCLASSref =>
+ val moduleVar = owner.info.decl(nme.moduleVarName(name))
+ if (moduleVar.hasFlag(LAZY)) {
+ val lazyAcc = moduleVar.lazyAccessor
+ if (lazyAcc != NoSymbol)
+ sym = lazyAcc.lazyAccessor
+ }
+ case _ =>
+ }
+
+ if (sym == NoSymbol)
+ errorMissingRequirement(name, owner)
+ }
case NONEsym =>
sym = NoSymbol