aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/core/pickling/UnPickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-04-05 19:39:44 +0200
committerMartin Odersky <odersky@gmail.com>2013-04-05 19:39:44 +0200
commit3eefd53095a06d40c2f841c54f8953f181287541 (patch)
tree40cee54d5fff04115503735a98939c26f3184c72 /src/dotty/tools/dotc/core/pickling/UnPickler.scala
parente60517ae83841a88cd1ad4c5ef24c27186adf346 (diff)
downloaddotty-3eefd53095a06d40c2f841c54f8953f181287541.tar.gz
dotty-3eefd53095a06d40c2f841c54f8953f181287541.tar.bz2
dotty-3eefd53095a06d40c2f841c54f8953f181287541.zip
Moved logic from setClassInfo to completer.
Made sure that unpickled module classes always have a sourceModule.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/UnPickler.scala')
-rw-r--r--src/dotty/tools/dotc/core/pickling/UnPickler.scala30
1 files changed, 15 insertions, 15 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/UnPickler.scala b/src/dotty/tools/dotc/core/pickling/UnPickler.scala
index 5b6e76500..cded46014 100644
--- a/src/dotty/tools/dotc/core/pickling/UnPickler.scala
+++ b/src/dotty/tools/dotc/core/pickling/UnPickler.scala
@@ -110,19 +110,10 @@ object UnPickler {
if (tsym.exists) tsym.setFlag(TypeParam)
else denot.enter(tparam, decls)
}
- var ost = optSelfType
- if (ost == NoType && (denot is ModuleClass)) {
- var module = denot.sourceModule
- if (!module.isTerm) {
- // 2nd try: read from precomplete decls
- module = denot.owner.preCompleteDecls.lookup(
- denot.name.stripModuleClassSuffix.toTermName)
- .suchThat(_ is Module).symbol
- if (!module.isTerm) // !!! DEBUG
- println(s"panic: $denot ${denot.owner} ${denot.owner.preCompleteDecls}")
- }
- ost = TermRef(denot.owner.thisType, module.asTerm)
- }
+ val ost =
+ if ((optSelfType eq NoType) && (denot is ModuleClass))
+ TermRef(denot.owner.thisType, denot.sourceModule.asTerm)
+ else optSelfType
denot.info = ClassInfo(denot.owner.thisType, denot.classSymbol, parentRefs, decls, ost)
}
}
@@ -468,8 +459,12 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot:
else if (name == tpnme.REFINE_CLASS)
// create a type alias instead
cctx.newSymbol(owner, name, flags, localMemberUnpickler, coord = start)
- else
- cctx.newClassSymbol(owner, name.asTypeName, flags, new LocalClassUnpickler(_), coord = start)
+ else {
+ val completer =
+ if (flags is ModuleClass) new LocalModuleClassUnpickler(_: Symbol)
+ else new LocalClassUnpickler(_: Symbol)
+ cctx.newClassSymbol(owner, name.asTypeName, flags, completer, coord = start)
+ }
case MODULEsym | VALsym =>
if (isModuleRoot) {
moduleRoot setFlag flags
@@ -532,6 +527,11 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot:
val decls = symScope(cls)
}
+ class LocalModuleClassUnpickler(cls: Symbol) extends LocalClassUnpickler(cls) with LazyModuleClassInfo {
+ def module = cls.owner.preCompleteDecls.lookup(
+ cls.name.stripModuleClassSuffix.toTermName).suchThat(_ is Module).symbol.asTerm
+ }
+
object localMemberUnpickler extends LocalUnpickler
class ClassRootUnpickler(start: Coord, cls: Symbol)