From a5d47fb693d9b88ea9ed414762f16e027be64ada Mon Sep 17 00:00:00 2001 From: Hubert Plociniczak Date: Wed, 22 Sep 2010 14:00:35 +0000 Subject: Closes #1591. --- src/library/scala/reflect/generic/StdNames.scala | 4 ++++ src/library/scala/reflect/generic/Symbols.scala | 5 +++++ src/library/scala/reflect/generic/UnPickler.scala | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/library') 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("") 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 -- cgit v1.2.3