Auto merge of #124256 - nnethercote:rm-NtIdent-NtLifetime, r=petroche… · rust-lang/rust@9105c57 (original) (raw)

`@@ -111,7 +111,7 @@ impl Lit {

`

111

111

`Ident(name, IdentIsRaw::No) if name.is_bool_lit() => Some(Lit::new(Bool, name, None)),

`

112

112

`Literal(token_lit) => Some(token_lit),

`

113

113

`Interpolated(ref nt)

`

114

``

`-

if let NtExpr(expr) | NtLiteral(expr) = &nt.0

`

``

114

`+

if let NtExpr(expr) | NtLiteral(expr) = &**nt

`

115

115

` && let ast::ExprKind::Lit(token_lit) = expr.kind =>

`

116

116

`{

`

117

117

`Some(token_lit)

`

`@@ -318,11 +318,20 @@ pub enum TokenKind {

`

318

318

`` /// It's recommended to use Token::(ident,uninterpolate,uninterpolated_span) to

``

319

319

`/// treat regular and interpolated identifiers in the same way.

`

320

320

`Ident(Symbol, IdentIsRaw),

`

``

321

`+

/// This identifier (and its span) is the identifier passed to the

`

``

322

`` +

/// declarative macro. The span in the surrounding Token is the span of

``

``

323

`` +

/// the ident metavariable in the macro's RHS.

``

``

324

`+

NtIdent(Ident, IdentIsRaw),

`

``

325

+

321

326

`/// Lifetime identifier token.

`

322

327

`` /// Do not forget about NtLifetime when you want to match on lifetime identifiers.

``

323

328

`` /// It's recommended to use Token::(lifetime,uninterpolate,uninterpolated_span) to

``

324

329

`/// treat regular and interpolated lifetime identifiers in the same way.

`

325

330

`Lifetime(Symbol),

`

``

331

`+

/// This identifier (and its span) is the lifetime passed to the

`

``

332

`` +

/// declarative macro. The span in the surrounding Token is the span of

``

``

333

`` +

/// the lifetime metavariable in the macro's RHS.

``

``

334

`+

NtLifetime(Ident),

`

326

335

``

327

336

`/// An embedded AST node, as produced by a macro. This only exists for

`

328

337

`/// historical reasons. We'd like to get rid of it, for multiple reasons.

`

`@@ -333,7 +342,11 @@ pub enum TokenKind {

`

333

342

`` /// - It prevents Token from implementing Copy.

``

334

343

`/// It adds complexity and likely slows things down. Please don't add new

`

335

344

`/// occurrences of this token kind!

`

336

``

`-

Interpolated(Lrc<(Nonterminal, Span)>),

`

``

345

`+

///

`

``

346

`` +

/// The span in the surrounding Token is that of the metavariable in the

``

``

347

`+

/// macro's RHS. The span within the Nonterminal is that of the fragment

`

``

348

`+

/// passed to the macro at the call site.

`

``

349

`+

Interpolated(Lrc),

`

337

350

``

338

351

`/// A doc comment token.

`

339

352

`` /// Symbol is the doc comment's data excluding its "quotes" (///, /**, etc)

``

`@@ -440,8 +453,9 @@ impl Token {

`

440

453

`/// Note that keywords are also identifiers, so they should use this

`

441

454

`/// if they keep spans or perform edition checks.

`

442

455

`pub fn uninterpolated_span(&self) -> Span {

`

443

``

`-

match &self.kind {

`

444

``

`-

Interpolated(nt) => nt.0.use_span(),

`

``

456

`+

match self.kind {

`

``

457

`+

NtIdent(ident, _) | NtLifetime(ident) => ident.span,

`

``

458

`+

Interpolated(ref nt) => nt.use_span(),

`

445

459

` _ => self.span,

`

446

460

`}

`

447

461

`}

`

`@@ -459,7 +473,7 @@ impl Token {

`

459

473

`}

`

460

474

``

461

475

`OpenDelim(..) | CloseDelim(..) | Literal(..) | DocComment(..) | Ident(..)

`

462

``

`-

| Lifetime(..) | Interpolated(..) | Eof => false,

`

``

476

`+

| NtIdent(..) | Lifetime(..) | NtLifetime(..) | Interpolated(..) | Eof => false,

`

463

477

`}

`

464

478

`}

`

465

479

``

`@@ -486,7 +500,7 @@ impl Token {

`

486

500

`PathSep | // global path

`

487

501

`Lifetime(..) | // labeled loop

`

488

502

`Pound => true, // expression attributes

`

489

``

`-

Interpolated(ref nt) => matches!(&nt.0, NtLiteral(..) |

`

``

503

`+

Interpolated(ref nt) => matches!(&**nt, NtLiteral(..) |

`

490

504

`NtExpr(..) |

`

491

505

`NtBlock(..) |

`

492

506

`NtPath(..)),

`

`@@ -510,7 +524,7 @@ impl Token {

`

510

524

` | DotDot | DotDotDot | DotDotEq // ranges

`

511

525

` | Lt | BinOp(Shl) // associated path

`

512

526

` | PathSep => true, // global path

`

513

``

`-

Interpolated(ref nt) => matches!(&nt.0, NtLiteral(..) |

`

``

527

`+

Interpolated(ref nt) => matches!(&**nt, NtLiteral(..) |

`

514

528

`NtPat(..) |

`

515

529

`NtBlock(..) |

`

516

530

`NtPath(..)),

`

`@@ -533,7 +547,7 @@ impl Token {

`

533

547

`Lifetime(..) | // lifetime bound in trait object

`

534

548

`Lt | BinOp(Shl) | // associated path

`

535

549

`PathSep => true, // global path

`

536

``

`-

Interpolated(ref nt) => matches!(&nt.0, NtTy(..) | NtPath(..)),

`

``

550

`+

Interpolated(ref nt) => matches!(&**nt, NtTy(..) | NtPath(..)),

`

537

551

`// For anonymous structs or unions, which only appear in specific positions

`

538

552

`// (type of struct fields or union fields), we don't consider them as regular types

`

539

553

` _ => false,

`

`@@ -544,7 +558,7 @@ impl Token {

`

544

558

`pub fn can_begin_const_arg(&self) -> bool {

`

545

559

`match self.kind {

`

546

560

`OpenDelim(Delimiter::Brace) => true,

`

547

``

`-

Interpolated(ref nt) => matches!(&nt.0, NtExpr(..) | NtBlock(..) | NtLiteral(..)),

`

``

561

`+

Interpolated(ref nt) => matches!(&**nt, NtExpr(..) | NtBlock(..) | NtLiteral(..)),

`

548

562

` _ => self.can_begin_literal_maybe_minus(),

`

549

563

`}

`

550

564

`}

`

`@@ -589,7 +603,7 @@ impl Token {

`

589

603

`match self.uninterpolate().kind {

`

590

604

`Literal(..) | BinOp(Minus) => true,

`

591

605

`Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,

`

592

``

`-

Interpolated(ref nt) => match &nt.0 {

`

``

606

`+

Interpolated(ref nt) => match &**nt {

`

593

607

`NtLiteral(_) => true,

`

594

608

`NtExpr(e) => match &e.kind {

`

595

609

` ast::ExprKind::Lit(_) => true,

`

`@@ -609,14 +623,9 @@ impl Token {

`

609

623

`/// into the regular identifier or lifetime token it refers to,

`

610

624

`/// otherwise returns the original token.

`

611

625

`pub fn uninterpolate(&self) -> Cow<'_, Token> {

`

612

``

`-

match &self.kind {

`

613

``

`-

Interpolated(nt) => match &nt.0 {

`

614

``

`-

NtIdent(ident, is_raw) => {

`

615

``

`-

Cow::Owned(Token::new(Ident(ident.name, *is_raw), ident.span))

`

616

``

`-

}

`

617

``

`-

NtLifetime(ident) => Cow::Owned(Token::new(Lifetime(ident.name), ident.span)),

`

618

``

`-

_ => Cow::Borrowed(self),

`

619

``

`-

},

`

``

626

`+

match self.kind {

`

``

627

`+

NtIdent(ident, is_raw) => Cow::Owned(Token::new(Ident(ident.name, is_raw), ident.span)),

`

``

628

`+

NtLifetime(ident) => Cow::Owned(Token::new(Lifetime(ident.name), ident.span)),

`

620

629

` _ => Cow::Borrowed(self),

`

621

630

`}

`

622

631

`}

`

`@@ -625,12 +634,9 @@ impl Token {

`

625

634

`#[inline]

`

626

635

`pub fn ident(&self) -> Option<(Ident, IdentIsRaw)> {

`

627

636

`` // We avoid using Token::uninterpolate here because it's slow.

``

628

``

`-

match &self.kind {

`

629

``

`-

&Ident(name, is_raw) => Some((Ident::new(name, self.span), is_raw)),

`

630

``

`-

Interpolated(nt) => match &nt.0 {

`

631

``

`-

NtIdent(ident, is_raw) => Some((*ident, *is_raw)),

`

632

``

`-

_ => None,

`

633

``

`-

},

`

``

637

`+

match self.kind {

`

``

638

`+

Ident(name, is_raw) => Some((Ident::new(name, self.span), is_raw)),

`

``

639

`+

NtIdent(ident, is_raw) => Some((ident, is_raw)),

`

634

640

` _ => None,

`

635

641

`}

`

636

642

`}

`

`@@ -639,12 +645,9 @@ impl Token {

`

639

645

`#[inline]

`

640

646

`pub fn lifetime(&self) -> Option {

`

641

647

`` // We avoid using Token::uninterpolate here because it's slow.

``

642

``

`-

match &self.kind {

`

643

``

`-

&Lifetime(name) => Some(Ident::new(name, self.span)),

`

644

``

`-

Interpolated(nt) => match &nt.0 {

`

645

``

`-

NtLifetime(ident) => Some(*ident),

`

646

``

`-

_ => None,

`

647

``

`-

},

`

``

648

`+

match self.kind {

`

``

649

`+

Lifetime(name) => Some(Ident::new(name, self.span)),

`

``

650

`+

NtLifetime(ident) => Some(ident),

`

648

651

` _ => None,

`

649

652

`}

`

650

653

`}

`

`@@ -668,7 +671,7 @@ impl Token {

`

668

671

`` /// Returns true if the token is an interpolated path.

``

669

672

`fn is_whole_path(&self) -> bool {

`

670

673

`if let Interpolated(nt) = &self.kind

`

671

``

`-

&& let NtPath(..) = &nt.0

`

``

674

`+

&& let NtPath(..) = &**nt

`

672

675

`{

`

673

676

`return true;

`

674

677

`}

`

`@@ -681,7 +684,7 @@ impl Token {

`

681

684

`/// (which happens while parsing the result of macro expansion)?

`

682

685

`pub fn is_whole_expr(&self) -> bool {

`

683

686

`if let Interpolated(nt) = &self.kind

`

684

``

`-

&& let NtExpr() | NtLiteral() | NtPath() | NtBlock() = &nt.0

`

``

687

`+

&& let NtExpr() | NtLiteral() | NtPath() | NtBlock() = &**nt

`

685

688

`{

`

686

689

`return true;

`

687

690

`}

`

`@@ -692,7 +695,7 @@ impl Token {

`

692

695

`` /// Is the token an interpolated block ($b:block)?

``

693

696

`pub fn is_whole_block(&self) -> bool {

`

694

697

`if let Interpolated(nt) = &self.kind

`

695

``

`-

&& let NtBlock(..) = &nt.0

`

``

698

`+

&& let NtBlock(..) = &**nt

`

696

699

`{

`

697

700

`return true;

`

698

701

`}

`

`@@ -833,8 +836,10 @@ impl Token {

`

833

836

``

834

837

`Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq(..) | At | DotDotDot

`

835

838

` | DotDotEq | Comma | Semi | PathSep | RArrow | LArrow | FatArrow | Pound | Dollar

`

836

``

`-

| Question | OpenDelim(..) | CloseDelim(..) | Literal(..) | Ident(..)

`

837

``

`-

| Lifetime(..) | Interpolated(..) | DocComment(..) | Eof => return None,

`

``

839

`+

| Question | OpenDelim(..) | CloseDelim(..) | Literal(..) | Ident(..) | NtIdent(..)

`

``

840

`+

| Lifetime(..) | NtLifetime(..) | Interpolated(..) | DocComment(..) | Eof => {

`

``

841

`+

return None;

`

``

842

`+

}

`

838

843

`};

`

839

844

``

840

845

`Some(Token::new(kind, self.span.to(joint.span)))

`

`@@ -857,8 +862,6 @@ pub enum Nonterminal {

`

857

862

`NtPat(Past::Pat),

`

858

863

`NtExpr(Past::Expr),

`

859

864

`NtTy(Past::Ty),

`

860

``

`-

NtIdent(Ident, IdentIsRaw),

`

861

``

`-

NtLifetime(Ident),

`

862

865

`NtLiteral(Past::Expr),

`

863

866

`/// Stuff inside brackets for attributes

`

864

867

`NtMeta(Past::AttrItem),

`

`@@ -953,7 +956,6 @@ impl Nonterminal {

`

953

956

`NtPat(pat) => pat.span,

`

954

957

`NtExpr(expr) | NtLiteral(expr) => expr.span,

`

955

958

`NtTy(ty) => ty.span,

`

956

``

`-

NtIdent(ident, _) | NtLifetime(ident) => ident.span,

`

957

959

`NtMeta(attr_item) => attr_item.span(),

`

958

960

`NtPath(path) => path.span,

`

959

961

`NtVis(vis) => vis.span,

`

`@@ -969,8 +971,6 @@ impl Nonterminal {

`

969

971

`NtExpr(..) => "expression",

`

970

972

`NtLiteral(..) => "literal",

`

971

973

`NtTy(..) => "type",

`

972

``

`-

NtIdent(..) => "identifier",

`

973

``

`-

NtLifetime(..) => "lifetime",

`

974

974

`NtMeta(..) => "attribute",

`

975

975

`NtPath(..) => "path",

`

976

976

`NtVis(..) => "visibility",

`

`@@ -979,18 +979,12 @@ impl Nonterminal {

`

979

979

`}

`

980

980

``

981

981

`impl PartialEq for Nonterminal {

`

982

``

`-

fn eq(&self, rhs: &Self) -> bool {

`

983

``

`-

match (self, rhs) {

`

984

``

`-

(NtIdent(ident_lhs, is_raw_lhs), NtIdent(ident_rhs, is_raw_rhs)) => {

`

985

``

`-

ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs

`

986

``

`-

}

`

987

``

`-

(NtLifetime(ident_lhs), NtLifetime(ident_rhs)) => ident_lhs == ident_rhs,

`

988

``

`-

// FIXME: Assume that all "complex" nonterminal are not equal, we can't compare them

`

989

``

`-

// correctly based on data from AST. This will prevent them from matching each other

`

990

``

`-

// in macros. The comparison will become possible only when each nonterminal has an

`

991

``

`-

// attached token stream from which it was parsed.

`

992

``

`-

_ => false,

`

993

``

`-

}

`

``

982

`+

fn eq(&self, _rhs: &Self) -> bool {

`

``

983

`+

// FIXME: Assume that all nonterminals are not equal, we can't compare them

`

``

984

`+

// correctly based on data from AST. This will prevent them from matching each other

`

``

985

`+

// in macros. The comparison will become possible only when each nonterminal has an

`

``

986

`+

// attached token stream from which it was parsed.

`

``

987

`+

false

`

994

988

`}

`

995

989

`}

`

996

990

``

`@@ -1003,12 +997,10 @@ impl fmt::Debug for Nonterminal {

`

1003

997

`NtPat(..) => f.pad("NtPat(..)"),

`

1004

998

`NtExpr(..) => f.pad("NtExpr(..)"),

`

1005

999

`NtTy(..) => f.pad("NtTy(..)"),

`

1006

``

`-

NtIdent(..) => f.pad("NtIdent(..)"),

`

1007

1000

`NtLiteral(..) => f.pad("NtLiteral(..)"),

`

1008

1001

`NtMeta(..) => f.pad("NtMeta(..)"),

`

1009

1002

`NtPath(..) => f.pad("NtPath(..)"),

`

1010

1003

`NtVis(..) => f.pad("NtVis(..)"),

`

1011

``

`-

NtLifetime(..) => f.pad("NtLifetime(..)"),

`

1012

1004

`}

`

1013

1005

`}

`

1014

1006

`}

`