diff options
author | Martin Odersky <odersky@gmail.com> | 2013-04-05 19:39:44 +0200 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-04-05 19:39:44 +0200 |
commit | 3eefd53095a06d40c2f841c54f8953f181287541 (patch) | |
tree | 40cee54d5fff04115503735a98939c26f3184c72 /src/dotty/tools/dotc/core | |
parent | e60517ae83841a88cd1ad4c5ef24c27186adf346 (diff) | |
download | dotty-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')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/UnPickler.scala | 30 |
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) |