diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-09-22 14:00:35 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-09-22 14:00:35 +0000 |
commit | a5d47fb693d9b88ea9ed414762f16e027be64ada (patch) | |
tree | c6c5962343a7c7a4e1c7d98dcc6b2ad930c91344 /src/library | |
parent | 39a8b1042e04a5b838ac5688e014c29680bf0561 (diff) | |
download | scala-a5d47fb693d9b88ea9ed414762f16e027be64ada.tar.gz scala-a5d47fb693d9b88ea9ed414762f16e027be64ada.tar.bz2 scala-a5d47fb693d9b88ea9ed414762f16e027be64ada.zip |
Closes #1591.
Diffstat (limited to 'src/library')
-rwxr-xr-x | src/library/scala/reflect/generic/StdNames.scala | 4 | ||||
-rwxr-xr-x | src/library/scala/reflect/generic/Symbols.scala | 5 | ||||
-rwxr-xr-x | src/library/scala/reflect/generic/UnPickler.scala | 18 |
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 |