@@ -398,21 +398,35 @@ object Symbols {
398398
399399 /** The last denotation of this symbol */
400400 private [this ] var lastDenot : SymDenotation = _
401+ private [this ] var checkedPeriod : Period = Nowhere
402+
403+ private [core] def invalidateDenotCache () = { checkedPeriod = Nowhere }
401404
402405 /** Set the denotation of this symbol */
403- private [core] def denot_= (d : SymDenotation ) =
406+ private [core] def denot_= (d : SymDenotation ) = {
404407 lastDenot = d
408+ checkedPeriod = Nowhere
409+ }
405410
406411 /** The current denotation of this symbol */
407412 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)
414416 }
415417
418+ protected def computeDenot (lastd : SymDenotation )(implicit ctx : Context ): SymDenotation = {
419+ val now = ctx.period
420+ checkedPeriod = now
421+ if (lastd.validFor contains now) {
422+ lastd
423+ } else {
424+ val newd = lastd.current.asInstanceOf [SymDenotation ]
425+ lastDenot = newd
426+ newd
427+ }
428+ }
429+
416430 /** The initial denotation of this symbol, without going through `current` */
417431 final def initialDenot (implicit ctx : Context ): SymDenotation =
418432 lastDenot.initial
@@ -631,8 +645,8 @@ object Symbols {
631645
632646 @ sharable object NoSymbol extends Symbol (NoCoord , 0 ) {
633647 denot = NoDenotation
634-
635648 override def associatedFile (implicit ctx : Context ): AbstractFile = NoSource .file
649+ override def computeDenot (lastd : SymDenotation )(implicit ctx : Context ): SymDenotation = NoDenotation
636650 }
637651
638652 implicit class Copier [N <: Name ](sym : Symbol { type ThisName = N })(implicit ctx : Context ) {
0 commit comments