aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2017-03-18 13:57:52 +0100
committerMartin Odersky <odersky@gmail.com>2017-04-06 13:15:28 +0200
commite4d499945b93f95bbff7e9fe71aeffc9af4fc8bd (patch)
treef07ff4b6dae3bb30bef7d4f924b5013f427acc26 /compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
parentc67217594bb40e1eab7e567c97bdf29ac0654864 (diff)
downloaddotty-e4d499945b93f95bbff7e9fe71aeffc9af4fc8bd.tar.gz
dotty-e4d499945b93f95bbff7e9fe71aeffc9af4fc8bd.tar.bz2
dotty-e4d499945b93f95bbff7e9fe71aeffc9af4fc8bd.zip
Handle hk lambdas in tasty
Diffstat (limited to 'compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala')
-rw-r--r--compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala36
1 files changed, 20 insertions, 16 deletions
diff --git a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
index e751e99fe..b83045a11 100644
--- a/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
+++ b/compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala
@@ -234,6 +234,19 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
(nameReader.readParamNames(end), paramReader)
}
+ def readMethodic[N <: Name, PInfo <: Type, LT <: LambdaType]
+ (companion: LambdaTypeCompanion[N, PInfo, LT], nameMap: Name => N): LT = {
+ val nameReader = fork
+ nameReader.skipTree() // skip result
+ val paramReader = nameReader.fork
+ val paramNames = nameReader.readParamNames(end).map(nameMap)
+ val result = companion(paramNames)(
+ pt => registeringType(pt, paramReader.readParamTypes[PInfo](end)),
+ pt => readType())
+ goto(end)
+ result
+ }
+
val result =
(tag: @switch) match {
case SUPERtype =>
@@ -268,23 +281,14 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
registerSym(start, sym)
TypeRef.withFixedSym(NoPrefix, sym.name, sym)
case POLYtype =>
- val (paramNames, paramReader) = readNamesSkipParams
- val result = PolyType(paramNames.map(_.toTypeName))(
- pt => registeringType(pt, paramReader.readParamTypes[TypeBounds](end)),
- pt => readType())
- goto(end)
- result
+ readMethodic(PolyType, _.toTypeName)
case METHODtype =>
- val (names, paramReader) = readNamesSkipParams
- val result = MethodType(names.map(_.toTermName))(
- mt => registeringType(mt, paramReader.readParamTypes[Type](end)),
- mt => readType())
- goto(end)
- result
+ readMethodic(MethodType, _.toTermName)
+ case TYPELAMBDAtype =>
+ readMethodic(HKTypeLambda, _.toTypeName)
case PARAMtype =>
readTypeRef() match {
- case binder: TypeLambda => binder.newParamRef(readNat())
- case binder: MethodType => binder.newParamRef(readNat())
+ case binder: LambdaType => binder.newParamRef(readNat())
}
case CLASSconst =>
ConstantType(Constant(readType()))
@@ -410,7 +414,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
}
def isAbstractType(ttag: Int)(implicit ctx: Context): Boolean = nextUnsharedTag match {
- case POLYtpt =>
+ case LAMBDAtpt =>
val rdr = fork
rdr.reader.readByte() // tag
rdr.reader.readNat() // length
@@ -1033,7 +1037,7 @@ class TreeUnpickler(reader: TastyReader, tastyName: TastyName.Table, posUnpickle
OrTypeTree(readTpt(), readTpt())
case ANNOTATEDtpt =>
Annotated(readTpt(), readTerm())
- case POLYtpt =>
+ case LAMBDAtpt =>
val localCtx = localNonClassCtx
val tparams = readParams[TypeDef](TYPEPARAM)(localCtx)
val body = readTpt()(localCtx)