summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
authorHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-09-22 14:00:35 +0000
committerHubert Plociniczak <hubert.plociniczak@epfl.ch>2010-09-22 14:00:35 +0000
commita5d47fb693d9b88ea9ed414762f16e027be64ada (patch)
treec6c5962343a7c7a4e1c7d98dcc6b2ad930c91344 /src/library
parent39a8b1042e04a5b838ac5688e014c29680bf0561 (diff)
downloadscala-a5d47fb693d9b88ea9ed414762f16e027be64ada.tar.gz
scala-a5d47fb693d9b88ea9ed414762f16e027be64ada.tar.bz2
scala-a5d47fb693d9b88ea9ed414762f16e027be64ada.zip
Closes #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.scala18
3 files changed, 26 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..b01ff6a567 100755
--- a/src/library/scala/reflect/generic/UnPickler.scala
+++ b/src/library/scala/reflect/generic/UnPickler.scala
@@ -191,7 +191,23 @@ 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
+ // TODO: Necessary check?
+ if (lazyAcc != NoSymbol)
+ sym = lazyAcc.lazyAccessor
+ }
+ case _ =>
+ }
+
+ if (sym == NoSymbol)
+ errorMissingRequirement(name, owner)
+ }
case NONEsym =>
sym = NoSymbol