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