@@ -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
@@ -423,7 +426,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
423
426
case VALDEF | DEFDEF | TYPEDEF | TYPEPARAM | PARAM =>
424
427
createMemberSymbol()
425
428
case TEMPLATE =>
426
- val localDummy = ctx.newLocalDummy (ctx.owner)
429
+ val localDummy = localDummies (ctx.owner.asClass )
427
430
registerSym(currentAddr, localDummy)
428
431
localDummy
429
432
case tag =>
@@ -474,6 +477,7 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
474
477
ctx.enter(sym)
475
478
registerSym(start, sym)
476
479
if (isClass) {
480
+ localDummies(sym.asClass) = ctx.newLocalDummy(sym)
477
481
sym.completer.withDecls(newScope)
478
482
forkAt(templateStart).indexTemplateParams()(localContext(sym))
479
483
}
@@ -741,14 +745,15 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
741
745
else NoType
742
746
cls.info = new TempClassInfo (cls.owner.thisType, cls, cls.unforcedDecls, assumedSelfType)
743
747
val localDummy = symbolAtCurrent()
748
+ val parentCtx = ctx.withOwner(localDummy)
744
749
assert(readByte() == TEMPLATE )
745
750
val end = readEnd()
746
751
val tparams = readIndexedParams[TypeDef ](TYPEPARAM )
747
752
val vparams = readIndexedParams[ValDef ](PARAM )
748
753
val parents = collectWhile(nextByte != SELFDEF && nextByte != DEFDEF ) {
749
754
nextByte match {
750
- case APPLY | TYPEAPPLY => readTerm()
751
- case _ => readTpt()
755
+ case APPLY | TYPEAPPLY => readTerm()(parentCtx)
756
+ case _ => readTpt()(parentCtx)
752
757
}
753
758
}
754
759
val parentTypes = parents.map(_.tpe.dealias)
@@ -762,13 +767,14 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
762
767
if (self.isEmpty) NoType else self.tpt.tpe)
763
768
cls.setNoInitsFlags(fork.indexStats(end))
764
769
val constr = readIndexedDef().asInstanceOf [DefDef ]
770
+ val mappedParents = parents.map(_.changeOwner(localDummy, constr.symbol))
765
771
766
772
val lazyStats = readLater(end, rdr => implicit ctx => {
767
773
val stats = rdr.readIndexedStats(localDummy, end)
768
774
tparams ++ vparams ++ stats
769
775
})
770
776
setPos(start,
771
- untpd.Template (constr, parents , self, lazyStats)
777
+ untpd.Template (constr, mappedParents , self, lazyStats)
772
778
.withType(localDummy.termRef))
773
779
}
774
780
@@ -918,15 +924,10 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
918
924
def readLengthTerm (): Tree = {
919
925
val end = readEnd()
920
926
921
- def localNonClassCtx = {
922
- val ctx1 = ctx.fresh.setNewScope
923
- if (ctx.owner.isClass) ctx1.setOwner(ctx1.newLocalDummy(ctx.owner)) else ctx1
924
- }
925
-
926
927
def readBlock (mkTree : (List [Tree ], Tree ) => Tree ): Tree = {
927
928
val exprReader = fork
928
929
skipTree()
929
- val localCtx = localNonClassCtx
930
+ val localCtx = ctx.fresh.setNewScope
930
931
val stats = readStats(ctx.owner, end)(localCtx)
931
932
val expr = exprReader.readTerm()(localCtx)
932
933
mkTree(stats, expr)
@@ -1026,7 +1027,11 @@ class TreeUnpickler(reader: TastyReader, nameAtRef: NameRef => TermName, posUnpi
1026
1027
case ANNOTATEDtpt =>
1027
1028
Annotated (readTpt(), readTerm())
1028
1029
case LAMBDAtpt =>
1029
- val localCtx = localNonClassCtx
1030
+ var localCtx = ctx.fresh.setNewScope
1031
+ ctx.owner match {
1032
+ case cls : ClassSymbol => localCtx = localCtx.setOwner(localDummies(cls))
1033
+ case _ =>
1034
+ }
1030
1035
val tparams = readParams[TypeDef ](TYPEPARAM )(localCtx)
1031
1036
val body = readTpt()(localCtx)
1032
1037
LambdaTypeTree (tparams, body)
0 commit comments