summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2006-10-30 13:00:41 +0000
committerMartin Odersky <odersky@gmail.com>2006-10-30 13:00:41 +0000
commit640ecf38b7125ff0d2c926a9a634593640cd95b1 (patch)
tree3f5aecd3a80d0ca2c02e3b92079ba0a0a34825b0 /src/compiler/scala/tools/nsc/typechecker/Typers.scala
parentf28285cee74e3f5da3bee5bdd18969566b75f736 (diff)
downloadscala-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.scala24
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)
}
}