1use {crate::define_compile_errors, std::ops::Range};
2
3define_compile_errors! {
6 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 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 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 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}