@@ -123,7 +123,9 @@ object Contexts {
123
123
*/
124
124
abstract class Context (val base : ContextBase ) { thiscontext =>
125
125
126
- given Context = this
126
+ protected given Context = this
127
+
128
+ def outer : Context
127
129
128
130
/** All outer contexts, ending in `base.initialCtx` and then `NoContext` */
129
131
def outersIterator : Iterator [Context ] = new Iterator [Context ] {
@@ -132,65 +134,20 @@ object Contexts {
132
134
def next = { val c = current; current = current.outer; c }
133
135
}
134
136
135
- /** The outer context */
136
- private var _outer : Context = _
137
- protected def outer_= (outer : Context ): Unit = _outer = outer
138
- final def outer : Context = _outer
139
-
140
- /** The current context */
141
- private var _period : Period = _
142
- protected def period_= (period : Period ): Unit = {
143
- assert(period.firstPhaseId == period.lastPhaseId, period)
144
- _period = period
145
- }
146
- final def period : Period = _period
147
-
148
- /** The scope nesting level */
149
- private var _mode : Mode = _
150
- protected def mode_= (mode : Mode ): Unit = _mode = mode
151
- final def mode : Mode = _mode
152
-
153
- /** The current owner symbol */
154
- private var _owner : Symbol = _
155
- protected def owner_= (owner : Symbol ): Unit = _owner = owner
156
- final def owner : Symbol = _owner
157
-
158
- /** The current tree */
159
- private var _tree : Tree [? ]= _
160
- protected def tree_= (tree : Tree [? ]): Unit = _tree = tree
161
- final def tree : Tree [? ] = _tree
162
-
163
- /** The current scope */
164
- private var _scope : Scope = _
165
- protected def scope_= (scope : Scope ): Unit = _scope = scope
166
- final def scope : Scope = _scope
167
-
168
- /** The current typerstate */
169
- private var _typerState : TyperState = _
170
- protected def typerState_= (typerState : TyperState ): Unit = _typerState = typerState
171
- final def typerState : TyperState = _typerState
172
-
173
- /** The current bounds in force for type parameters appearing in a GADT */
174
- private var _gadt : GadtConstraint = _
175
- protected def gadt_= (gadt : GadtConstraint ): Unit = _gadt = gadt
176
- final def gadt : GadtConstraint = _gadt
177
-
178
- /** The history of implicit searches that are currently active */
179
- private var _searchHistory : SearchHistory = _
180
- protected def searchHistory_= (searchHistory : SearchHistory ): Unit = _searchHistory = searchHistory
181
- final def searchHistory : SearchHistory = _searchHistory
182
-
183
- /** The current source file */
184
- private var _source : SourceFile = _
185
- protected def source_= (source : SourceFile ): Unit = _source = source
186
- final def source : SourceFile = _source
137
+ def period : Period
138
+ def mode : Mode
139
+ def owner : Symbol
140
+ def tree : Tree [? ]
141
+ def scope : Scope
142
+ def typerState : TyperState
143
+ def gadt : GadtConstraint
144
+ def searchHistory : SearchHistory
145
+ def source : SourceFile
187
146
188
147
/** A map in which more contextual properties can be stored
189
148
* Typically used for attributes that are read and written only in special situations.
190
149
*/
191
- private var _moreProperties : Map [Key [Any ], Any ] = _
192
- protected def moreProperties_= (moreProperties : Map [Key [Any ], Any ]): Unit = _moreProperties = moreProperties
193
- final def moreProperties : Map [Key [Any ], Any ] = _moreProperties
150
+ def moreProperties : Map [Key [Any ], Any ]
194
151
195
152
def property [T ](key : Key [T ]): Option [T ] =
196
153
moreProperties.get(key).asInstanceOf [Option [T ]]
@@ -200,9 +157,7 @@ object Contexts {
200
157
* Access to store entries is much faster than access to properties, and only
201
158
* slightly slower than a normal field access would be.
202
159
*/
203
- private var _store : Store = _
204
- protected def store_= (store : Store ): Unit = _store = store
205
- final def store : Store = _store
160
+ def store : Store
206
161
207
162
/** The compiler callback implementation, or null if no callback will be called. */
208
163
def compilerCallback : CompilerCallback = store(compilerCallbackLoc)
@@ -240,7 +195,7 @@ object Contexts {
240
195
def typeAssigner : TypeAssigner = store(typeAssignerLoc)
241
196
242
197
/** The new implicit references that are introduced by this scope */
243
- protected var implicitsCache : ContextualImplicits | Null = null
198
+ private var implicitsCache : ContextualImplicits | Null = null
244
199
def implicits : ContextualImplicits = {
245
200
if (implicitsCache == null )
246
201
implicitsCache = {
@@ -305,7 +260,6 @@ object Contexts {
305
260
/** AbstractFile with given path, memoized */
306
261
def getFile (name : String ): AbstractFile = getFile(name.toTermName)
307
262
308
-
309
263
private var related : SimpleIdentityMap [Phase | SourceFile , Context ] | Null = null
310
264
311
265
private def lookup (key : Phase | SourceFile ): Context | Null =
@@ -491,30 +445,6 @@ object Contexts {
491
445
/** Is the explicit nulls option set? */
492
446
def explicitNulls : Boolean = base.settings.YexplicitNulls .value
493
447
494
- /** Initialize all context fields, except typerState, which has to be set separately
495
- * @param outer The outer context
496
- * @param origin The context from which fields are copied
497
- */
498
- private [Contexts ] def init (outer : Context , origin : Context ): this .type = {
499
- _outer = outer
500
- _period = origin.period
501
- _mode = origin.mode
502
- _owner = origin.owner
503
- _tree = origin.tree
504
- _scope = origin.scope
505
- _gadt = origin.gadt
506
- _searchHistory = origin.searchHistory
507
- _source = origin.source
508
- _moreProperties = origin.moreProperties
509
- _store = origin.store
510
- this
511
- }
512
-
513
- def reuseIn (outer : Context ): this .type =
514
- implicitsCache = null
515
- related = null
516
- init(outer, outer)
517
-
518
448
/** A fresh clone of this context embedded in this context. */
519
449
def fresh : FreshContext = freshOver(this )
520
450
@@ -565,6 +495,13 @@ object Contexts {
565
495
def uniques : util.WeakHashSet [Type ] = base.uniques
566
496
567
497
def initialize ()(using Context ): Unit = base.initialize()
498
+
499
+ protected def resetCaches (): Unit =
500
+ implicitsCache = null
501
+ related = null
502
+
503
+ /** Reuse this context as a fresh context nested inside `outer` */
504
+ def reuseIn (outer : Context ): this .type
568
505
}
569
506
570
507
/** A condensed context provides only a small memory footprint over
@@ -579,6 +516,81 @@ object Contexts {
579
516
* of its attributes using the with... methods.
580
517
*/
581
518
class FreshContext (base : ContextBase ) extends Context (base) {
519
+
520
+ private var _outer : Context = _
521
+ protected def outer_= (outer : Context ): Unit = _outer = outer
522
+ def outer : Context = _outer
523
+
524
+ private var _period : Period = _
525
+ protected def period_= (period : Period ): Unit =
526
+ assert(period.firstPhaseId == period.lastPhaseId, period)
527
+ _period = period
528
+ final def period : Period = _period
529
+
530
+ private var _mode : Mode = _
531
+ protected def mode_= (mode : Mode ): Unit = _mode = mode
532
+ final def mode : Mode = _mode
533
+
534
+ private var _owner : Symbol = _
535
+ protected def owner_= (owner : Symbol ): Unit = _owner = owner
536
+ final def owner : Symbol = _owner
537
+
538
+ /** The current tree */
539
+ private var _tree : Tree [? ]= _
540
+ protected def tree_= (tree : Tree [? ]): Unit = _tree = tree
541
+ final def tree : Tree [? ] = _tree
542
+
543
+ private var _scope : Scope = _
544
+ protected def scope_= (scope : Scope ): Unit = _scope = scope
545
+ final def scope : Scope = _scope
546
+
547
+ private var _typerState : TyperState = _
548
+ protected def typerState_= (typerState : TyperState ): Unit = _typerState = typerState
549
+ final def typerState : TyperState = _typerState
550
+
551
+ private var _gadt : GadtConstraint = _
552
+ protected def gadt_= (gadt : GadtConstraint ): Unit = _gadt = gadt
553
+ final def gadt : GadtConstraint = _gadt
554
+
555
+ private var _searchHistory : SearchHistory = _
556
+ protected def searchHistory_= (searchHistory : SearchHistory ): Unit = _searchHistory = searchHistory
557
+ final def searchHistory : SearchHistory = _searchHistory
558
+
559
+ private var _source : SourceFile = _
560
+ protected def source_= (source : SourceFile ): Unit = _source = source
561
+ final def source : SourceFile = _source
562
+
563
+ private var _moreProperties : Map [Key [Any ], Any ] = _
564
+ protected def moreProperties_= (moreProperties : Map [Key [Any ], Any ]): Unit = _moreProperties = moreProperties
565
+ final def moreProperties : Map [Key [Any ], Any ] = _moreProperties
566
+
567
+ private var _store : Store = _
568
+ protected def store_= (store : Store ): Unit = _store = store
569
+ final def store : Store = _store
570
+
571
+ /** Initialize all context fields, except typerState, which has to be set separately
572
+ * @param outer The outer context
573
+ * @param origin The context from which fields are copied
574
+ */
575
+ private [Contexts ] def init (outer : Context , origin : Context ): this .type = {
576
+ _outer = outer
577
+ _period = origin.period
578
+ _mode = origin.mode
579
+ _owner = origin.owner
580
+ _tree = origin.tree
581
+ _scope = origin.scope
582
+ _gadt = origin.gadt
583
+ _searchHistory = origin.searchHistory
584
+ _source = origin.source
585
+ _moreProperties = origin.moreProperties
586
+ _store = origin.store
587
+ this
588
+ }
589
+
590
+ def reuseIn (outer : Context ): this .type =
591
+ resetCaches()
592
+ init(outer, outer)
593
+
582
594
def setPeriod (period : Period ): this .type =
583
595
util.Stats .record(" Context.setPeriod" )
584
596
this .period = period
@@ -627,7 +639,6 @@ object Contexts {
627
639
util.Stats .record(" Context.setStore" )
628
640
this .store = store
629
641
this
630
- def setImplicits (implicits : ContextualImplicits ): this .type = { this .implicitsCache = implicits; this }
631
642
632
643
def setCompilationUnit (compilationUnit : CompilationUnit ): this .type = {
633
644
setSource(compilationUnit.source)
@@ -817,7 +828,7 @@ object Contexts {
817
828
gadt = GadtConstraint .empty
818
829
}
819
830
820
- @ sharable object NoContext extends Context ((null : ContextBase | Null ).uncheckedNN) {
831
+ @ sharable val NoContext : Context = new FreshContext ((null : ContextBase | Null ).uncheckedNN) {
821
832
source = NoSource
822
833
override val implicits : ContextualImplicits = new ContextualImplicits (Nil , null , false )(this : @ unchecked)
823
834
}
0 commit comments