@@ -50,11 +50,23 @@ pub struct SequenceRepetition {
5050 /// The optional separator
5151 pub separator : Option < Token > ,
5252 /// Whether the sequence can be repeated zero (*), or one or more times (+)
53- pub op : KleeneOp ,
53+ pub kleene : KleeneToken ,
5454 /// The number of `Match`s that appear in the sequence (and subsequences)
5555 pub num_captures : usize ,
5656}
5757
58+ #[ derive( Clone , PartialEq , RustcEncodable , RustcDecodable , Debug , Copy ) ]
59+ pub struct KleeneToken {
60+ pub span : Span ,
61+ pub op : KleeneOp ,
62+ }
63+
64+ impl KleeneToken {
65+ pub fn new ( op : KleeneOp , span : Span ) -> KleeneToken {
66+ KleeneToken { span, op }
67+ }
68+ }
69+
5870/// A Kleene-style [repetition operator](http://en.wikipedia.org/wiki/Kleene_star)
5971/// for token sequences.
6072#[ derive( Clone , PartialEq , RustcEncodable , RustcDecodable , Hash , Debug , Copy ) ]
@@ -273,15 +285,15 @@ fn parse_tree(
273285 macro_node_id,
274286 ) ;
275287 // Get the Kleene operator and optional separator
276- let ( separator, op ) = parse_sep_and_kleene_op ( trees, span. entire ( ) , sess) ;
288+ let ( separator, kleene ) = parse_sep_and_kleene_op ( trees, span. entire ( ) , sess) ;
277289 // Count the number of captured "names" (i.e., named metavars)
278290 let name_captures = macro_parser:: count_names ( & sequence) ;
279291 TokenTree :: Sequence (
280292 span,
281293 Lrc :: new ( SequenceRepetition {
282294 tts : sequence,
283295 separator,
284- op ,
296+ kleene ,
285297 num_captures : name_captures,
286298 } ) ,
287299 )
@@ -379,28 +391,28 @@ fn parse_sep_and_kleene_op(
379391 input : & mut Peekable < impl Iterator < Item = tokenstream:: TokenTree > > ,
380392 span : Span ,
381393 sess : & ParseSess ,
382- ) -> ( Option < Token > , KleeneOp ) {
394+ ) -> ( Option < Token > , KleeneToken ) {
383395 // We basically look at two token trees here, denoted as #1 and #2 below
384396 let span = match parse_kleene_op ( input, span) {
385397 // #1 is a `?`, `+`, or `*` KleeneOp
386- Ok ( Ok ( ( op, _ ) ) ) => return ( None , op ) ,
398+ Ok ( Ok ( ( op, span ) ) ) => return ( None , KleeneToken :: new ( op , span ) ) ,
387399
388400 // #1 is a separator followed by #2, a KleeneOp
389401 Ok ( Err ( token) ) => match parse_kleene_op ( input, token. span ) {
390402 // #2 is the `?` Kleene op, which does not take a separator (error)
391- Ok ( Ok ( ( KleeneOp :: ZeroOrOne , _ ) ) ) => {
403+ Ok ( Ok ( ( KleeneOp :: ZeroOrOne , span ) ) ) => {
392404 // Error!
393405 sess. span_diagnostic . span_err (
394406 token. span ,
395407 "the `?` macro repetition operator does not take a separator" ,
396408 ) ;
397409
398410 // Return a dummy
399- return ( None , KleeneOp :: ZeroOrMore ) ;
411+ return ( None , KleeneToken :: new ( KleeneOp :: ZeroOrMore , span ) ) ;
400412 }
401413
402414 // #2 is a KleeneOp :D
403- Ok ( Ok ( ( op, _ ) ) ) => return ( Some ( token) , op ) ,
415+ Ok ( Ok ( ( op, span ) ) ) => return ( Some ( token) , KleeneToken :: new ( op , span ) ) ,
404416
405417 // #2 is a random token or not a token at all :(
406418 Ok ( Err ( Token { span, .. } ) ) | Err ( span) => span,
@@ -414,5 +426,5 @@ fn parse_sep_and_kleene_op(
414426 sess. span_diagnostic . span_err ( span, "expected one of: `*`, `+`, or `?`" ) ;
415427
416428 // Return a dummy
417- ( None , KleeneOp :: ZeroOrMore )
429+ ( None , KleeneToken :: new ( KleeneOp :: ZeroOrMore , span ) )
418430}
0 commit comments