File tree Expand file tree Collapse file tree 4 files changed +58
-1
lines changed
compiler/src/dotty/tools/dotc Expand file tree Collapse file tree 4 files changed +58
-1
lines changed Original file line number Diff line number Diff line change @@ -105,6 +105,10 @@ object Phases {
105
105
prevPhases += phase.phaseName
106
106
phase
107
107
}
108
+
109
+ // synchronize symbol.defTree if necessary
110
+ if phaseToAdd.synchronizeDefTree then
111
+ fusedPhases += new SyncDefTree
108
112
fusedPhases += phaseToAdd
109
113
val shouldAddYCheck = YCheckAfter .containsPhase(phaseToAdd) || YCheckAll
110
114
if (shouldAddYCheck) {
@@ -290,9 +294,16 @@ object Phases {
290
294
/** If set, implicit search is enabled */
291
295
def allowsImplicitSearch : Boolean = false
292
296
293
- /** List of names of phases that should precede this phase */
297
+ /** List of names of phases that should precede this phase */
294
298
def runsAfter : Set [String ] = Set .empty
295
299
300
+ /** Whether this phase require synchronization of symbol.defTree?
301
+ *
302
+ * The phase `DefTreeSync` will be inserted immediately before this phase
303
+ * if `synchronizeDefTree == true`.
304
+ */
305
+ def synchronizeDefTree : Boolean = false
306
+
296
307
/** @pre `isRunnable` returns true */
297
308
def run (using Context ): Unit
298
309
Original file line number Diff line number Diff line change @@ -144,6 +144,8 @@ class MegaPhase(val miniPhases: Array[MiniPhase]) extends Phase {
144
144
private var relaxedTypingCache : Boolean = _
145
145
private var relaxedTypingKnown = false
146
146
147
+ override val synchronizeDefTree : Boolean = miniPhases.exists(_.synchronizeDefTree)
148
+
147
149
override final def relaxedTyping : Boolean = {
148
150
if (! relaxedTypingKnown) {
149
151
relaxedTypingCache = miniPhases.exists(_.relaxedTypingInGroup)
Original file line number Diff line number Diff line change
1
+ package dotty .tools .dotc
2
+ package transform
3
+
4
+
5
+ import dotty .tools .dotc ._
6
+ import ast .tpd
7
+ import tpd ._
8
+
9
+ import dotty .tools .dotc .core ._
10
+ import Contexts ._
11
+ import Types ._
12
+ import Symbols ._
13
+
14
+ import dotty .tools .dotc .transform ._
15
+ import MegaPhase ._
16
+
17
+
18
+ /** Synchronize the tree definition associated with symbols
19
+ *
20
+ * This phase will be automatically inserted before a phase if
21
+ * `phase.synchronizeDefTree == true`.
22
+ *
23
+ */
24
+ class SyncDefTree extends MiniPhase {
25
+
26
+ val phaseName = " syncDefTree"
27
+
28
+ override def transformTypeDef (tree : TypeDef )(using Context ): Tree = {
29
+ tree.symbol.defTree = tree
30
+ tree
31
+ }
32
+
33
+ override def transformValDef (tree : ValDef )(using Context ): Tree = {
34
+ tree.symbol.defTree = tree
35
+ tree
36
+ }
37
+
38
+ override def transformDefDef (tree : DefDef )(using Context ): Tree = {
39
+ tree.symbol.defTree = tree
40
+ tree
41
+ }
42
+ }
Original file line number Diff line number Diff line change @@ -30,6 +30,8 @@ class Checker extends MiniPhase {
30
30
override def isEnabled (using Context ): Boolean =
31
31
super .isEnabled && ctx.settings.YcheckInit .value
32
32
33
+ override def synchronizeDefTree : Boolean = true
34
+
33
35
override def transformTypeDef (tree : TypeDef )(using Context ): tpd.Tree = {
34
36
if (! tree.isClassDef) return tree
35
37
You can’t perform that action at this time.
0 commit comments