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/dotc/reporting/Diagnostic.scala | |
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/dotc/reporting/Diagnostic.scala')
-rw-r--r-- | src/dotty/tools/dotc/reporting/Diagnostic.scala | 47 |
1 files changed, 47 insertions, 0 deletions
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 +} |