|
1 | 1 | use crate::ast::NodeId;
|
2 |
| -use crate::early_buffered_lints::BufferedEarlyLintId; |
3 | 2 | use crate::ext::tt::macro_parser;
|
4 | 3 | use crate::feature_gate::Features;
|
5 | 4 | use crate::parse::{token, ParseSess};
|
@@ -291,16 +290,7 @@ where
|
291 | 290 | macro_node_id,
|
292 | 291 | );
|
293 | 292 | // Get the Kleene operator and optional separator
|
294 |
| - let (separator, op) = |
295 |
| - parse_sep_and_kleene_op( |
296 |
| - trees, |
297 |
| - span.entire(), |
298 |
| - sess, |
299 |
| - features, |
300 |
| - attrs, |
301 |
| - edition, |
302 |
| - macro_node_id, |
303 |
| - ); |
| 293 | + let (separator, op) = parse_sep_and_kleene_op(trees, span.entire(), sess); |
304 | 294 | // Count the number of captured "names" (i.e., named metavars)
|
305 | 295 | let name_captures = macro_parser::count_names(&sequence);
|
306 | 296 | TokenTree::Sequence(
|
@@ -411,164 +401,11 @@ where
|
411 | 401 | /// session `sess`. If the next one (or possibly two) tokens in `input` correspond to a Kleene
|
412 | 402 | /// operator and separator, then a tuple with `(separator, KleeneOp)` is returned. Otherwise, an
|
413 | 403 | /// error with the appropriate span is emitted to `sess` and a dummy value is returned.
|
414 |
| -/// |
415 |
| -/// N.B., in the 2015 edition, `*` and `+` are the only Kleene operators, and `?` is a separator. |
416 |
| -/// In the 2018 edition however, `?` is a Kleene operator, and not a separator. |
417 |
| -fn parse_sep_and_kleene_op<I>( |
418 |
| - input: &mut Peekable<I>, |
419 |
| - span: Span, |
420 |
| - sess: &ParseSess, |
421 |
| - features: &Features, |
422 |
| - attrs: &[ast::Attribute], |
423 |
| - edition: Edition, |
424 |
| - macro_node_id: NodeId, |
425 |
| -) -> (Option<token::Token>, KleeneOp) |
426 |
| -where |
427 |
| - I: Iterator<Item = tokenstream::TokenTree>, |
428 |
| -{ |
429 |
| - match edition { |
430 |
| - Edition::Edition2015 => parse_sep_and_kleene_op_2015( |
431 |
| - input, |
432 |
| - span, |
433 |
| - sess, |
434 |
| - features, |
435 |
| - attrs, |
436 |
| - macro_node_id, |
437 |
| - ), |
438 |
| - Edition::Edition2018 => parse_sep_and_kleene_op_2018(input, span, sess, features, attrs), |
439 |
| - } |
440 |
| -} |
441 |
| - |
442 |
| -// `?` is a separator (with a migration warning) and never a KleeneOp. |
443 |
| -fn parse_sep_and_kleene_op_2015<I>( |
444 |
| - input: &mut Peekable<I>, |
445 |
| - span: Span, |
446 |
| - sess: &ParseSess, |
447 |
| - _features: &Features, |
448 |
| - _attrs: &[ast::Attribute], |
449 |
| - macro_node_id: NodeId, |
450 |
| -) -> (Option<token::Token>, KleeneOp) |
451 |
| -where |
452 |
| - I: Iterator<Item = tokenstream::TokenTree>, |
453 |
| -{ |
454 |
| - // We basically look at two token trees here, denoted as #1 and #2 below |
455 |
| - let span = match parse_kleene_op(input, span) { |
456 |
| - // #1 is a `+` or `*` KleeneOp |
457 |
| - // |
458 |
| - // `?` is ambiguous: it could be a separator (warning) or a Kleene::ZeroOrOne (error), so |
459 |
| - // we need to look ahead one more token to be sure. |
460 |
| - Ok(Ok((op, _))) if op != KleeneOp::ZeroOrOne => return (None, op), |
461 |
| - |
462 |
| - // #1 is `?` token, but it could be a Kleene::ZeroOrOne (error in 2015) without a separator |
463 |
| - // or it could be a `?` separator followed by any Kleene operator. We need to look ahead 1 |
464 |
| - // token to find out which. |
465 |
| - Ok(Ok((op, op1_span))) => { |
466 |
| - assert_eq!(op, KleeneOp::ZeroOrOne); |
467 |
| - |
468 |
| - // Lookahead at #2. If it is a KleenOp, then #1 is a separator. |
469 |
| - let is_1_sep = if let Some(&tokenstream::TokenTree::Token(_, ref tok2)) = input.peek() { |
470 |
| - kleene_op(tok2).is_some() |
471 |
| - } else { |
472 |
| - false |
473 |
| - }; |
474 |
| - |
475 |
| - if is_1_sep { |
476 |
| - // #1 is a separator and #2 should be a KleepeOp. |
477 |
| - // (N.B. We need to advance the input iterator.) |
478 |
| - match parse_kleene_op(input, span) { |
479 |
| - // #2 is `?`, which is not allowed as a Kleene op in 2015 edition, |
480 |
| - // but is allowed in the 2018 edition. |
481 |
| - Ok(Ok((op, op2_span))) if op == KleeneOp::ZeroOrOne => { |
482 |
| - sess.span_diagnostic |
483 |
| - .struct_span_err(op2_span, "expected `*` or `+`") |
484 |
| - .note("`?` is not a macro repetition operator in the 2015 edition, \ |
485 |
| - but is accepted in the 2018 edition") |
486 |
| - .emit(); |
487 |
| - |
488 |
| - // Return a dummy |
489 |
| - return (None, KleeneOp::ZeroOrMore); |
490 |
| - } |
491 |
| - |
492 |
| - // #2 is a Kleene op, which is the only valid option |
493 |
| - Ok(Ok((op, _))) => { |
494 |
| - // Warn that `?` as a separator will be deprecated |
495 |
| - sess.buffer_lint( |
496 |
| - BufferedEarlyLintId::QuestionMarkMacroSep, |
497 |
| - op1_span, |
498 |
| - macro_node_id, |
499 |
| - "using `?` as a separator is deprecated and will be \ |
500 |
| - a hard error in an upcoming edition", |
501 |
| - ); |
502 |
| - |
503 |
| - return (Some(token::Question), op); |
504 |
| - } |
505 |
| - |
506 |
| - // #2 is a random token (this is an error) :( |
507 |
| - Ok(Err((_, _))) => op1_span, |
508 |
| - |
509 |
| - // #2 is not even a token at all :( |
510 |
| - Err(_) => op1_span, |
511 |
| - } |
512 |
| - } else { |
513 |
| - // `?` is not allowed as a Kleene op in 2015, |
514 |
| - // but is allowed in the 2018 edition |
515 |
| - sess.span_diagnostic |
516 |
| - .struct_span_err(op1_span, "expected `*` or `+`") |
517 |
| - .note("`?` is not a macro repetition operator in the 2015 edition, \ |
518 |
| - but is accepted in the 2018 edition") |
519 |
| - .emit(); |
520 |
| - |
521 |
| - // Return a dummy |
522 |
| - return (None, KleeneOp::ZeroOrMore); |
523 |
| - } |
524 |
| - } |
525 |
| - |
526 |
| - // #1 is a separator followed by #2, a KleeneOp |
527 |
| - Ok(Err((tok, span))) => match parse_kleene_op(input, span) { |
528 |
| - // #2 is a `?`, which is not allowed as a Kleene op in 2015 edition, |
529 |
| - // but is allowed in the 2018 edition |
530 |
| - Ok(Ok((op, op2_span))) if op == KleeneOp::ZeroOrOne => { |
531 |
| - sess.span_diagnostic |
532 |
| - .struct_span_err(op2_span, "expected `*` or `+`") |
533 |
| - .note("`?` is not a macro repetition operator in the 2015 edition, \ |
534 |
| - but is accepted in the 2018 edition") |
535 |
| - .emit(); |
536 |
| - |
537 |
| - // Return a dummy |
538 |
| - return (None, KleeneOp::ZeroOrMore); |
539 |
| - } |
540 |
| - |
541 |
| - // #2 is a KleeneOp :D |
542 |
| - Ok(Ok((op, _))) => return (Some(tok), op), |
543 |
| - |
544 |
| - // #2 is a random token :( |
545 |
| - Ok(Err((_, span))) => span, |
546 |
| - |
547 |
| - // #2 is not a token at all :( |
548 |
| - Err(span) => span, |
549 |
| - }, |
550 |
| - |
551 |
| - // #1 is not a token |
552 |
| - Err(span) => span, |
553 |
| - }; |
554 |
| - |
555 |
| - sess.span_diagnostic.span_err(span, "expected `*` or `+`"); |
556 |
| - |
557 |
| - // Return a dummy |
558 |
| - (None, KleeneOp::ZeroOrMore) |
559 |
| -} |
560 |
| - |
561 |
| -// `?` is a Kleene op, not a separator |
562 |
| -fn parse_sep_and_kleene_op_2018<I>( |
563 |
| - input: &mut Peekable<I>, |
| 404 | +fn parse_sep_and_kleene_op( |
| 405 | + input: &mut Peekable<impl Iterator<Item = tokenstream::TokenTree>>, |
564 | 406 | span: Span,
|
565 | 407 | sess: &ParseSess,
|
566 |
| - _features: &Features, |
567 |
| - _attrs: &[ast::Attribute], |
568 |
| -) -> (Option<token::Token>, KleeneOp) |
569 |
| -where |
570 |
| - I: Iterator<Item = tokenstream::TokenTree>, |
571 |
| -{ |
| 408 | +) -> (Option<token::Token>, KleeneOp) { |
572 | 409 | // We basically look at two token trees here, denoted as #1 and #2 below
|
573 | 410 | let span = match parse_kleene_op(input, span) {
|
574 | 411 | // #1 is a `?` (needs feature gate)
|
|
0 commit comments