swc_ecma_fast_parser/
error.rs
use std::fmt;
use swc_common::Span;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub struct Error {
pub kind: ErrorKind,
pub span: Span,
}
#[derive(Debug)]
pub enum ErrorKind {
UnexpectedToken {
expected: Option<&'static str>,
got: String,
},
UnexpectedEof { expected: Option<&'static str> },
InvalidNumber { reason: &'static str },
InvalidString { reason: &'static str },
InvalidRegExp { reason: &'static str },
InvalidTemplate { reason: &'static str },
InvalidIdentifier { reason: &'static str },
InvalidAssignmentTarget,
InvalidDestructuringPattern,
InvalidAwait,
InvalidYield,
InvalidSuper,
InvalidNewTarget,
InvalidImportMeta,
UnexpectedKeyword { keyword: &'static str },
UnexpectedReservedWord { word: String },
DuplicateBinding { name: String },
General { message: String },
UnterminatedString,
InvalidHexEscape,
InvalidUnicodeEscape,
InvalidBigInt,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.kind {
ErrorKind::UnexpectedToken { expected, got } => {
if let Some(expected) = expected {
write!(f, "Expected {}, got {}", expected, got)
} else {
write!(f, "Unexpected token {}", got)
}
}
ErrorKind::UnexpectedEof { expected } => {
if let Some(expected) = expected {
write!(f, "Unexpected end of file, expected {}", expected)
} else {
write!(f, "Unexpected end of file")
}
}
ErrorKind::InvalidNumber { reason } => {
write!(f, "Invalid numeric literal: {}", reason)
}
ErrorKind::InvalidString { reason } => {
write!(f, "Invalid string literal: {}", reason)
}
ErrorKind::InvalidRegExp { reason } => {
write!(f, "Invalid regular expression: {}", reason)
}
ErrorKind::InvalidTemplate { reason } => {
write!(f, "Invalid template literal: {}", reason)
}
ErrorKind::InvalidIdentifier { reason } => {
write!(f, "Invalid identifier: {}", reason)
}
ErrorKind::InvalidAssignmentTarget => {
write!(f, "Invalid assignment target")
}
ErrorKind::InvalidDestructuringPattern => {
write!(f, "Invalid destructuring pattern")
}
ErrorKind::InvalidAwait => {
write!(f, "await is only valid in async functions")
}
ErrorKind::InvalidYield => {
write!(f, "yield is only valid in generator functions")
}
ErrorKind::InvalidSuper => {
write!(f, "Invalid use of super")
}
ErrorKind::InvalidNewTarget => {
write!(f, "new.target can only be used in functions")
}
ErrorKind::InvalidImportMeta => {
write!(f, "import.meta can only be used in modules")
}
ErrorKind::UnexpectedKeyword { keyword } => {
write!(f, "Unexpected keyword '{}'", keyword)
}
ErrorKind::UnexpectedReservedWord { word } => {
write!(f, "Unexpected reserved word '{}'", word)
}
ErrorKind::DuplicateBinding { name } => {
write!(f, "Duplicate binding '{}'", name)
}
ErrorKind::General { message } => {
write!(f, "{}", message)
}
ErrorKind::UnterminatedString => {
write!(f, "Unterminated string literal")
}
ErrorKind::InvalidHexEscape => {
write!(f, "Invalid hexadecimal escape sequence")
}
ErrorKind::InvalidUnicodeEscape => {
write!(f, "Invalid unicode escape sequence")
}
ErrorKind::InvalidBigInt => {
write!(f, "Invalid BigInt literal")
}
}
}
}
impl std::error::Error for Error {}