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