diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-04-09 21:47:05 +0200 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-04-21 13:01:01 +0200 |
commit | c9f5ab031a881812149908491217b531b6e29e06 (patch) | |
tree | e9db1c0432956e80e1d87b2b321a8834005564b1 /src/compiler/scala/tools/nsc/typechecker/Implicits.scala | |
parent | ff5dde125a9a88395f52a898a26aabb28f81f5e9 (diff) | |
download | scala-c9f5ab031a881812149908491217b531b6e29e06.tar.gz scala-c9f5ab031a881812149908491217b531b6e29e06.tar.bz2 scala-c9f5ab031a881812149908491217b531b6e29e06.zip |
SI-7345 Encapsulate warning and error buffers in ReportBuffer.
- merge `Context#{buffer, warningBuffer}` into `Context#reportBuffer`.
- only expose immutable copies of the error and warnings buffers
- Introduce a convenience method, `firstError`.
- replace `condBufferFlush` more specific methods to retain or
clear errors by error kind.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Implicits.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Implicits.scala | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala index 85e31347be..f7f6970c14 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala @@ -81,8 +81,8 @@ trait Implicits { val implicitSearchContext = context.makeImplicit(reportAmbiguous) val result = new ImplicitSearch(tree, pt, isView, implicitSearchContext, pos).bestImplicit if (saveAmbiguousDivergent && implicitSearchContext.hasErrors) { - context.updateBuffer(implicitSearchContext.errBuffer.filter(err => err.kind == ErrorKinds.Ambiguous || err.kind == ErrorKinds.Divergent)) - debuglog("update buffer: " + implicitSearchContext.errBuffer) + context.updateBuffer(implicitSearchContext.reportBuffer.errors.filter(err => err.kind == ErrorKinds.Ambiguous || err.kind == ErrorKinds.Divergent)) + debuglog("update buffer: " + implicitSearchContext.reportBuffer.errors) } printInference("[infer implicit] inferred " + result) context.undetparams = context.undetparams filterNot result.subst.from.contains @@ -585,8 +585,9 @@ trait Implicits { case _ => fallback } if (context.hasErrors) { - log("implicit adapt failed: " + context.errBuffer.head.errMsg) - return fail(context.errBuffer.head.errMsg) + val err = context.firstError + log("implicit adapt failed: " + err.errMsg) + return fail(err.errMsg) } if (Statistics.canEnable) Statistics.incCounter(typedImplicits) @@ -609,7 +610,7 @@ trait Implicits { } if (context.hasErrors) - fail("hasMatchingSymbol reported error: " + context.errBuffer.head.errMsg) + fail("hasMatchingSymbol reported error: " + context.firstError.errMsg) else if (isLocal && !hasMatchingSymbol(itree1)) fail("candidate implicit %s is shadowed by %s".format( info.sym.fullLocationString, itree1.symbol.fullLocationString)) @@ -633,7 +634,7 @@ trait Implicits { // #2421: check that we correctly instantiated type parameters outside of the implicit tree: checkBounds(itree2, NoPrefix, NoSymbol, undetParams, targs, "inferred ") if (context.hasErrors) - return fail("type parameters weren't correctly instantiated outside of the implicit tree: " + context.errBuffer.head.errMsg) + return fail("type parameters weren't correctly instantiated outside of the implicit tree: " + context.firstError.errMsg) // filter out failures from type inference, don't want to remove them from undetParams! // we must be conservative in leaving type params in undetparams @@ -669,7 +670,7 @@ trait Implicits { } if (context.hasErrors) - fail("typing TypeApply reported errors for the implicit tree: " + context.errBuffer.head.errMsg) + fail("typing TypeApply reported errors for the implicit tree: " + context.firstError.errMsg) else { val result = new SearchResult(itree2, subst) if (Statistics.canEnable) Statistics.incCounter(foundImplicits) @@ -828,7 +829,7 @@ trait Implicits { case sr if sr.isFailure => // We don't want errors that occur during checking implicit info // to influence the check of further infos. - context.condBufferFlush(_.kind != ErrorKinds.Divergent) + context.reportBuffer.retainErrors(ErrorKinds.Divergent) rankImplicits(is, acc) case newBest => best = newBest @@ -1085,7 +1086,10 @@ trait Implicits { try { val tree1 = typedPos(pos.focus)(arg) - if (context.hasErrors) processMacroExpansionError(context.errBuffer.head.errPos, context.errBuffer.head.errMsg) + if (context.hasErrors) { + val err = context.firstError + processMacroExpansionError(err.errPos, err.errMsg) + } else new SearchResult(tree1, EmptyTreeTypeSubstituter) } catch { case ex: TypeError => |