roan_error/
error.rs

1use crate::{frame::Frame, span::TextSpan};
2use thiserror::Error;
3
4#[derive(Error, Debug)]
5pub enum RoanError {
6    #[error("IO error: {0}")]
7    Io(#[from] std::io::Error),
8    #[error("Invalid token: {0}")]
9    InvalidToken(String, TextSpan),
10    #[error("Expected {0}.")]
11    ExpectedToken(String, String, TextSpan),
12    #[error("Unexpected token: {0}")]
13    UnexpectedToken(String, TextSpan),
14    #[error("{0}")]
15    SemanticError(String, TextSpan),
16    #[error("Semantic error: {0}")]
17    ResolverError(String),
18    #[error("{0}")]
19    ModuleError(String),
20    #[error("Tried to import a item that does not exist: {0}")]
21    ImportError(String, TextSpan),
22    #[error("Failed to import {0}. {1}")]
23    FailedToImportModule(String, String, TextSpan),
24    #[error("Couldn't find variable: {0}")]
25    VariableNotFoundError(String, TextSpan),
26    #[error("Call to undefined function: {0}")]
27    UndefinedFunctionError(String, TextSpan),
28    #[error("Found normal parameter after rest parameter.")]
29    RestParameterNotLast(TextSpan),
30    #[error("Found rest parameter in non-last position.")]
31    RestParameterNotLastPosition(TextSpan),
32    #[error("Found more than one rest parameter.")]
33    MultipleRestParameters(TextSpan),
34    #[error("{0}")]
35    Throw(String, Vec<Frame>),
36    #[error("Invalid escape sequence: {0}")]
37    InvalidEscapeSequence(String, TextSpan),
38    #[error("{0} does not evaluate to a boolean.")]
39    NonBooleanCondition(String, TextSpan),
40    #[error("Index out of bounds: {0} >= {1}")]
41    IndexOutOfBounds(usize, usize, TextSpan),
42    #[error("Type mismatch: {0}")]
43    TypeMismatch(String, TextSpan),
44    #[error("Invalid assignment {0}")]
45    InvalidAssignment(String, TextSpan),
46    #[error("Attempted to access non-existent property: {0}")]
47    PropertyNotFoundError(String, TextSpan),
48    #[error("Invalid property access")]
49    InvalidPropertyAccess(TextSpan),
50    #[error("Found break or continue statement outside of loop.")]
51    InvalidBreakOrContinue(TextSpan),
52    #[error("Break was used outside loop.")]
53    LoopBreak(TextSpan),
54    #[error("Continue was used outside loop.")]
55    LoopContinue(TextSpan),
56    #[error("Invalid spread operator usage.")]
57    InvalidSpread(TextSpan),
58    #[error("Found multiple 'self' parameters.")]
59    MultipleSelfParameters(TextSpan),
60    #[error("Found 'self' parameter in non-first position.")]
61    SelfParameterNotFirst(TextSpan),
62    #[error("Self parameter cannot be rest.")]
63    SelfParameterCannotBeRest(TextSpan),
64    #[error("Struct not found: {0}")]
65    StructNotFoundError(String, TextSpan),
66    #[error("Trait definition not found: {0}")]
67    TraitNotFoundError(String, TextSpan),
68    #[error("Struct {0} already implements trait {1}")]
69    StructAlreadyImplementsTrait(String, String, TextSpan),
70    #[error("Trait {0} doesn't implement required method")]
71    TraitMethodNotImplemented(String, Vec<String>, TextSpan),
72    #[error("Cannot assign value to static member")]
73    StaticMemberAssignment(TextSpan),
74    #[error("Attempted to access static member of non-struct type")]
75    StaticMemberAccess(TextSpan),
76    #[error("Only call expressions can be accessed in a static context")]
77    StaticContext(TextSpan),
78    #[error("Invalid unary operator: {0}")]
79    InvalidUnaryOperation(String, TextSpan),
80    #[error("Missing non-nullable parameter: {0}")]
81    MissingParameter(String, TextSpan),
82    #[error("Invalid type provided: {0}. Available types: {1}")]
83    InvalidType(String, String, TextSpan),
84}
85
86pub fn get_span_from_err(err: &RoanError) -> Option<TextSpan> {
87    match err {
88        RoanError::Io(_) | RoanError::ResolverError(_) | RoanError::ModuleError(_) => None,
89        RoanError::RestParameterNotLast(span)
90        | RoanError::RestParameterNotLastPosition(span)
91        | RoanError::MultipleRestParameters(span)
92        | RoanError::SelfParameterCannotBeRest(span)
93        | RoanError::SelfParameterNotFirst(span)
94        | RoanError::MultipleSelfParameters(span)
95        | RoanError::StaticContext(span)
96        | RoanError::StaticMemberAccess(span)
97        | RoanError::StaticMemberAssignment(span) => Some(span.clone()),
98        RoanError::InvalidToken(_, span)
99        | RoanError::SemanticError(_, span)
100        | RoanError::UnexpectedToken(_, span)
101        | RoanError::InvalidEscapeSequence(_, span)
102        | RoanError::NonBooleanCondition(_, span)
103        | RoanError::StructNotFoundError(_, span)
104        | RoanError::TraitNotFoundError(_, span) => Some(span.clone()),
105        RoanError::TraitMethodNotImplemented(_, _, span)
106        | RoanError::StructAlreadyImplementsTrait(_, _, span)
107        | RoanError::ExpectedToken(_, _, span)
108        | RoanError::FailedToImportModule(_, _, span)
109        | RoanError::InvalidType(_, _, span)
110        | RoanError::IndexOutOfBounds(_, _, span) => Some(span.clone()),
111        RoanError::UndefinedFunctionError(_, span)
112        | RoanError::VariableNotFoundError(_, span)
113        | RoanError::ImportError(_, span)
114        | RoanError::PropertyNotFoundError(_, span)
115        | RoanError::TypeMismatch(_, span)
116        | RoanError::InvalidAssignment(_, span)
117        | RoanError::MissingParameter(_, span)
118        | RoanError::InvalidUnaryOperation(_, span) => Some(span.clone()),
119        RoanError::InvalidPropertyAccess(span)
120        | RoanError::InvalidSpread(span)
121        | RoanError::InvalidBreakOrContinue(span)
122        | RoanError::LoopBreak(span)
123        | RoanError::LoopContinue(span) => Some(span.clone()),
124        _ => None,
125    }
126}