Skip to content

Commit 1d66a8d

Browse files
committed
scala#204 check for global uniqueness of definitions.
Check now fails after erasure. Should become error after fixed.
1 parent 81b9969 commit 1d66a8d

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

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

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,28 @@ class TreeChecker {
6767

6868
class Checker(phasesToCheck: Seq[Phase]) extends ReTyper {
6969

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
7686
//println(i"defined: ${tree.symbol}")
7787
val res = op
78-
definedSyms -= tree.symbol
88+
nowDefinedSyms -= tree.symbol
7989
//println(i"undefined: ${tree.symbol}")
8090
res
81-
}
82-
else op
91+
case _ => op
8392
}
8493

8594
def withDefinedSyms[T](trees: List[untpd.Tree])(op: => T)(implicit ctx: Context) =
@@ -90,7 +99,7 @@ class TreeChecker {
9099

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

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

0 commit comments

Comments
 (0)