diff options
author | Martin Odersky <odersky@gmail.com> | 2007-03-30 15:18:30 +0000 |
---|---|---|
committer | Martin Odersky <odersky@gmail.com> | 2007-03-30 15:18:30 +0000 |
commit | b1a3187949f3809e337342f057c0384303a03af2 (patch) | |
tree | d2a8b9d4d045aa7d1c23a6603b68e1eb695cd02f /src | |
parent | 098db0fd0bb6ad0ddf978b5fc719fa6a8c2954f0 (diff) | |
download | scala-b1a3187949f3809e337342f057c0384303a03af2.tar.gz scala-b1a3187949f3809e337342f057c0384303a03af2.tar.bz2 scala-b1a3187949f3809e337342f057c0384303a03af2.zip |
fixed bug1017
Diffstat (limited to 'src')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 41 |
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 = { |