aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/transform/TreeChecker.scala
diff options
context:
space:
mode:
authorDmitry Petrashko <dmitry.petrashko@gmail.com>2014-11-03 14:28:17 +0100
committerDmitry Petrashko <dmitry.petrashko@gmail.com>2014-11-22 20:10:20 +0100
commite935eaa9220eff300ecca891d41c0c421501faf4 (patch)
treed8abc506acf4debc04ee35142fd9d0cbd6faf784 /src/dotty/tools/dotc/transform/TreeChecker.scala
parent5a15ee9fde347787227a3fa8e31e17f32fd8a5bb (diff)
downloaddotty-e935eaa9220eff300ecca891d41c0c421501faf4.tar.gz
dotty-e935eaa9220eff300ecca891d41c0c421501faf4.tar.bz2
dotty-e935eaa9220eff300ecca891d41c0c421501faf4.zip
#204 check for global uniqueness of definitions.
Check now fails after erasure. Should become error after fixed.
Diffstat (limited to 'src/dotty/tools/dotc/transform/TreeChecker.scala')
-rw-r--r--src/dotty/tools/dotc/transform/TreeChecker.scala29
1 files changed, 19 insertions, 10 deletions
diff --git a/src/dotty/tools/dotc/transform/TreeChecker.scala b/src/dotty/tools/dotc/transform/TreeChecker.scala
index dd84cd53a..baaadb53f 100644
--- a/src/dotty/tools/dotc/transform/TreeChecker.scala
+++ b/src/dotty/tools/dotc/transform/TreeChecker.scala
@@ -67,19 +67,28 @@ class TreeChecker {
class Checker(phasesToCheck: Seq[Phase]) extends ReTyper {
- val definedSyms = new mutable.HashSet[Symbol]
-
- def withDefinedSym[T](tree: untpd.Tree)(op: => T)(implicit ctx: Context): T = {
- if (tree.isDef) {
- assert(!definedSyms.contains(tree.symbol), i"doubly defined symbol: ${tree.symbol}in $tree")
- definedSyms += tree.symbol
+ val nowDefinedSyms = new mutable.HashSet[Symbol]
+ val everDefinedSyms = new mutable.HashMap[Symbol, Tree]
+
+ def withDefinedSym[T](tree: untpd.Tree)(op: => T)(implicit ctx: Context): T = tree match {
+ case tree: DefTree =>
+ val sym = tree.symbol
+ everDefinedSyms.get(sym) match {
+ case Some(t) =>
+ if(t ne tree)
+ ctx.warning(i"symbol ${tree.symbol} is defined at least twice in different parts of AST")
+ // should become an error
+ case None =>
+ everDefinedSyms(sym) = tree
+ }
+ assert(!nowDefinedSyms.contains(tree.symbol), i"doubly defined symbol: ${tree.symbol}in $tree")
+ nowDefinedSyms += tree.symbol
//println(i"defined: ${tree.symbol}")
val res = op
- definedSyms -= tree.symbol
+ nowDefinedSyms -= tree.symbol
//println(i"undefined: ${tree.symbol}")
res
- }
- else op
+ case _ => op
}
def withDefinedSyms[T](trees: List[untpd.Tree])(op: => T)(implicit ctx: Context) =
@@ -90,7 +99,7 @@ class TreeChecker {
def assertDefined(tree: untpd.Tree)(implicit ctx: Context) =
if (tree.symbol.maybeOwner.isTerm)
- assert(definedSyms contains tree.symbol, i"undefined symbol ${tree.symbol}")
+ assert(nowDefinedSyms contains tree.symbol, i"undefined symbol ${tree.symbol}")
override def typedUnadapted(tree: untpd.Tree, pt: Type)(implicit ctx: Context): tpd.Tree = {
val res = tree match {