diff options
author | Martin Odersky <odersky@gmail.com> | 2016-02-17 18:20:07 +0100 |
---|---|---|
committer | Guillaume Martres <smarter@ubuntu.com> | 2016-02-23 00:21:26 +0100 |
commit | 9d24583b44e4b59d07d61c5f051c8e9a8a832148 (patch) | |
tree | 1bdcbc2cd56f6abcc90296bee26a8efcd5fa4331 /src/dotty/tools | |
parent | 11bd355128fb6e0457f70baea235aaba91deb888 (diff) | |
download | dotty-9d24583b44e4b59d07d61c5f051c8e9a8a832148.tar.gz dotty-9d24583b44e4b59d07d61c5f051c8e9a8a832148.tar.bz2 dotty-9d24583b44e4b59d07d61c5f051c8e9a8a832148.zip |
Refactor Diagnostic
Break it out from Reporter and eliminate all dependencies
to Context. This is done so that Diagnostics can be part
of a public and minimal compiler API.
Diffstat (limited to 'src/dotty/tools')
-rw-r--r-- | src/dotty/tools/dotc/reporting/ConsoleReporter.scala | 5 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/Diagnostic.scala | 47 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/Reporter.scala | 38 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/StoreReporter.scala | 2 | ||||
-rw-r--r-- | src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala | 1 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/ErrorReporting.scala | 11 | ||||
-rw-r--r-- | src/dotty/tools/dotc/typer/Inferencing.scala | 1 |
7 files changed, 56 insertions, 49 deletions
diff --git a/src/dotty/tools/dotc/reporting/ConsoleReporter.scala b/src/dotty/tools/dotc/reporting/ConsoleReporter.scala index 8f1fbf797..dcfbd717d 100644 --- a/src/dotty/tools/dotc/reporting/ConsoleReporter.scala +++ b/src/dotty/tools/dotc/reporting/ConsoleReporter.scala @@ -41,7 +41,10 @@ class ConsoleReporter( } override def doReport(d: Diagnostic)(implicit ctx: Context): Boolean = { - val issue = !(d.isSuppressed && hasErrors) + val issue = + !d.isNonSensical || + !hasErrors || // if there are no errors yet, report even if diagnostic is non-sensical + ctx.settings.YshowSuppressedErrors.value if (issue) d match { case d: Error => printMessageAndPos(s"error: ${d.msg}", d.pos) diff --git a/src/dotty/tools/dotc/reporting/Diagnostic.scala b/src/dotty/tools/dotc/reporting/Diagnostic.scala new file mode 100644 index 000000000..c57be3d26 --- /dev/null +++ b/src/dotty/tools/dotc/reporting/Diagnostic.scala @@ -0,0 +1,47 @@ +package dotty.tools +package dotc +package reporting + +import util.SourcePosition + +object Diagnostic { + + // Error levels + val ERROR = 2 + val WARNING = 1 + val INFO = 0 + + val nonSensicalStartTag = "<nonsensical>" + val nonSensicalEndTag = "</nonsensical>" +} + +class Diagnostic(msgFn: => String, val pos: SourcePosition, val level: Int) extends Exception { + import Diagnostic._ + private var myMsg: String = null + private var myIsNonSensical: Boolean = false + + /** The message to report */ + def msg: String = { + if (myMsg == null) { + myMsg = msgFn + if (myMsg.contains(nonSensicalStartTag)) { + myIsNonSensical = true + // myMsg might be composed of several d"..." invocations -> nested nonsensical tags possible + myMsg = myMsg.replaceAllLiterally(nonSensicalStartTag, "").replaceAllLiterally(nonSensicalEndTag, "") + } + } + myMsg + } + + /** A message is non-sensical if it contains references to <nonsensical> tags. + * Such tags are inserted by the error diagnostic framework if a message + * contains references to internally generated error types. Normally we + * want to suppress error messages referring to types like this because + * they look weird and are normally follow-up errors to something that + * was diagnosed before. + */ + def isNonSensical = { msg; myIsNonSensical } + + override def toString = s"$getClass at $pos: $msg" + override def getMessage() = msg +} diff --git a/src/dotty/tools/dotc/reporting/Reporter.scala b/src/dotty/tools/dotc/reporting/Reporter.scala index 272b1880f..95c6d7ae6 100644 --- a/src/dotty/tools/dotc/reporting/Reporter.scala +++ b/src/dotty/tools/dotc/reporting/Reporter.scala @@ -10,46 +10,10 @@ import collection.mutable import config.Settings.Setting import config.Printers import java.lang.System.currentTimeMillis -import typer.ErrorReporting.DiagnosticString import typer.Mode +import Diagnostic.{ERROR, WARNING, INFO} object Reporter { - - private val ERROR = 2 - private val WARNING = 1 - private val INFO = 0 - - class Diagnostic(msgFn: => String, val pos: SourcePosition, val level: Int) extends Exception { - import DiagnosticString._ - - private var myMsg: String = null - private var myIsNonSensical: Boolean = false - - /** The message to report */ - def msg: String = { - if (myMsg == null) { - myMsg = msgFn - if (myMsg.contains(nonSensicalStartTag)) { - myIsNonSensical = true - // myMsg might be composed of several d"..." invocations -> nested nonsensical tags possible - myMsg = myMsg.replaceAllLiterally(nonSensicalStartTag, "").replaceAllLiterally(nonSensicalEndTag, "") - } - } - myMsg - } - - /** Report in current reporter */ - def report(implicit ctx: Context) = ctx.reporter.report(this) - - def isNonSensical = { msg; myIsNonSensical } - def isSuppressed(implicit ctx: Context): Boolean = !ctx.settings.YshowSuppressedErrors.value && isNonSensical - - override def toString = s"$getClass at $pos: $msg" - override def getMessage() = msg - - def checkingStr: String = msgFn - } - class Error(msgFn: => String, pos: SourcePosition) extends Diagnostic(msgFn, pos, ERROR) class Warning(msgFn: => String, pos: SourcePosition) extends Diagnostic(msgFn, pos, WARNING) class Info(msgFn: => String, pos: SourcePosition) extends Diagnostic(msgFn, pos, INFO) diff --git a/src/dotty/tools/dotc/reporting/StoreReporter.scala b/src/dotty/tools/dotc/reporting/StoreReporter.scala index 8209839eb..53f03f1fe 100644 --- a/src/dotty/tools/dotc/reporting/StoreReporter.scala +++ b/src/dotty/tools/dotc/reporting/StoreReporter.scala @@ -4,7 +4,7 @@ package reporting import core.Contexts.Context import collection.mutable -import Reporter.{Diagnostic, Error, Warning} +import Reporter.{Error, Warning} import config.Printers._ /** diff --git a/src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala b/src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala index c1f240a23..32554e6b6 100644 --- a/src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala +++ b/src/dotty/tools/dotc/reporting/UniqueMessagePositions.scala @@ -4,7 +4,6 @@ package reporting import scala.collection.mutable import util.{SourcePosition, SourceFile} -import Reporter.Diagnostic import core.Contexts.Context /** diff --git a/src/dotty/tools/dotc/typer/ErrorReporting.scala b/src/dotty/tools/dotc/typer/ErrorReporting.scala index b3089c99c..d6a87acf6 100644 --- a/src/dotty/tools/dotc/typer/ErrorReporting.scala +++ b/src/dotty/tools/dotc/typer/ErrorReporting.scala @@ -8,6 +8,7 @@ import Trees._ import Types._, ProtoTypes._, Contexts._, Decorators._, Denotations._, Symbols._ import Applications._, Implicits._, Flags._ import util.Positions._ +import reporting.Diagnostic import printing.Showable import printing.Disambiguation.disambiguated @@ -127,7 +128,6 @@ object ErrorReporting { * message composition methods, this is crucial. */ implicit class DiagnosticString(val sc: StringContext) extends AnyVal { - import DiagnosticString._ def d(args: Any*)(implicit ctx: Context): String = { def isSensical(arg: Any): Boolean = arg match { case l: Seq[_] => l.forall(isSensical(_)) @@ -139,13 +139,8 @@ object ErrorReporting { } val s = new StringInterpolators(sc).i(args : _*) - if (args.forall(isSensical(_))) s else nonSensicalStartTag + s + nonSensicalEndTag + if (args.forall(isSensical(_))) s + else Diagnostic.nonSensicalStartTag + s + Diagnostic.nonSensicalEndTag } } - - object DiagnosticString { - final val nonSensicalStartTag = "<nonsensical>" - final val nonSensicalEndTag = "</nonsensical>" - } - } diff --git a/src/dotty/tools/dotc/typer/Inferencing.scala b/src/dotty/tools/dotc/typer/Inferencing.scala index 9717b5625..99e8cd150 100644 --- a/src/dotty/tools/dotc/typer/Inferencing.scala +++ b/src/dotty/tools/dotc/typer/Inferencing.scala @@ -15,7 +15,6 @@ import util.{Stats, SimpleMap} import util.common._ import Decorators._ import Uniques._ -import ErrorReporting.{errorType, DiagnosticString} import config.Printers._ import annotation.tailrec import collection.mutable |