diff options
author | Martin Odersky <odersky@gmail.com> | 2013-03-24 15:02:27 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-03-24 15:02:27 +0100 |
commit | 4a17f0d1e17adecbdc4755bf719feff18d115318 (patch) | |
tree | 1d373cd855f9631fd567bbbba2f0e9dd633ecc3d | |
parent | b791ef8e586d86af68f1212c9abecc22bb2d4de1 (diff) | |
download | dotty-4a17f0d1e17adecbdc4755bf719feff18d115318.tar.gz dotty-4a17f0d1e17adecbdc4755bf719feff18d115318.tar.bz2 dotty-4a17f0d1e17adecbdc4755bf719feff18d115318.zip |
More fixes to classfile loading.
-rw-r--r-- | src/dotty/tools/dotc/core/Contexts.scala | 1 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/SymDenotations.scala | 1 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/SymbolLoaders.scala | 22 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/Types.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/UnPickler.scala | 12 | ||||
-rw-r--r-- | src/test/showClass.scala | 2 |
6 files changed, 36 insertions, 4 deletions
diff --git a/src/dotty/tools/dotc/core/Contexts.scala b/src/dotty/tools/dotc/core/Contexts.scala index e8e2fa6dc..ecb22f71a 100644 --- a/src/dotty/tools/dotc/core/Contexts.scala +++ b/src/dotty/tools/dotc/core/Contexts.scala @@ -258,6 +258,7 @@ object Contexts { .withSetting(settings.Ylogcp, true) .withSetting(settings.printtypes, true) .withSetting(settings.pageWidth, 90) + .withSetting(settings.log, List("<some")) /** The symbol loaders */ val loaders = new SymbolLoaders diff --git a/src/dotty/tools/dotc/core/SymDenotations.scala b/src/dotty/tools/dotc/core/SymDenotations.scala index 93de8e4ff..dc2502092 100644 --- a/src/dotty/tools/dotc/core/SymDenotations.scala +++ b/src/dotty/tools/dotc/core/SymDenotations.scala @@ -982,6 +982,7 @@ object SymDenotations { */ trait LazyModuleClassInfo extends LazyClassInfo { def module: TermSymbol + override def toString = s"LazyModuleClassInfo($module)" } /** A lazy type for modules that points to the module class. diff --git a/src/dotty/tools/dotc/core/SymbolLoaders.scala b/src/dotty/tools/dotc/core/SymbolLoaders.scala index cb20b894a..f5c8bf999 100644 --- a/src/dotty/tools/dotc/core/SymbolLoaders.scala +++ b/src/dotty/tools/dotc/core/SymbolLoaders.scala @@ -259,7 +259,27 @@ class ClassfileLoader(val classfile: AbstractFile)(implicit val cctx: CondensedC def rootDenots(rootDenot: ClassDenotation): (ClassDenotation, ClassDenotation) = { val linkedDenot = rootDenot.linkedClass.denot match { case d: ClassDenotation => d - case d => throw new FatalError(s"linked class denot $d of $rootDenot is expected to be a ClassDenotation, but is a ${d.getClass}") + case d => + // this can happen if the companion if shadowed by a val or type + // in a package object; in this case, we make up some dummy denotation + // as a stand in for loading. + // An example for this situation is scala.reflect.Manifest, which exists + // as a class in scala.reflect and as a val in scala.reflect.package. + if (rootDenot is ModuleClass) + cctx.newClassSymbol( + rootDenot.owner, rootDenot.name.asTypeName, Synthetic, + _ => NoType).classDenot + else { + def modClassCompleter(modul: TermSymbol, modcls: ClassSymbol) = + new LazyModuleClassInfo { + val decls = newScope + def module = modul + def complete(denot: SymDenotation) = unsupported("complete") + } + cctx.newModuleSymbol( + rootDenot.owner, rootDenot.name.toTermName, Synthetic, Synthetic, + modClassCompleter).moduleClass.denot.asClass + } } if (rootDenot is ModuleClass) (linkedDenot, rootDenot) else (rootDenot, linkedDenot) diff --git a/src/dotty/tools/dotc/core/Types.scala b/src/dotty/tools/dotc/core/Types.scala index 445f4c634..9f5a56df7 100644 --- a/src/dotty/tools/dotc/core/Types.scala +++ b/src/dotty/tools/dotc/core/Types.scala @@ -596,6 +596,8 @@ object Types { hkRefinement(tp) case tp: TypeProxy => tp.underlying.appliedTo(args) + case AndType(l, r) => + l.appliedTo(args) & r.appliedTo(args) } } diff --git a/src/dotty/tools/dotc/core/pickling/UnPickler.scala b/src/dotty/tools/dotc/core/pickling/UnPickler.scala index f86d7cc26..e9ae3573e 100644 --- a/src/dotty/tools/dotc/core/pickling/UnPickler.scala +++ b/src/dotty/tools/dotc/core/pickling/UnPickler.scala @@ -111,8 +111,16 @@ object UnPickler { else denot.enter(tparam, decls) } var ost = optSelfType - if (ost == NoType && (denot is ModuleClass)) - ost = TermRef(denot.owner.thisType, denot.sourceModule.asTerm) + if (ost == NoType && (denot is ModuleClass)) { + var module = denot.sourceModule + if (!module.isTerm) { + println(s"$denot does not have a sourceModule ${denot.completer} of class ${denot.completer.getClass}") + // 2nd try: read form precomplete decls + module = denot.owner.preCompleteDecls.lookup(denot.name.toTermName) + .suchThat(_ is Module).symbol + } + ost = TermRef(denot.owner.thisType, module.asTerm) + } denot.info = ClassInfo(denot.owner.thisType, denot.classSymbol, parentRefs, decls, ost) } } diff --git a/src/test/showClass.scala b/src/test/showClass.scala index 55752eae5..760932f0f 100644 --- a/src/test/showClass.scala +++ b/src/test/showClass.scala @@ -53,7 +53,7 @@ object showClass { for (arg <- args) showPackage(ctx.requiredPackage(arg)) - showClasses("scala.Predef") + showClasses("scala.actors.remote.Proxy") // showClasses("scala.Boolean") // showClasses("scala.Array") // showClasses("scala.math.Ordering") |