Skip to content

Commit f236282

Browse files
committed
#204 check for global uniqueness of definitions.
Check now fails after erasure. Should become error after fixed.
1 parent 95a71de commit f236282

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

src/dotty/tools/dotc/transform/TreeChecker.scala

+19-10
Original file line numberDiff line numberDiff line change
@@ -65,19 +65,28 @@ class TreeChecker {
6565

6666
class Checker(phasesToCheck: Seq[Phase]) extends ReTyper {
6767

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
7484
//println(i"defined: ${tree.symbol}")
7585
val res = op
76-
definedSyms -= tree.symbol
86+
nowDefinedSyms -= tree.symbol
7787
//println(i"undefined: ${tree.symbol}")
7888
res
79-
}
80-
else op
89+
case _ => op
8190
}
8291

8392
def withDefinedSyms[T](trees: List[untpd.Tree])(op: => T)(implicit ctx: Context) =
@@ -88,7 +97,7 @@ class TreeChecker {
8897

8998
def assertDefined(tree: untpd.Tree)(implicit ctx: Context) =
9099
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}")
92101

93102
override def typedUnadapted(tree: untpd.Tree, pt: Type)(implicit ctx: Context): tpd.Tree = {
94103
val res = tree match {

0 commit comments

Comments
 (0)