2023-10-14 05:40:35 +00:00
|
|
|
//! When things go wrong, we need some error handling.
|
|
|
|
//! There are a few different types of errors in StableMIR:
|
|
|
|
//!
|
|
|
|
//! - [CompilerError]: This represents errors that can be raised when invoking the compiler.
|
|
|
|
//! - [Error]: Generic error that represents the reason why a request that could not be fulfilled.
|
|
|
|
|
2023-10-20 00:06:53 +00:00
|
|
|
use std::convert::From;
|
2023-10-14 05:40:35 +00:00
|
|
|
use std::fmt::{Debug, Display, Formatter};
|
|
|
|
use std::{error, fmt};
|
|
|
|
|
|
|
|
/// An error type used to represent an error that has already been reported by the compiler.
|
|
|
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
|
|
|
pub enum CompilerError<T> {
|
|
|
|
/// Internal compiler error (I.e.: Compiler crashed).
|
|
|
|
ICE,
|
|
|
|
/// Compilation failed.
|
|
|
|
CompilationFailed,
|
|
|
|
/// Compilation was interrupted.
|
|
|
|
Interrupted(T),
|
|
|
|
/// Compilation skipped. This happens when users invoke rustc to retrieve information such as
|
|
|
|
/// --version.
|
|
|
|
Skipped,
|
|
|
|
}
|
|
|
|
|
|
|
|
/// A generic error to represent an API request that cannot be fulfilled.
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct Error(String);
|
|
|
|
|
|
|
|
impl Error {
|
|
|
|
pub(crate) fn new(msg: String) -> Self {
|
|
|
|
Self(msg)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-20 00:06:53 +00:00
|
|
|
impl From<&str> for Error {
|
|
|
|
fn from(value: &str) -> Self {
|
|
|
|
Self(value.into())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-10-14 05:40:35 +00:00
|
|
|
impl Display for Error {
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
|
|
Display::fmt(&self.0, f)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> Display for CompilerError<T>
|
|
|
|
where
|
|
|
|
T: Display,
|
|
|
|
{
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
|
|
match self {
|
|
|
|
CompilerError::ICE => write!(f, "Internal Compiler Error"),
|
|
|
|
CompilerError::CompilationFailed => write!(f, "Compilation Failed"),
|
|
|
|
CompilerError::Interrupted(reason) => write!(f, "Compilation Interrupted: {reason}"),
|
|
|
|
CompilerError::Skipped => write!(f, "Compilation Skipped"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<T> Debug for CompilerError<T>
|
|
|
|
where
|
|
|
|
T: Debug,
|
|
|
|
{
|
|
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
|
|
|
|
match self {
|
|
|
|
CompilerError::ICE => write!(f, "Internal Compiler Error"),
|
|
|
|
CompilerError::CompilationFailed => write!(f, "Compilation Failed"),
|
|
|
|
CompilerError::Interrupted(reason) => write!(f, "Compilation Interrupted: {reason:?}"),
|
|
|
|
CompilerError::Skipped => write!(f, "Compilation Skipped"),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl error::Error for Error {}
|
|
|
|
impl<T> error::Error for CompilerError<T> where T: Display + Debug {}
|