use crate::pt;
use crate::pt::Loc;
#[derive(Debug, Eq, Hash, PartialOrd, Ord, PartialEq)]
pub enum Level {
Debug,
Info,
Warning,
Error,
}
impl Level {
pub fn to_string(&self) -> &'static str {
match self {
Level::Debug => "debug",
Level::Info => "info",
Level::Warning => "warning",
Level::Error => "error",
}
}
}
#[derive(Debug, Eq, Hash, PartialOrd, Ord, PartialEq)]
pub enum ErrorType {
None,
ParserError,
SyntaxError,
DeclarationError,
TypeError,
Warning,
}
#[derive(Debug, Eq, Hash, PartialOrd, Ord, PartialEq)]
pub struct Note {
pub pos: pt::Loc,
pub message: String,
}
#[derive(Debug, Eq, Hash, PartialOrd, Ord, PartialEq)]
pub struct Diagnostic {
pub level: Level,
pub ty: ErrorType,
pub pos: Option<pt::Loc>,
pub message: String,
pub notes: Vec<Note>,
}
impl Diagnostic {
pub fn debug(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Debug,
ty: ErrorType::None,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn info(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Info,
ty: ErrorType::None,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn parser_error(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::ParserError,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn error(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::SyntaxError,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn decl_error(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::DeclarationError,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn type_error(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::TypeError,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn warning(pos: Loc, message: String) -> Self {
Diagnostic {
level: Level::Warning,
ty: ErrorType::Warning,
pos: Some(pos),
message,
notes: Vec::new(),
}
}
pub fn warning_with_note(pos: Loc, message: String, note_pos: Loc, note: String) -> Self {
Diagnostic {
level: Level::Warning,
ty: ErrorType::Warning,
pos: Some(pos),
message,
notes: vec![Note {
pos: note_pos,
message: note,
}],
}
}
pub fn warning_with_notes(pos: Loc, message: String, notes: Vec<Note>) -> Self {
Diagnostic {
level: Level::Warning,
ty: ErrorType::Warning,
pos: Some(pos),
message,
notes,
}
}
pub fn error_with_note(pos: Loc, message: String, note_pos: Loc, note: String) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::None,
pos: Some(pos),
message,
notes: vec![Note {
pos: note_pos,
message: note,
}],
}
}
pub fn error_with_notes(pos: Loc, message: String, notes: Vec<Note>) -> Self {
Diagnostic {
level: Level::Error,
ty: ErrorType::None,
pos: Some(pos),
message,
notes,
}
}
}