@@ -55,6 +55,9 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
55
55
*/
56
56
private [this ] var seenRoots : Set [Symbol ] = Set ()
57
57
58
+ /** A map from unpickled class symbols to their local dummies */
59
+ private [this ] val localDummies = new mutable.HashMap [ClassSymbol , Symbol ]
60
+
58
61
/** The root owner tree. See `OwnerTree` class definition. Set by `enterTopLevel`. */
59
62
private [this ] var ownerTree : OwnerTree = _
60
63
@@ -424,7 +427,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
424
427
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM =>
425
428
createMemberSymbol()
426
429
case TEMPLATE =>
427
- val localDummy = ctx.newLocalDummy (ctx.owner)
430
+ val localDummy = localDummies (ctx.owner.asClass )
428
431
registerSym(currentAddr, localDummy)
429
432
localDummy
430
433
case tag =>
@@ -478,6 +481,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
478
481
ctx.enter(sym)
479
482
registerSym(start, sym)
480
483
if (isClass) {
484
+ localDummies(sym.asClass) = ctx.newLocalDummy(sym)
481
485
sym.completer.withDecls(newScope)
482
486
forkAt(templateStart).indexTemplateParams()(localContext(sym))
483
487
}
@@ -745,14 +749,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
745
749
else NoType
746
750
cls.info = new TempClassInfo (cls.owner.thisType, cls, cls.unforcedDecls, assumedSelfType)
747
751
val localDummy = symbolAtCurrent()
752
+ val parentCtx = ctx.withOwner(localDummy)
748
753
assert(readByte() == TEMPLATE )
749
754
val end = readEnd()
750
755
val tparams = readIndexedParams[TypeDef ](TYPEPARAM )
751
756
val vparams = readIndexedParams[ValDef ](PARAM )
752
757
val parents = collectWhile(nextByte != SELFDEF && nextByte != DEFDEF ) {
753
758
nextByte match {
754
- case APPLY | TYPEAPPLY => readTerm()
755
- case _ => readTpt()
759
+ case APPLY | TYPEAPPLY => readTerm()(parentCtx)
760
+ case _ => readTpt()(parentCtx)
756
761
}
757
762
}
758
763
val parentTypes = parents.map(_.tpe.dealias)
@@ -766,13 +771,14 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
766
771
if (self.isEmpty) NoType else self.tpt.tpe)
767
772
cls.setNoInitsFlags(fork.indexStats(end))
768
773
val constr = readIndexedDef().asInstanceOf [DefDef ]
774
+ val mappedParents = parents.map(_.changeOwner(localDummy, constr.symbol))
769
775
770
776
val lazyStats = readLater(end, rdr => implicit ctx => {
771
777
val stats = rdr.readIndexedStats(localDummy, end)
772
778
tparams ++ vparams ++ stats
773
779
})
774
780
setPos(start,
775
- untpd.Template (constr, parents , self, lazyStats)
781
+ untpd.Template (constr, mappedParents , self, lazyStats)
776
782
.withType(localDummy.termRef))
777
783
}
778
784
@@ -922,15 +928,10 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
922
928
def readLengthTerm (): Tree = {
923
929
val end = readEnd()
924
930
925
- def localNonClassCtx = {
926
- val ctx1 = ctx.fresh.setNewScope
927
- if (ctx.owner.isClass) ctx1.setOwner(ctx1.newLocalDummy(ctx.owner)) else ctx1
928
- }
929
-
930
931
def readBlock (mkTree : (List [Tree ], Tree ) => Tree ): Tree = {
931
932
val exprReader = fork
932
933
skipTree()
933
- val localCtx = localNonClassCtx
934
+ val localCtx = ctx.fresh.setNewScope
934
935
val stats = readStats(ctx.owner, end)(localCtx)
935
936
val expr = exprReader.readTerm()(localCtx)
936
937
mkTree(stats, expr)
@@ -1030,7 +1031,11 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
1030
1031
case ANNOTATEDtpt =>
1031
1032
Annotated (readTpt(), readTerm())
1032
1033
case LAMBDAtpt =>
1033
- val localCtx = localNonClassCtx
1034
+ var localCtx = ctx.fresh.setNewScope
1035
+ ctx.owner match {
1036
+ case cls : ClassSymbol => localCtx = localCtx.setOwner(localDummies(cls))
1037
+ case _ =>
1038
+ }
1034
1039
val tparams = readParams[TypeDef ](TYPEPARAM )(localCtx)
1035
1040
val body = readTpt()(localCtx)
1036
1041
LambdaTypeTree (tparams, body)
0 commit comments