diff options
author | Martin Odersky <odersky@gmail.com> | 2013-03-17 20:12:16 +0100 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2013-03-17 20:12:16 +0100 |
commit | 52d740d120cd197ee816aa0a06732ccdb5d5ab29 (patch) | |
tree | 6c6e7120ff879f72e8f7fa95b72ea5b7cdbe321c /src/dotty/tools/dotc/core/pickling/UnPickler.scala | |
parent | 1d029f5f8f90a909ed140f7ef5cf656fafd9fc27 (diff) | |
download | dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.tar.gz dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.tar.bz2 dotty-52d740d120cd197ee816aa0a06732ccdb5d5ab29.zip |
Added emulation of higher-kinded types.
Also improvements to toString.
Diffstat (limited to 'src/dotty/tools/dotc/core/pickling/UnPickler.scala')
-rw-r--r-- | src/dotty/tools/dotc/core/pickling/UnPickler.scala | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/dotty/tools/dotc/core/pickling/UnPickler.scala b/src/dotty/tools/dotc/core/pickling/UnPickler.scala index dc4494e4e..d4e27f11a 100644 --- a/src/dotty/tools/dotc/core/pickling/UnPickler.scala +++ b/src/dotty/tools/dotc/core/pickling/UnPickler.scala @@ -21,13 +21,31 @@ object UnPickler { /** Exception thrown if classfile is corrupted */ class BadSignature(msg: String) extends RuntimeException(msg) - case class TempPolyType(tparams: List[Symbol], tpe: Type) extends UncachedGroundType + case class TempPolyType(tparams: List[Symbol], tpe: Type) extends UncachedGroundType { + override def show(implicit ctx: Context): String = + s"[${ctx.showDcls(tparams, ", ")}]${tpe.show}" + } /** Temporary type for classinfos, will be decomposed on completion of the class */ case class TempClassInfoType(parentTypes: List[Type], decls: MutableScope, clazz: Symbol) extends UncachedGroundType - def depoly(tp: Type)(implicit ctx: Context): Type = tp match { - case TempPolyType(tparams, restpe) => PolyType.fromSymbols(tparams, restpe) + def depoly(tp: Type, forSym: SymDenotation)(implicit ctx: Context): Type = tp match { + case TempPolyType(tparams, restpe) => + if (forSym.isAbstractType) { + val typeArgs = tparams flatMap { tparam => + List(tparam.info.bounds.lo, tparam.info.bounds.hi) + } + val correctedArgs = typeArgs.mapConserve( + _.subst(tparams, tparams map (_ => defn.AnyType))) + val hk = defn.hkTrait(tparams.length) + if (typeArgs ne correctedArgs) + ctx.warning(s"""failure to import F-bounded higher-kinded type + |original type definition: ${forSym.show}${tp.show} + |definition used instead : ${forSym.show} <: $hk[${correctedArgs.map(_.show).mkString(", ")}] + |proceed at own risk.""".stripMargin) + hk.typeConstructor.appliedTo(typeArgs) + } else + PolyType.fromSymbols(tparams, restpe) case tp => tp } @@ -371,9 +389,8 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot: var name1 = name.asTypeName var flags1 = flags if (flags is TypeParam) { - // println(s"expanding name of type parameter $name, owner = ${owner.denot}, completed = ${owner.isCompleted}") // !!! DEBUG name1 = name1.expandedName(owner) - flags1 |= TypeParamCreationFlags + flags1 |= TypeParamCreationFlags | ExpandedName } cctx.newSymbol(owner, name1, flags1, localMemberUnpickler, coord = start) case CLASSsym => @@ -406,13 +423,14 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot: inforef = readNat() pw } + println("reading type for "+denot) val tp = at(inforef, () => readType(forceProperType = denot.isTerm)) denot match { case denot: ClassDenotation => val optSelfType = if (atEnd) NoType else readTypeRef() setClassInfo(denot, tp, optSelfType) case denot => - val tp1 = depoly(tp) + val tp1 = depoly(tp, denot) denot.info = if (tag == ALIASsym) TypeAlias(tp1) else tp1 if (atEnd) { assert(!(denot is SuperAccessor), denot) @@ -424,6 +442,7 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot: denot.addAnnotation(Annotation.makeAlias(alias)) } } + println(s"unpicked ${denot.debugString}, info = ${denot.info}") } def startCoord(denot: SymDenotation): Coord = denot.symbol.coord def complete(denot: SymDenotation): Unit = try { @@ -518,7 +537,7 @@ class UnPickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClassRoot: if (isLocal(sym)) TypeRef(pre, sym.asType) else TypeRef(pre, sym.name.asTypeName) val args = until(end, readTypeRef) - // if (args.nonEmpty) println(s"reading app type $tycon ${tycon.typeSymbol.debugString} $args, owner = ${tycon.typeSymbol.owner.debugString}") // !!! DEBUG + if (args.nonEmpty) println(s"reading app type $tycon ${tycon.typeSymbol.debugString} $args, owner = ${tycon.typeSymbol.owner.debugString}") // !!! DEBUG tycon.appliedTo(args) case TYPEBOUNDStpe => TypeBounds(readTypeRef(), readTypeRef()) |