aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/reporting/Diagnostic.scala
diff options
context:
space:
mode:
authorMartin Odersky <odersky@gmail.com>2016-02-17 18:20:07 +0100
committerGuillaume Martres <smarter@ubuntu.com>2016-02-23 00:21:26 +0100
commit9d24583b44e4b59d07d61c5f051c8e9a8a832148 (patch)
tree1bdcbc2cd56f6abcc90296bee26a8efcd5fa4331 /src/dotty/tools/dotc/reporting/Diagnostic.scala
parent11bd355128fb6e0457f70baea235aaba91deb888 (diff)
downloaddotty-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.scala47
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
+}