aboutsummaryrefslogtreecommitdiff
path: root/src/dotty/tools/dotc/reporting/diagnostic/Message.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/dotty/tools/dotc/reporting/diagnostic/Message.scala')
-rw-r--r--src/dotty/tools/dotc/reporting/diagnostic/Message.scala40
1 files changed, 39 insertions, 1 deletions
diff --git a/src/dotty/tools/dotc/reporting/diagnostic/Message.scala b/src/dotty/tools/dotc/reporting/diagnostic/Message.scala
index 125ac2e1c..e365851be 100644
--- a/src/dotty/tools/dotc/reporting/diagnostic/Message.scala
+++ b/src/dotty/tools/dotc/reporting/diagnostic/Message.scala
@@ -3,10 +3,14 @@ package dotc
package reporting
package diagnostic
-import util.{SourcePosition, NoSourcePosition}
+import util.SourcePosition
import core.Contexts.Context
object Message {
+ /** This implicit conversion provides a fallback for error messages that have
+ * not yet been ported to the new scheme. Comment out this `implicit def` to
+ * see where old errors still exist
+ */
implicit def toNoExplanation(str: String): Message =
new NoExplanation(str)
}
@@ -14,43 +18,77 @@ object Message {
abstract class Message(val errorId: String) { self =>
import messages._
+ /** The `msg` contains the diagnostic message e.g:
+ *
+ * > expected: String
+ * > found: Int
+ *
+ * This message wil be placed underneath the position given by the enclosing
+ * `MessageContainer`
+ */
def msg: String
+
+ /** The kind of the error message is something like "Syntax" or "Type
+ * Mismatch"
+ */
def kind: String
+
+ /** The explanation should provide a detailed description of why the error
+ * occurred and use examples from the user's own code to illustrate how to
+ * avoid these errors.
+ */
def explanation: String
+ /** It is possible to map `msg` to add details, this is at the loss of
+ * precision since the type of the resulting `Message` won't be original
+ * extending class
+ *
+ * @return a `Message` with the mapped message
+ */
def mapMsg(f: String => String) = new Message(errorId) {
val msg = f(self.msg)
val kind = self.kind
val explanation = self.explanation
}
+ /** Enclose this message in an `Error` container */
def error(pos: SourcePosition) =
new Error(self, pos, explanation)
+ /** Enclose this message in an `Warning` container */
def warning(pos: SourcePosition) =
new Warning(self, pos, explanation)
+ /** Enclose this message in an `Info` container */
def info(pos: SourcePosition) =
new Info(self, pos, explanation)
+ /** Enclose this message in an `FeatureWarning` container */
def featureWarning(pos: SourcePosition) =
new FeatureWarning(self, pos, explanation)
+ /** Enclose this message in an `UncheckedWarning` container */
def uncheckedWarning(pos: SourcePosition) =
new UncheckedWarning(self, pos, explanation)
+ /** Enclose this message in an `DeprecationWarning` container */
def deprecationWarning(pos: SourcePosition) =
new DeprecationWarning(self, pos, explanation)
+ /** Enclose this message in an `MigrationWarning` container */
def migrationWarning(pos: SourcePosition) =
new MigrationWarning(self, pos, explanation)
}
+/** The fallback `Message` containing no explanation and having no `kind` */
class NoExplanation(val msg: String) extends Message("") {
val explanation = ""
val kind = ""
}
+/** The extractor for `NoExplanation` can be used to check whether any error
+ * lacks an explanation
+ */
object NoExplanation {
def unapply(m: Message): Option[Message] =
if (m.explanation == "") Some(m)