@@ -398,19 +398,36 @@ object Symbols {
398
398
399
399
/** The last denotation of this symbol */
400
400
private [this ] var lastDenot : SymDenotation = _
401
+ private [this ] var checkedPeriod : Period = Nowhere
402
+
403
+ private [core] def invalidateDenotCache () = { checkedPeriod = Nowhere }
401
404
402
405
/** Set the denotation of this symbol */
403
- private [core] def denot_= (d : SymDenotation ) =
406
+ private [core] def denot_= (d : SymDenotation ) = {
404
407
lastDenot = d
408
+ checkedPeriod = Nowhere
409
+ }
405
410
406
411
/** The current denotation of this symbol */
407
412
final def denot (implicit ctx : Context ): SymDenotation = {
408
- var denot = lastDenot
409
- if (! (denot.validFor contains ctx.period)) {
410
- denot = denot.current.asInstanceOf [SymDenotation ]
411
- lastDenot = denot
412
- }
413
- denot
413
+ val lastd = lastDenot
414
+ if (checkedPeriod == ctx.period) lastd
415
+ else computeDenot(lastd)
416
+ }
417
+
418
+ private def computeDenot (lastd : SymDenotation )(implicit ctx : Context ): SymDenotation = {
419
+ val now = ctx.period
420
+ if (lastd.validFor contains now) {
421
+ checkedPeriod = now
422
+ lastd
423
+ } else recomputeDenot(lastd, now)
424
+ }
425
+
426
+ private def recomputeDenot (lastd : SymDenotation , now : Period )(implicit ctx : Context ): SymDenotation = {
427
+ val newd = lastd.current.asInstanceOf [SymDenotation ]
428
+ lastDenot = newd
429
+ checkedPeriod = now
430
+ newd
414
431
}
415
432
416
433
/** The initial denotation of this symbol, without going through `current` */
@@ -631,7 +648,6 @@ object Symbols {
631
648
632
649
@ sharable object NoSymbol extends Symbol (NoCoord , 0 ) {
633
650
denot = NoDenotation
634
-
635
651
override def associatedFile (implicit ctx : Context ): AbstractFile = NoSource .file
636
652
}
637
653
0 commit comments