@@ -67,19 +67,28 @@ class TreeChecker {
67
67
68
68
class Checker (phasesToCheck : Seq [Phase ]) extends ReTyper {
69
69
70
- val definedSyms = new mutable.HashSet [Symbol ]
71
-
72
- def withDefinedSym [T ](tree : untpd.Tree )(op : => T )(implicit ctx : Context ): T = {
73
- if (tree.isDef) {
74
- assert(! definedSyms.contains(tree.symbol), i " doubly defined symbol: ${tree.symbol}in $tree" )
75
- definedSyms += tree.symbol
70
+ val nowDefinedSyms = new mutable.HashSet [Symbol ]
71
+ val everDefinedSyms = new mutable.HashMap [Symbol , Tree ]
72
+
73
+ def withDefinedSym [T ](tree : untpd.Tree )(op : => T )(implicit ctx : Context ): T = tree match {
74
+ case tree : DefTree =>
75
+ val sym = tree.symbol
76
+ everDefinedSyms.get(sym) match {
77
+ case Some (t) =>
78
+ if (t ne tree)
79
+ ctx.warning(i " symbol ${tree.symbol} is defined at least twice in different parts of AST " )
80
+ // should become an error
81
+ case None =>
82
+ everDefinedSyms(sym) = tree
83
+ }
84
+ assert(! nowDefinedSyms.contains(tree.symbol), i " doubly defined symbol: ${tree.symbol}in $tree" )
85
+ nowDefinedSyms += tree.symbol
76
86
// println(i"defined: ${tree.symbol}")
77
87
val res = op
78
- definedSyms -= tree.symbol
88
+ nowDefinedSyms -= tree.symbol
79
89
// println(i"undefined: ${tree.symbol}")
80
90
res
81
- }
82
- else op
91
+ case _ => op
83
92
}
84
93
85
94
def withDefinedSyms [T ](trees : List [untpd.Tree ])(op : => T )(implicit ctx : Context ) =
@@ -90,7 +99,7 @@ class TreeChecker {
90
99
91
100
def assertDefined (tree : untpd.Tree )(implicit ctx : Context ) =
92
101
if (tree.symbol.maybeOwner.isTerm)
93
- assert(definedSyms contains tree.symbol, i " undefined symbol ${tree.symbol}" )
102
+ assert(nowDefinedSyms contains tree.symbol, i " undefined symbol ${tree.symbol}" )
94
103
95
104
override def typedUnadapted (tree : untpd.Tree , pt : Type )(implicit ctx : Context ): tpd.Tree = {
96
105
val res = tree match {
0 commit comments