@@ -200,18 +200,19 @@ pub enum NamedMatch {
200
200
}
201
201
202
202
pub fn nameize ( p_s : & ParseSess , ms : & [ TokenTree ] , res : & [ Rc < NamedMatch > ] )
203
- -> HashMap < Name , Rc < NamedMatch > > {
203
+ -> ParseResult < HashMap < Name , Rc < NamedMatch > > > {
204
204
fn n_rec ( p_s : & ParseSess , m : & TokenTree , res : & [ Rc < NamedMatch > ] ,
205
- ret_val : & mut HashMap < Name , Rc < NamedMatch > > , idx : & mut usize ) {
205
+ ret_val : & mut HashMap < Name , Rc < NamedMatch > > , idx : & mut usize )
206
+ -> Result < ( ) , ( codemap:: Span , String ) > {
206
207
match * m {
207
208
TokenTree :: Sequence ( _, ref seq) => {
208
209
for next_m in & seq. tts {
209
- n_rec ( p_s, next_m, res, ret_val, idx)
210
+ try! ( n_rec ( p_s, next_m, res, ret_val, idx) )
210
211
}
211
212
}
212
213
TokenTree :: Delimited ( _, ref delim) => {
213
214
for next_m in & delim. tts {
214
- n_rec ( p_s, next_m, res, ret_val, idx)
215
+ try! ( n_rec ( p_s, next_m, res, ret_val, idx) ) ;
215
216
}
216
217
}
217
218
TokenTree :: Token ( sp, MatchNt ( bind_name, _, _, _) ) => {
@@ -221,26 +222,36 @@ pub fn nameize(p_s: &ParseSess, ms: &[TokenTree], res: &[Rc<NamedMatch>])
221
222
* idx += 1 ;
222
223
}
223
224
Occupied ( ..) => {
224
- panic ! ( p_s. span_diagnostic
225
- . span_fatal( sp,
226
- & format!( "duplicated bind name: {}" ,
227
- bind_name) ) )
225
+ return Err ( ( sp, format ! ( "duplicated bind name: {}" , bind_name) ) )
228
226
}
229
227
}
230
228
}
231
- TokenTree :: Token ( _, SubstNt ( ..) ) => panic ! ( "Cannot fill in a NT" ) ,
229
+ TokenTree :: Token ( sp, SubstNt ( ..) ) => {
230
+ return Err ( ( sp, "missing fragment specifier" . to_string ( ) ) )
231
+ }
232
232
TokenTree :: Token ( _, _) => ( ) ,
233
233
}
234
+
235
+ Ok ( ( ) )
234
236
}
237
+
235
238
let mut ret_val = HashMap :: new ( ) ;
236
239
let mut idx = 0 ;
237
- for m in ms { n_rec ( p_s, m, res, & mut ret_val, & mut idx) }
238
- ret_val
240
+ for m in ms {
241
+ match n_rec ( p_s, m, res, & mut ret_val, & mut idx) {
242
+ Ok ( _) => { } ,
243
+ Err ( ( sp, msg) ) => return Error ( sp, msg) ,
244
+ }
245
+ }
246
+
247
+ Success ( ret_val)
239
248
}
240
249
241
250
pub enum ParseResult < T > {
242
251
Success ( T ) ,
252
+ /// Arm failed to match
243
253
Failure ( codemap:: Span , String ) ,
254
+ /// Fatal error (malformed macro?). Abort compilation.
244
255
Error ( codemap:: Span , String )
245
256
}
246
257
@@ -429,7 +440,7 @@ pub fn parse(sess: &ParseSess,
429
440
for dv in & mut ( & mut eof_eis[ 0 ] ) . matches {
430
441
v. push ( dv. pop ( ) . unwrap ( ) ) ;
431
442
}
432
- return Success ( nameize ( sess, ms, & v[ ..] ) ) ;
443
+ return nameize ( sess, ms, & v[ ..] ) ;
433
444
} else if eof_eis. len ( ) > 1 {
434
445
return Error ( sp, "ambiguity: multiple successful parses" . to_string ( ) ) ;
435
446
} else {
0 commit comments