Skip to main content

sbpf_assembler/
errors.rs

1use {crate::define_compile_errors, std::ops::Range};
2
3// labels could be overridden by passing a valid custom_label in the error variant
4// if not provided, the label will use default messages from below
5define_compile_errors! {
6    // Lexical errors
7    InvalidNumber {
8        error = "Invalid number '{number}'",
9        label = "Invalid number",
10        fields = { number: String, span: Range<usize> }
11    },
12    InvalidRegister {
13        error = "Invalid register '{register}'",
14        label = "Invalid register",
15        fields = { register: String, span: Range<usize> }
16    },
17    UnexpectedCharacter {
18        error = "Unexpected character '{character}'",
19        label = "Unexpected character",
20        fields = { character: char, span: Range<usize> }
21    },
22    UnterminatedStringLiteral {
23        error = "Unterminated string literal",
24        label = "Unterminated string literal",
25        fields = { span: Range<usize> }
26    },
27    // Syntactic errors
28    InvalidGlobalDecl {
29        error = "Invalid global declaration",
30        label = "Expected <identifier> for entry label",
31        fields = { span: Range<usize> }
32    },
33    InvalidExternDecl {
34        error = "Invalid extern declaration",
35        label = "Invalid extern declaration",
36        fields = { span: Range<usize> }
37    },
38    InvalidRodataDecl {
39        error = "Invalid rodata declaration",
40        label = "Invalid rodata declaration",
41        fields = { span: Range<usize> }
42    },
43    InvalidEquDecl {
44        error = "Invalid equ declaration",
45        label = "Invalid equ declaration",
46        fields = { span: Range<usize> }
47    },
48    InvalidDirective {
49        error = "Invalid directive '{directive}'",
50        label = "Invalid directive",
51        fields = { directive: String, span: Range<usize> }
52    },
53    InvalidInstruction {
54        error = "Invalid '{instruction}' instruction",
55        label = "Invalid instruction",
56        fields = { instruction: String, span: Range<usize> }
57    },
58    UnexpectedToken {
59        error = "Unexpected token '{token}'",
60        label = "Unexpected token",
61        fields = { token: String, span: Range<usize> }
62    },
63    UnmatchedParen {
64        error = "Unmatched parenthesis",
65        label = "Unmatched parenthesis",
66        fields = { span: Range<usize> }
67    },
68    ParseError {
69        error = "Parse error: {error}",
70        label = "Parse error",
71        fields = { error: String, span: Range<usize> }
72    },
73    OutOfRangeLiteral {
74        error = "Out of range literal'",
75        label = "Out of range literal",
76        fields = { span: Range<usize> }
77    },
78    ArithmeticError {
79        error = "{error}",
80        label = "Invalid constant expression",
81        fields = { error: String, span: Range<usize> }
82    },
83    InvalidRODataDirective {
84        error = "Invalid rodata directive",
85        label = "Invalid rodata directive",
86        fields = { span: Range<usize> }
87    },
88    CrossSectionArithmetic {
89        error = "Cross-section label arithmetic: '{label1}' and '{label2}' are in different sections",
90        label = "Cross-section arithmetic",
91        fields = { label1: String, label2: String, span: Range<usize> }
92    },
93    // Semantic errors
94    UndefinedLabel {
95        error = "Undefined label '{label}'",
96        label = "Undefined label",
97        fields = { label: String, span: Range<usize> }
98    },
99    DuplicateLabel {
100        error = "Duplicate label '{label}'",
101        label = "Label redefined",
102        fields = { label: String, span: Range<usize>, original_span: Range<usize> }
103    },
104    BytecodeError {
105        error = "Bytecode error: {error}",
106        label = "Bytecode error",
107        fields = { error: String, span: Range<usize> }
108    },
109    MissingTextDirective {
110        error = "Missing text directive",
111        label = "Missing text directive",
112        fields = { span: Range<usize> }
113    },
114    // Preprocessor errors
115    IncludeCycle {
116        error = "Include cycle detected: '{path}'",
117        label = "Include cycle",
118        fields = { path: String, span: Range<usize> }
119    },
120    IncludeNotFound {
121        error = "Include file not found: '{path}'",
122        label = "File not found",
123        fields = { path: String, span: Range<usize> }
124    },
125    IncludeReadError {
126        error = "Failed to read include file '{path}': {reason}",
127        label = "Read error",
128        fields = { path: String, reason: String, span: Range<usize> }
129    },
130    UnclosedMacro {
131        error = "Macro '{name}' missing .endm",
132        label = "Unclosed macro definition",
133        fields = { name: String, span: Range<usize> }
134    },
135    UnclosedRept {
136        error = "Missing .endr for .rept/.irp",
137        label = "Unclosed repetition block",
138        fields = { span: Range<usize> }
139    },
140    DuplicateMacroDef {
141        error = "Macro '{name}' already defined",
142        label = "Duplicate macro definition",
143        fields = { name: String, span: Range<usize> }
144    },
145    MacroArgCount {
146        error = "Macro '{name}' expects {expected} argument(s), got {got}",
147        label = "Wrong number of arguments",
148        fields = { name: String, expected: usize, got: usize, span: Range<usize> }
149    },
150    UndefinedMacroParam {
151        error = "Undefined macro parameter '\\{param}'",
152        label = "Unknown parameter",
153        fields = { param: String, span: Range<usize> }
154    },
155    MacroRecursionLimit {
156        error = "Macro expansion depth exceeded (max {limit})",
157        label = "Recursion limit exceeded",
158        fields = { limit: u32, span: Range<usize> }
159    },
160    InvalidReptCount {
161        error = "Invalid .rept count: '{value}'",
162        label = "Invalid repeat count",
163        fields = { value: String, span: Range<usize> }
164    },
165    VarargNotLast {
166        error = "Vararg parameter must be last in macro '{name}'",
167        label = "Vararg not last",
168        fields = { name: String, span: Range<usize> }
169    },
170    MultipleVararg {
171        error = "Multiple :vararg parameters in macro '{name}'",
172        label = "Multiple vararg parameters",
173        fields = { name: String, span: Range<usize> }
174    },
175}