diff options
author | Martin Odersky <odersky@gmail.com> | 2006-10-30 13:00:41 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2006-10-30 13:00:41 +0000 |
commit | 640ecf38b7125ff0d2c926a9a634593640cd95b1 (patch) | |
tree | 3f5aecd3a80d0ca2c02e3b92079ba0a0a34825b0 /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | f28285cee74e3f5da3bee5bdd18969566b75f736 (diff) | |
download | scala-640ecf38b7125ff0d2c926a9a634593640cd95b1.tar.gz scala-640ecf38b7125ff0d2c926a9a634593640cd95b1.tar.bz2 scala-640ecf38b7125ff0d2c926a9a634593640cd95b1.zip |
added healing for escaping singleton types.
fixed bug 397
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index ff188d4c23..f8461e52ef 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -289,12 +289,28 @@ trait Typers requires Analyzer { assert(tree.tpe != null, tree)//debug apply(tree.tpe) if (badSymbol == NoSymbol) tree + else if (badSymbol.isErroneous) setError(tree) else { - if (!badSymbol.isErroneous) + val tp1 = heal(tree.tpe) + if (tp1 eq tree.tpe) { error(tree.pos, - (if (badSymbol.hasFlag(PRIVATE)) "private " else "") + badSymbol + - " escapes its defining scope as part of type "+tree.tpe) - setError(tree) + (if (badSymbol hasFlag PRIVATE) "private " else "") + badSymbol + + " escapes its defining scope as part of type "+tree.tpe) + setError(tree) + } else + check(owner, scope, tree setType tp1) + } + } + + object heal extends TypeMap { + def apply(tp: Type): Type = tp match { + case SingleType(pre, sym) => + if ((variance == 1) && (pre contains badSymbol)) { + val tp1 = tp.widen + if (tp1 contains badSymbol) tp else tp1 + } else tp + case _ => + mapOver(tp) } } |