From d13fa248d5c53b165ab4f927099d0e25303ef39a Mon Sep 17 00:00:00 2001 From: Martin Odersky Date: Thu, 10 Oct 2013 12:31:59 +0200 Subject: Added disambiguation for reported messages. Added method disambiguate which disambiguates any string-returning operation. Disambiguation is done by adding owners and qualifiers each symbol has a unique string representation. --- src/dotty/tools/dotc/core/TypeComparer.scala | 11 +++++++---- src/dotty/tools/dotc/typer/ErrorReporting.scala | 3 ++- 2 files changed, 9 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/dotty/tools/dotc/core/TypeComparer.scala b/src/dotty/tools/dotc/core/TypeComparer.scala index c54312e01..46eabb606 100644 --- a/src/dotty/tools/dotc/core/TypeComparer.scala +++ b/src/dotty/tools/dotc/core/TypeComparer.scala @@ -6,6 +6,7 @@ import Types._, Contexts._, Symbols._, Flags._, Names._ import Decorators.sourcePos import StdNames.{nme, tpnme} import collection.mutable +import printing.Disambiguation.disambiguated import util.SimpleMap /** Provides methods to compare types. @@ -681,7 +682,10 @@ class TypeComparer(initctx: Context) extends DotClass { */ private def andConflict(tp1: Type, tp2: Type): Type = { val winner = if (isAsGood(tp2, tp1) && !isAsGood(tp1, tp2)) tp2 else tp1 - ctx.warning(s"${mergeErrorMsg(tp1, tp2)} as members of one type; keeping only ${showType(winner)}", ctx.tree.pos) + def msg = disambiguated { implicit ctx => + s"${mergeErrorMsg(tp1, tp2)} as members of one type; keeping only ${showType(winner)}" + } + ctx.warning(msg, ctx.tree.pos) winner } @@ -698,16 +702,15 @@ class TypeComparer(initctx: Context) extends DotClass { }.toList /** Show type, handling type types better than the default */ - private def showType(tp: Type) = tp match { + private def showType(tp: Type)(implicit ctx: Context) = tp match { case ClassInfo(_, cls, _, _, _) => cls.showLocated case bounds: TypeBounds => "type bounds" + bounds.show case _ => tp.show } /** The error message kernel for a merge conflict */ - private def mergeErrorMsg(tp1: Type, tp2: Type) = { + private def mergeErrorMsg(tp1: Type, tp2: Type)(implicit ctx: Context) = s"cannot merge ${showType(tp1)} with ${showType(tp2)}" - } /** A comparison function to pick a winner in case of a merge conflict */ private def isAsGood(tp1: Type, tp2: Type): Boolean = tp1 match { diff --git a/src/dotty/tools/dotc/typer/ErrorReporting.scala b/src/dotty/tools/dotc/typer/ErrorReporting.scala index 314ef9899..16f994e90 100644 --- a/src/dotty/tools/dotc/typer/ErrorReporting.scala +++ b/src/dotty/tools/dotc/typer/ErrorReporting.scala @@ -9,6 +9,7 @@ import Types._, Inferencing._, Contexts._, Decorators._, Denotations._, Symbols. import Applications._, Implicits._ import util.Positions._ import printing.Showable +import printing.Disambiguation.disambiguated import reporting.Reporter.SuppressedMessage object ErrorReporting { @@ -67,7 +68,7 @@ object ErrorReporting { errorTree(tree, typeMismatchStr(tree.tpe, pt) + implicitFailure.postscript) } - def typeMismatchStr(found: Type, expected: Type) = { + def typeMismatchStr(found: Type, expected: Type) = disambiguated { implicit ctx => val (typerStateStr, explanationStr) = if (ctx.settings.explaintypes.value) { val nestedCtx = ctx.fresh.withTypeComparerFn(new ExplainingTypeComparer(_)) -- cgit v1.2.3