@@ -8,8 +8,8 @@ use termcolor::StandardStreamLock;
8
8
9
9
use crate :: lexer:: { TLexer , Token } ;
10
10
use crate :: parser:: dump:: Dump ;
11
+ use crate :: parser:: errors:: ParserError ;
11
12
use crate :: parser:: Context ;
12
- use crate :: { dump_fields, dump_start} ;
13
13
14
14
#[ derive( Clone , Debug , PartialEq ) ]
15
15
pub struct Attribute {
@@ -66,7 +66,7 @@ impl<'a, L: TLexer> UsingParser<'a, L> {
66
66
Self { lexer }
67
67
}
68
68
69
- fn parse ( self , _context : & mut Context ) -> ( Option < Token > , Option < String > ) {
69
+ fn parse ( self , _context : & mut Context ) -> Result < ( Option < Token > , Option < String > ) , ParserError > {
70
70
let tok = self . lexer . next_useful ( ) ;
71
71
if tok == Token :: Using {
72
72
let tok = self . lexer . next_useful ( ) ;
@@ -75,17 +75,23 @@ impl<'a, L: TLexer> UsingParser<'a, L> {
75
75
let tok = self . lexer . next_useful ( ) ;
76
76
match tok {
77
77
Token :: Colon => {
78
- return ( None , ns) ;
78
+ return Ok ( ( None , ns) ) ;
79
79
}
80
80
_ => {
81
- unreachable ! ( "Invalid token in attributes: {:?}" , tok) ;
81
+ return Err ( ParserError :: InvalidTokenInAttrs {
82
+ sp : self . lexer . span ( ) ,
83
+ tok,
84
+ } ) ;
82
85
}
83
86
}
84
87
} else {
85
- unreachable ! ( "Invalid token in attributes: {:?}" , tok) ;
88
+ return Err ( ParserError :: InvalidTokenInAttrs {
89
+ sp : self . lexer . span ( ) ,
90
+ tok,
91
+ } ) ;
86
92
}
87
93
}
88
- ( Some ( tok) , None )
94
+ Ok ( ( Some ( tok) , None ) )
89
95
}
90
96
}
91
97
@@ -102,10 +108,10 @@ impl<'a, L: TLexer> ArgumentParser<'a, L> {
102
108
self ,
103
109
tok : Option < Token > ,
104
110
_context : & mut Context ,
105
- ) -> ( Option < Token > , Option < AttributeArg > ) {
111
+ ) -> Result < ( Option < Token > , Option < AttributeArg > ) , ParserError > {
106
112
let tok = tok. unwrap_or_else ( || self . lexer . next_useful ( ) ) ;
107
113
if tok != Token :: LeftParen {
108
- return ( Some ( tok) , None ) ;
114
+ return Ok ( ( Some ( tok) , None ) ) ;
109
115
}
110
116
111
117
let mut arg = AttributeArg :: default ( ) ;
@@ -122,9 +128,12 @@ impl<'a, L: TLexer> ArgumentParser<'a, L> {
122
128
Token :: RightParen => {
123
129
if paren_count == 1 {
124
130
if brack_count != 0 || brace_count != 0 {
125
- unreachable ! ( "Unbalanced attribute" ) ;
131
+ return Err ( ParserError :: UnbalancedAttr {
132
+ sp : self . lexer . span ( ) ,
133
+ tok,
134
+ } ) ;
126
135
} else {
127
- return ( None , Some ( arg) ) ;
136
+ return Ok ( ( None , Some ( arg) ) ) ;
128
137
}
129
138
} else {
130
139
paren_count -= 1 ;
@@ -135,7 +144,10 @@ impl<'a, L: TLexer> ArgumentParser<'a, L> {
135
144
}
136
145
Token :: RightBrack => {
137
146
if brack_count == 0 {
138
- unreachable ! ( "Unbalanced attribute" ) ;
147
+ return Err ( ParserError :: UnbalancedAttr {
148
+ sp : self . lexer . span ( ) ,
149
+ tok,
150
+ } ) ;
139
151
} else {
140
152
brack_count -= 1 ;
141
153
}
@@ -145,13 +157,18 @@ impl<'a, L: TLexer> ArgumentParser<'a, L> {
145
157
}
146
158
Token :: RightBrace => {
147
159
if brace_count == 0 {
148
- unreachable ! ( "Unbalanced attribute" ) ;
160
+ return Err ( ParserError :: UnbalancedAttr {
161
+ sp : self . lexer . span ( ) ,
162
+ tok,
163
+ } ) ;
149
164
} else {
150
165
brace_count -= 1 ;
151
166
}
152
167
}
153
168
Token :: Eof => {
154
- unreachable ! ( "Wrong attribute" ) ;
169
+ return Err ( ParserError :: UnexpectedEof {
170
+ sp : self . lexer . span ( ) ,
171
+ } ) ;
155
172
}
156
173
t => {
157
174
arg. tokens . push ( t) ;
@@ -174,25 +191,29 @@ impl<'a, L: TLexer> NameParser<'a, L> {
174
191
self ,
175
192
tok : Token ,
176
193
_context : & mut Context ,
177
- ) -> ( Option < Token > , ( Option < String > , String ) ) {
194
+ ) -> Result < ( Option < Token > , ( Option < String > , String ) ) , ParserError > {
178
195
match tok {
179
196
Token :: Identifier ( id) => {
180
197
let tk = self . lexer . next_useful ( ) ;
181
198
if tk == Token :: ColonColon {
182
199
let ns = Some ( id) ;
183
200
let tk = self . lexer . next_useful ( ) ;
184
201
if let Token :: Identifier ( id) = tk {
185
- ( None , ( ns, id) )
202
+ Ok ( ( None , ( ns, id) ) )
186
203
} else {
187
- unreachable ! ( "Invalid token in attributes: {:?}" , tk) ;
204
+ Err ( ParserError :: InvalidTokenInAttrs {
205
+ sp : self . lexer . span ( ) ,
206
+ tok : tk,
207
+ } )
188
208
}
189
209
} else {
190
- ( Some ( tk) , ( None , id) )
210
+ Ok ( ( Some ( tk) , ( None , id) ) )
191
211
}
192
212
}
193
- _ => {
194
- unreachable ! ( "Invalid token in attributes: {:?}" , tok) ;
195
- }
213
+ _ => Err ( ParserError :: InvalidTokenInAttrs {
214
+ sp : self . lexer . span ( ) ,
215
+ tok,
216
+ } ) ,
196
217
}
197
218
}
198
219
}
@@ -211,7 +232,7 @@ impl<'a, L: TLexer> AttributeParser<'a, L> {
211
232
attributes : & mut Attributes ,
212
233
tok : Option < Token > ,
213
234
context : & mut Context ,
214
- ) -> ( Option < Token > , bool ) {
235
+ ) -> Result < ( Option < Token > , bool ) , ParserError > {
215
236
// [[ attribute-list ]]
216
237
// [[ using attribute-namespace : attribute-list ]]
217
238
//
@@ -223,21 +244,21 @@ impl<'a, L: TLexer> AttributeParser<'a, L> {
223
244
224
245
let tok = tok. unwrap_or_else ( || self . lexer . next_useful ( ) ) ;
225
246
if tok != Token :: DoubleLeftBrack {
226
- return ( Some ( tok) , false ) ;
247
+ return Ok ( ( Some ( tok) , false ) ) ;
227
248
}
228
249
229
250
let up = UsingParser :: new ( self . lexer ) ;
230
- let ( tok, default_ns) = up. parse ( context) ;
251
+ let ( tok, default_ns) = up. parse ( context) ? ;
231
252
let has_using = default_ns. is_some ( ) ;
232
253
233
254
let mut tok = tok. unwrap_or_else ( || self . lexer . next_useful ( ) ) ;
234
255
235
256
loop {
236
257
let np = NameParser :: new ( self . lexer ) ;
237
- let ( tk, ( namespace, id) ) = np. parse ( tok, context) ;
258
+ let ( tk, ( namespace, id) ) = np. parse ( tok, context) ? ;
238
259
239
260
let ap = ArgumentParser :: new ( self . lexer ) ;
240
- let ( tk, arg) = ap. parse ( tk, context) ;
261
+ let ( tk, arg) = ap. parse ( tk, context) ? ;
241
262
242
263
attributes. push ( Attribute {
243
264
namespace : namespace. or_else ( || default_ns. clone ( ) ) ,
@@ -250,10 +271,13 @@ impl<'a, L: TLexer> AttributeParser<'a, L> {
250
271
match tok {
251
272
Token :: Comma => { }
252
273
Token :: DoubleRightBrack => {
253
- return ( None , true ) ;
274
+ return Ok ( ( None , true ) ) ;
254
275
}
255
276
_ => {
256
- unreachable ! ( "Invalid token in attributes: {:?}" , tok) ;
277
+ return Err ( ParserError :: InvalidTokenInAttrs {
278
+ sp : self . lexer . span ( ) ,
279
+ tok,
280
+ } ) ;
257
281
}
258
282
}
259
283
@@ -275,14 +299,14 @@ impl<'a, L: TLexer> AttributesParser<'a, L> {
275
299
self ,
276
300
tok : Option < Token > ,
277
301
context : & mut Context ,
278
- ) -> ( Option < Token > , Option < Attributes > ) {
302
+ ) -> Result < ( Option < Token > , Option < Attributes > ) , ParserError > {
279
303
let mut attributes = Vec :: new ( ) ;
280
304
let mut tok = tok;
281
305
let mut has_attributes = false ;
282
306
283
307
loop {
284
308
let ap = AttributeParser :: new ( self . lexer ) ;
285
- let ( tk, has_attr) = ap. parse ( & mut attributes, tok, context) ;
309
+ let ( tk, has_attr) = ap. parse ( & mut attributes, tok, context) ? ;
286
310
tok = tk;
287
311
has_attributes |= has_attr;
288
312
@@ -291,11 +315,11 @@ impl<'a, L: TLexer> AttributesParser<'a, L> {
291
315
}
292
316
}
293
317
294
- if has_attributes {
318
+ Ok ( if has_attributes {
295
319
( tok, Some ( attributes) )
296
320
} else {
297
321
( tok, None )
298
- }
322
+ } )
299
323
}
300
324
}
301
325
@@ -311,7 +335,7 @@ mod tests {
311
335
let mut l = Lexer :: < DefaultContext > :: new ( b"[[noreturn]]" ) ;
312
336
let p = AttributesParser :: new ( & mut l) ;
313
337
let mut context = Context :: default ( ) ;
314
- let ( _, a) = p. parse ( None , & mut context) ;
338
+ let ( _, a) = p. parse ( None , & mut context) . unwrap ( ) ;
315
339
316
340
assert_eq ! (
317
341
a. unwrap( ) ,
@@ -329,7 +353,7 @@ mod tests {
329
353
let mut l = Lexer :: < DefaultContext > :: new ( b"[[gnu::unused]]" ) ;
330
354
let p = AttributesParser :: new ( & mut l) ;
331
355
let mut context = Context :: default ( ) ;
332
- let ( _, a) = p. parse ( None , & mut context) ;
356
+ let ( _, a) = p. parse ( None , & mut context) . unwrap ( ) ;
333
357
334
358
assert_eq ! (
335
359
a. unwrap( ) ,
@@ -347,7 +371,7 @@ mod tests {
347
371
let mut l = Lexer :: < DefaultContext > :: new ( b"[[deprecated(\" because\" )]]" ) ;
348
372
let p = AttributesParser :: new ( & mut l) ;
349
373
let mut context = Context :: default ( ) ;
350
- let ( _, a) = p. parse ( None , & mut context) ;
374
+ let ( _, a) = p. parse ( None , & mut context) . unwrap ( ) ;
351
375
352
376
assert_eq ! (
353
377
a. unwrap( ) ,
@@ -367,7 +391,7 @@ mod tests {
367
391
let mut l = Lexer :: < DefaultContext > :: new ( b"[[using CC: opt(1), debug]]" ) ;
368
392
let p = AttributesParser :: new ( & mut l) ;
369
393
let mut context = Context :: default ( ) ;
370
- let ( _, a) = p. parse ( None , & mut context) ;
394
+ let ( _, a) = p. parse ( None , & mut context) . unwrap ( ) ;
371
395
372
396
assert_eq ! (
373
397
a. unwrap( ) ,
@@ -395,7 +419,7 @@ mod tests {
395
419
let mut l = Lexer :: < DefaultContext > :: new ( b"[[A]] [[B]] [[C]]" ) ;
396
420
let p = AttributesParser :: new ( & mut l) ;
397
421
let mut context = Context :: default ( ) ;
398
- let ( _, a) = p. parse ( None , & mut context) ;
422
+ let ( _, a) = p. parse ( None , & mut context) . unwrap ( ) ;
399
423
400
424
assert_eq ! (
401
425
a. unwrap( ) ,
0 commit comments