summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/typechecker/Typers.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2007-03-30 15:18:30 +0000
committerMartin Odersky <odersky@gmail.com>2007-03-30 15:18:30 +0000
commitb1a3187949f3809e337342f057c0384303a03af2 (patch)
treed2a8b9d4d045aa7d1c23a6603b68e1eb695cd02f /src/compiler/scala/tools/nsc/typechecker/Typers.scala
parent098db0fd0bb6ad0ddf978b5fc719fa6a8c2954f0 (diff)
downloadscala-b1a3187949f3809e337342f057c0384303a03af2.tar.gz
scala-b1a3187949f3809e337342f057c0384303a03af2.tar.bz2
scala-b1a3187949f3809e337342f057c0384303a03af2.zip
fixed bug1017
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala41
1 files changed, 27 insertions, 14 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index aff947c210..630a5253ef 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1695,21 +1695,34 @@ trait Typers requires Analyzer {
case t: Tree =>
t
case ex: TypeError =>
- val Select(qual, name) = fun
- val args1 = tryTypedArgs(args, ex)
- val qual1 =
- if ((args1 ne null) && !pt.isError) {
- def templateArgType(arg: Tree) =
- new BoundedWildcardType(mkTypeBounds(arg.tpe, AnyClass.tpe))
- adaptToMember(qual, name, MethodType(args1 map templateArgType, pt))
- } else qual
- if (qual1 ne qual) {
- val tree1 = Apply(Select(qual1, name) setPos fun.pos, args1) setPos tree.pos
- typed1(tree1, mode | SNDTRYmode, pt)
- } else {
- reportTypeError(tree.pos, ex)
- setError(tree)
+ def errorInResult(tree: Tree): boolean = tree.pos == ex.pos || {
+ tree match {
+ case Block(_, r) => errorInResult(r)
+ case Match(_, cases) => cases exists errorInResult
+ case CaseDef(_, _, r) => errorInResult(r)
+ case Annotated(_, r) => errorInResult(r)
+ case If(_, t, e) => errorInResult(t) || errorInResult(e)
+ case Try(b, catches, _) => errorInResult(b) || (catches exists errorInResult)
+ case Typed(r, Function(List(), EmptyTree)) => errorInResult(r)
+ case _ => false
+ }
}
+ if (errorInResult(fun) || (args exists errorInResult)) {
+ val Select(qual, name) = fun
+ val args1 = tryTypedArgs(args, ex)
+ val qual1 =
+ if ((args1 ne null) && !pt.isError) {
+ def templateArgType(arg: Tree) =
+ new BoundedWildcardType(mkTypeBounds(arg.tpe, AnyClass.tpe))
+ adaptToMember(qual, name, MethodType(args1 map templateArgType, pt))
+ } else qual
+ if (qual1 ne qual) {
+ val tree1 = Apply(Select(qual1, name) setPos fun.pos, args1) setPos tree.pos
+ return typed1(tree1, mode | SNDTRYmode, pt)
+ }
+ }
+ reportTypeError(tree.pos, ex)
+ setError(tree)
}
def convertToAssignment(fun: Tree, qual: Tree, name: Name, args: List[Tree], ex: TypeError): Tree = {