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}