diff options
author | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-10-01 17:10:27 +0000 |
---|---|---|
committer | Hubert Plociniczak <hubert.plociniczak@epfl.ch> | 2010-10-01 17:10:27 +0000 |
commit | 256aca612204f1316e5281af6d10a14300d58ad1 (patch) | |
tree | 207ec6cdb99b473b9a21811d4d903ed75a289ed7 /src/library | |
parent | 1148daec9c6aeba69d5d37fde877ab20b310db5b (diff) | |
download | scala-256aca612204f1316e5281af6d10a14300d58ad1.tar.gz scala-256aca612204f1316e5281af6d10a14300d58ad1.tar.bz2 scala-256aca612204f1316e5281af6d10a14300d58ad1.zip |
Another attempt for #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 | 17 |
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 |