aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2013-03-24 15:02:27 +0100
committerMartin Odersky <odersky@gmail.com>2013-03-24 15:02:27 +0100
commit4a17f0d1e17adecbdc4755bf719feff18d115318 (patch)
tree1d373cd855f9631fd567bbbba2f0e9dd633ecc3d /src
parentb791ef8e586d86af68f1212c9abecc22bb2d4de1 (diff)
downloaddotty-4a17f0d1e17adecbdc4755bf719feff18d115318.tar.gz
dotty-4a17f0d1e17adecbdc4755bf719feff18d115318.tar.bz2
dotty-4a17f0d1e17adecbdc4755bf719feff18d115318.zip
More fixes to classfile loading.
Diffstat (limited to 'src')
-rw-r--r--src/dotty/tools/dotc/core/Contexts.scala1
-rw-r--r--src/dotty/tools/dotc/core/SymDenotations.scala1
-rw-r--r--src/dotty/tools/dotc/core/SymbolLoaders.scala22
-rw-r--r--src/dotty/tools/dotc/core/Types.scala2
-rw-r--r--src/dotty/tools/dotc/core/pickling/UnPickler.scala12
-rw-r--r--src/test/showClass.scala2
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")