Hex Artifact Content
Not logged in

Artifact 0419cf345db715dd2ef3fe7090151ca3940dd095:


0000: 2f 2f 21 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  //! This module 
0010: 69 6d 70 6c 65 6d 65 6e 74 73 20 64 65 63 6c 61  implements decla
0020: 72 61 74 69 76 65 20 6d 61 63 72 6f 73 3a 20 6f  rative macros: o
0030: 6c 64 20 60 6d 61 63 72 6f 5f 72 75 6c 65 73 60  ld `macro_rules`
0040: 20 61 6e 64 20 74 68 65 20 6e 65 77 65 72 0a 2f   and the newer./
0050: 2f 21 20 60 6d 61 63 72 6f 60 2e 20 44 65 63 6c  /! `macro`. Decl
0060: 61 72 61 74 69 76 65 20 6d 61 63 72 6f 73 20 61  arative macros a
0070: 72 65 20 61 6c 73 6f 20 6b 6e 6f 77 6e 20 61 73  re also known as
0080: 20 22 6d 61 63 72 6f 20 62 79 20 65 78 61 6d 70   "macro by examp
0090: 6c 65 22 2c 20 61 6e 64 20 74 68 61 74 27 73 0a  le", and that's.
00a0: 2f 2f 21 20 77 68 79 20 77 65 20 63 61 6c 6c 20  //! why we call 
00b0: 74 68 69 73 20 6d 6f 64 75 6c 65 20 60 6d 62 65  this module `mbe
00c0: 60 2e 20 46 6f 72 20 65 78 74 65 72 6e 61 6c 20  `. For external 
00d0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 2c 20 70  documentation, p
00e0: 72 65 66 65 72 20 74 68 65 0a 2f 2f 21 20 6f 66  refer the.//! of
00f0: 66 69 63 69 61 6c 20 74 65 72 6d 69 6e 6f 6c 6f  ficial terminolo
0100: 67 79 3a 20 22 64 65 63 6c 61 72 61 74 69 76 65  gy: "declarative
0110: 20 6d 61 63 72 6f 73 22 2e 0a 0a 63 72 61 74 65   macros"...crate
0120: 20 6d 6f 64 20 74 72 61 6e 73 63 72 69 62 65 3b   mod transcribe;
0130: 0a 63 72 61 74 65 20 6d 6f 64 20 6d 61 63 72 6f  .crate mod macro
0140: 5f 63 68 65 63 6b 3b 0a 63 72 61 74 65 20 6d 6f  _check;.crate mo
0150: 64 20 6d 61 63 72 6f 5f 70 61 72 73 65 72 3b 0a  d macro_parser;.
0160: 63 72 61 74 65 20 6d 6f 64 20 6d 61 63 72 6f 5f  crate mod macro_
0170: 72 75 6c 65 73 3b 0a 63 72 61 74 65 20 6d 6f 64  rules;.crate mod
0180: 20 71 75 6f 74 65 64 3b 0a 0a 75 73 65 20 73 79   quoted;..use sy
0190: 6e 74 61 78 3a 3a 61 73 74 3b 0a 75 73 65 20 73  ntax::ast;.use s
01a0: 79 6e 74 61 78 3a 3a 74 6f 6b 65 6e 3a 3a 7b 73  yntax::token::{s
01b0: 65 6c 66 2c 20 54 6f 6b 65 6e 2c 20 54 6f 6b 65  elf, Token, Toke
01c0: 6e 4b 69 6e 64 7d 3b 0a 75 73 65 20 73 79 6e 74  nKind};.use synt
01d0: 61 78 3a 3a 74 6f 6b 65 6e 73 74 72 65 61 6d 3a  ax::tokenstream:
01e0: 3a 7b 44 65 6c 69 6d 53 70 61 6e 7d 3b 0a 0a 75  :{DelimSpan};..u
01f0: 73 65 20 73 79 6e 74 61 78 5f 70 6f 73 3a 3a 53  se syntax_pos::S
0200: 70 61 6e 3b 0a 0a 75 73 65 20 72 75 73 74 63 5f  pan;..use rustc_
0210: 64 61 74 61 5f 73 74 72 75 63 74 75 72 65 73 3a  data_structures:
0220: 3a 73 79 6e 63 3a 3a 4c 72 63 3b 0a 0a 2f 2f 2f  :sync::Lrc;..///
0230: 20 43 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75   Contains the su
0240: 62 2d 74 6f 6b 65 6e 2d 74 72 65 65 73 20 6f 66  b-token-trees of
0250: 20 61 20 22 64 65 6c 69 6d 69 74 65 64 22 20 74   a "delimited" t
0260: 6f 6b 65 6e 20 74 72 65 65 2c 20 73 75 63 68 20  oken tree, such 
0270: 61 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  as the contents 
0280: 6f 66 20 60 28 60 2e 20 4e 6f 74 65 0a 2f 2f 2f  of `(`. Note.///
0290: 20 74 68 61 74 20 74 68 65 20 64 65 6c 69 6d 69   that the delimi
02a0: 74 65 72 20 69 74 73 65 6c 66 20 6d 69 67 68 74  ter itself might
02b0: 20 62 65 20 60 4e 6f 44 65 6c 69 6d 60 2e 0a 23   be `NoDelim`..#
02c0: 5b 64 65 72 69 76 65 28 43 6c 6f 6e 65 2c 20 50  [derive(Clone, P
02d0: 61 72 74 69 61 6c 45 71 2c 20 52 75 73 74 63 45  artialEq, RustcE
02e0: 6e 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44  ncodable, RustcD
02f0: 65 63 6f 64 61 62 6c 65 2c 20 44 65 62 75 67 29  ecodable, Debug)
0300: 5d 0a 73 74 72 75 63 74 20 44 65 6c 69 6d 69 74  ].struct Delimit
0310: 65 64 20 7b 0a 20 20 20 20 64 65 6c 69 6d 3a 20  ed {.    delim: 
0320: 74 6f 6b 65 6e 3a 3a 44 65 6c 69 6d 54 6f 6b 65  token::DelimToke
0330: 6e 2c 0a 20 20 20 20 74 74 73 3a 20 56 65 63 3c  n,.    tts: Vec<
0340: 54 6f 6b 65 6e 54 72 65 65 3e 2c 0a 7d 0a 0a 69  TokenTree>,.}..i
0350: 6d 70 6c 20 44 65 6c 69 6d 69 74 65 64 20 7b 0a  mpl Delimited {.
0360: 20 20 20 20 2f 2f 2f 20 52 65 74 75 72 6e 73 20      /// Returns 
0370: 61 20 60 73 65 6c 66 3a 3a 54 6f 6b 65 6e 54 72  a `self::TokenTr
0380: 65 65 60 20 77 69 74 68 20 61 20 60 53 70 61 6e  ee` with a `Span
0390: 60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  ` corresponding 
03a0: 74 6f 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 64  to the opening d
03b0: 65 6c 69 6d 69 74 65 72 2e 0a 20 20 20 20 66 6e  elimiter..    fn
03c0: 20 6f 70 65 6e 5f 74 74 28 26 73 65 6c 66 2c 20   open_tt(&self, 
03d0: 73 70 61 6e 3a 20 44 65 6c 69 6d 53 70 61 6e 29  span: DelimSpan)
03e0: 20 2d 3e 20 54 6f 6b 65 6e 54 72 65 65 20 7b 0a   -> TokenTree {.
03f0: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 54 72 65          TokenTre
0400: 65 3a 3a 74 6f 6b 65 6e 28 74 6f 6b 65 6e 3a 3a  e::token(token::
0410: 4f 70 65 6e 44 65 6c 69 6d 28 73 65 6c 66 2e 64  OpenDelim(self.d
0420: 65 6c 69 6d 29 2c 20 73 70 61 6e 2e 6f 70 65 6e  elim), span.open
0430: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  ).    }..    ///
0440: 20 52 65 74 75 72 6e 73 20 61 20 60 73 65 6c 66   Returns a `self
0450: 3a 3a 54 6f 6b 65 6e 54 72 65 65 60 20 77 69 74  ::TokenTree` wit
0460: 68 20 61 20 60 53 70 61 6e 60 20 63 6f 72 72 65  h a `Span` corre
0470: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
0480: 63 6c 6f 73 69 6e 67 20 64 65 6c 69 6d 69 74 65  closing delimite
0490: 72 2e 0a 20 20 20 20 66 6e 20 63 6c 6f 73 65 5f  r..    fn close_
04a0: 74 74 28 26 73 65 6c 66 2c 20 73 70 61 6e 3a 20  tt(&self, span: 
04b0: 44 65 6c 69 6d 53 70 61 6e 29 20 2d 3e 20 54 6f  DelimSpan) -> To
04c0: 6b 65 6e 54 72 65 65 20 7b 0a 20 20 20 20 20 20  kenTree {.      
04d0: 20 20 54 6f 6b 65 6e 54 72 65 65 3a 3a 74 6f 6b    TokenTree::tok
04e0: 65 6e 28 74 6f 6b 65 6e 3a 3a 43 6c 6f 73 65 44  en(token::CloseD
04f0: 65 6c 69 6d 28 73 65 6c 66 2e 64 65 6c 69 6d 29  elim(self.delim)
0500: 2c 20 73 70 61 6e 2e 63 6c 6f 73 65 29 0a 20 20  , span.close).  
0510: 20 20 7d 0a 7d 0a 0a 23 5b 64 65 72 69 76 65 28    }.}..#[derive(
0520: 43 6c 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45 71  Clone, PartialEq
0530: 2c 20 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65  , RustcEncodable
0540: 2c 20 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65  , RustcDecodable
0550: 2c 20 44 65 62 75 67 29 5d 0a 73 74 72 75 63 74  , Debug)].struct
0560: 20 53 65 71 75 65 6e 63 65 52 65 70 65 74 69 74   SequenceRepetit
0570: 69 6f 6e 20 7b 0a 20 20 20 20 2f 2f 2f 20 54 68  ion {.    /// Th
0580: 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f  e sequence of to
0590: 6b 65 6e 20 74 72 65 65 73 0a 20 20 20 20 74 74  ken trees.    tt
05a0: 73 3a 20 56 65 63 3c 54 6f 6b 65 6e 54 72 65 65  s: Vec<TokenTree
05b0: 3e 2c 0a 20 20 20 20 2f 2f 2f 20 54 68 65 20 6f  >,.    /// The o
05c0: 70 74 69 6f 6e 61 6c 20 73 65 70 61 72 61 74 6f  ptional separato
05d0: 72 0a 20 20 20 20 73 65 70 61 72 61 74 6f 72 3a  r.    separator:
05e0: 20 4f 70 74 69 6f 6e 3c 54 6f 6b 65 6e 3e 2c 0a   Option<Token>,.
05f0: 20 20 20 20 2f 2f 2f 20 57 68 65 74 68 65 72 20      /// Whether 
0600: 74 68 65 20 73 65 71 75 65 6e 63 65 20 63 61 6e  the sequence can
0610: 20 62 65 20 72 65 70 65 61 74 65 64 20 7a 65 72   be repeated zer
0620: 6f 20 28 2a 29 2c 20 6f 72 20 6f 6e 65 20 6f 72  o (*), or one or
0630: 20 6d 6f 72 65 20 74 69 6d 65 73 20 28 2b 29 0a   more times (+).
0640: 20 20 20 20 6b 6c 65 65 6e 65 3a 20 4b 6c 65 65      kleene: Klee
0650: 6e 65 54 6f 6b 65 6e 2c 0a 20 20 20 20 2f 2f 2f  neToken,.    ///
0660: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 60   The number of `
0670: 4d 61 74 63 68 60 73 20 74 68 61 74 20 61 70 70  Match`s that app
0680: 65 61 72 20 69 6e 20 74 68 65 20 73 65 71 75 65  ear in the seque
0690: 6e 63 65 20 28 61 6e 64 20 73 75 62 73 65 71 75  nce (and subsequ
06a0: 65 6e 63 65 73 29 0a 20 20 20 20 6e 75 6d 5f 63  ences).    num_c
06b0: 61 70 74 75 72 65 73 3a 20 75 73 69 7a 65 2c 0a  aptures: usize,.
06c0: 7d 0a 0a 23 5b 64 65 72 69 76 65 28 43 6c 6f 6e  }..#[derive(Clon
06d0: 65 2c 20 50 61 72 74 69 61 6c 45 71 2c 20 52 75  e, PartialEq, Ru
06e0: 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20 52 75  stcEncodable, Ru
06f0: 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20 44 65  stcDecodable, De
0700: 62 75 67 2c 20 43 6f 70 79 29 5d 0a 73 74 72 75  bug, Copy)].stru
0710: 63 74 20 4b 6c 65 65 6e 65 54 6f 6b 65 6e 20 7b  ct KleeneToken {
0720: 0a 20 20 20 20 73 70 61 6e 3a 20 53 70 61 6e 2c  .    span: Span,
0730: 0a 20 20 20 20 6f 70 3a 20 4b 6c 65 65 6e 65 4f  .    op: KleeneO
0740: 70 2c 0a 7d 0a 0a 69 6d 70 6c 20 4b 6c 65 65 6e  p,.}..impl Kleen
0750: 65 54 6f 6b 65 6e 20 7b 0a 20 20 20 20 66 6e 20  eToken {.    fn 
0760: 6e 65 77 28 6f 70 3a 20 4b 6c 65 65 6e 65 4f 70  new(op: KleeneOp
0770: 2c 20 73 70 61 6e 3a 20 53 70 61 6e 29 20 2d 3e  , span: Span) ->
0780: 20 4b 6c 65 65 6e 65 54 6f 6b 65 6e 20 7b 0a 20   KleeneToken {. 
0790: 20 20 20 20 20 20 20 4b 6c 65 65 6e 65 54 6f 6b         KleeneTok
07a0: 65 6e 20 7b 20 73 70 61 6e 2c 20 6f 70 20 7d 0a  en { span, op }.
07b0: 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 2f 20 41 20 4b      }.}../// A K
07c0: 6c 65 65 6e 65 2d 73 74 79 6c 65 20 5b 72 65 70  leene-style [rep
07d0: 65 74 69 74 69 6f 6e 20 6f 70 65 72 61 74 6f 72  etition operator
07e0: 5d 28 68 74 74 70 3a 2f 2f 65 6e 2e 77 69 6b 69  ](http://en.wiki
07f0: 70 65 64 69 61 2e 6f 72 67 2f 77 69 6b 69 2f 4b  pedia.org/wiki/K
0800: 6c 65 65 6e 65 5f 73 74 61 72 29 0a 2f 2f 2f 20  leene_star)./// 
0810: 66 6f 72 20 74 6f 6b 65 6e 20 73 65 71 75 65 6e  for token sequen
0820: 63 65 73 2e 0a 23 5b 64 65 72 69 76 65 28 43 6c  ces..#[derive(Cl
0830: 6f 6e 65 2c 20 50 61 72 74 69 61 6c 45 71 2c 20  one, PartialEq, 
0840: 52 75 73 74 63 45 6e 63 6f 64 61 62 6c 65 2c 20  RustcEncodable, 
0850: 52 75 73 74 63 44 65 63 6f 64 61 62 6c 65 2c 20  RustcDecodable, 
0860: 44 65 62 75 67 2c 20 43 6f 70 79 29 5d 0a 65 6e  Debug, Copy)].en
0870: 75 6d 20 4b 6c 65 65 6e 65 4f 70 20 7b 0a 20 20  um KleeneOp {.  
0880: 20 20 2f 2f 2f 20 4b 6c 65 65 6e 65 20 73 74 61    /// Kleene sta
0890: 72 20 28 60 2a 60 29 20 66 6f 72 20 7a 65 72 6f  r (`*`) for zero
08a0: 20 6f 72 20 6d 6f 72 65 20 72 65 70 65 74 69 74   or more repetit
08b0: 69 6f 6e 73 0a 20 20 20 20 5a 65 72 6f 4f 72 4d  ions.    ZeroOrM
08c0: 6f 72 65 2c 0a 20 20 20 20 2f 2f 2f 20 4b 6c 65  ore,.    /// Kle
08d0: 65 6e 65 20 70 6c 75 73 20 28 60 2b 60 29 20 66  ene plus (`+`) f
08e0: 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72  or one or more r
08f0: 65 70 65 74 69 74 69 6f 6e 73 0a 20 20 20 20 4f  epetitions.    O
0900: 6e 65 4f 72 4d 6f 72 65 2c 0a 20 20 20 20 2f 2f  neOrMore,.    //
0910: 2f 20 4b 6c 65 65 6e 65 20 6f 70 74 69 6f 6e 61  / Kleene optiona
0920: 6c 20 28 60 3f 60 29 20 66 6f 72 20 7a 65 72 6f  l (`?`) for zero
0930: 20 6f 72 20 6f 6e 65 20 72 65 70 74 69 74 69 6f   or one reptitio
0940: 6e 73 0a 20 20 20 20 5a 65 72 6f 4f 72 4f 6e 65  ns.    ZeroOrOne
0950: 2c 0a 7d 0a 0a 2f 2f 2f 20 53 69 6d 69 6c 61 72  ,.}../// Similar
0960: 20 74 6f 20 60 74 6f 6b 65 6e 73 74 72 65 61 6d   to `tokenstream
0970: 3a 3a 54 6f 6b 65 6e 54 72 65 65 60 2c 20 65 78  ::TokenTree`, ex
0980: 63 65 70 74 20 74 68 61 74 20 60 24 69 60 2c 20  cept that `$i`, 
0990: 60 24 69 3a 69 64 65 6e 74 60 2c 20 61 6e 64 20  `$i:ident`, and 
09a0: 60 24 28 2e 2e 2e 29 60 0a 2f 2f 2f 20 61 72 65  `$(...)`./// are
09b0: 20 22 66 69 72 73 74 2d 63 6c 61 73 73 22 20 74   "first-class" t
09c0: 6f 6b 65 6e 20 74 72 65 65 73 2e 20 55 73 65 66  oken trees. Usef
09d0: 75 6c 20 66 6f 72 20 70 61 72 73 69 6e 67 20 6d  ul for parsing m
09e0: 61 63 72 6f 73 2e 0a 23 5b 64 65 72 69 76 65 28  acros..#[derive(
09f0: 44 65 62 75 67 2c 20 43 6c 6f 6e 65 2c 20 50 61  Debug, Clone, Pa
0a00: 72 74 69 61 6c 45 71 2c 20 52 75 73 74 63 45 6e  rtialEq, RustcEn
0a10: 63 6f 64 61 62 6c 65 2c 20 52 75 73 74 63 44 65  codable, RustcDe
0a20: 63 6f 64 61 62 6c 65 29 5d 0a 65 6e 75 6d 20 54  codable)].enum T
0a30: 6f 6b 65 6e 54 72 65 65 20 7b 0a 20 20 20 20 54  okenTree {.    T
0a40: 6f 6b 65 6e 28 54 6f 6b 65 6e 29 2c 0a 20 20 20  oken(Token),.   
0a50: 20 44 65 6c 69 6d 69 74 65 64 28 44 65 6c 69 6d   Delimited(Delim
0a60: 53 70 61 6e 2c 20 4c 72 63 3c 44 65 6c 69 6d 69  Span, Lrc<Delimi
0a70: 74 65 64 3e 29 2c 0a 20 20 20 20 2f 2f 2f 20 41  ted>),.    /// A
0a80: 20 6b 6c 65 65 6e 65 2d 73 74 79 6c 65 20 72 65   kleene-style re
0a90: 70 65 74 69 74 69 6f 6e 20 73 65 71 75 65 6e 63  petition sequenc
0aa0: 65 0a 20 20 20 20 53 65 71 75 65 6e 63 65 28 44  e.    Sequence(D
0ab0: 65 6c 69 6d 53 70 61 6e 2c 20 4c 72 63 3c 53 65  elimSpan, Lrc<Se
0ac0: 71 75 65 6e 63 65 52 65 70 65 74 69 74 69 6f 6e  quenceRepetition
0ad0: 3e 29 2c 0a 20 20 20 20 2f 2f 2f 20 65 2e 67 2e  >),.    /// e.g.
0ae0: 2c 20 60 24 76 61 72 60 0a 20 20 20 20 4d 65 74  , `$var`.    Met
0af0: 61 56 61 72 28 53 70 61 6e 2c 20 61 73 74 3a 3a  aVar(Span, ast::
0b00: 49 64 65 6e 74 29 2c 0a 20 20 20 20 2f 2f 2f 20  Ident),.    /// 
0b10: 65 2e 67 2e 2c 20 60 24 76 61 72 3a 65 78 70 72  e.g., `$var:expr
0b20: 60 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  `. This is only 
0b30: 75 73 65 64 20 69 6e 20 74 68 65 20 6c 65 66 74  used in the left
0b40: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 4d 42   hand side of MB
0b50: 45 20 6d 61 63 72 6f 73 2e 0a 20 20 20 20 4d 65  E macros..    Me
0b60: 74 61 56 61 72 44 65 63 6c 28 0a 20 20 20 20 20  taVarDecl(.     
0b70: 20 20 20 53 70 61 6e 2c 0a 20 20 20 20 20 20 20     Span,.       
0b80: 20 61 73 74 3a 3a 49 64 65 6e 74 2c 20 2f 2a 20   ast::Ident, /* 
0b90: 6e 61 6d 65 20 74 6f 20 62 69 6e 64 20 2a 2f 0a  name to bind */.
0ba0: 20 20 20 20 20 20 20 20 61 73 74 3a 3a 49 64 65          ast::Ide
0bb0: 6e 74 2c 20 2f 2a 20 6b 69 6e 64 20 6f 66 20 6e  nt, /* kind of n
0bc0: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
0bd0: 20 20 29 2c 0a 7d 0a 0a 69 6d 70 6c 20 54 6f 6b    ),.}..impl Tok
0be0: 65 6e 54 72 65 65 20 7b 0a 20 20 20 20 2f 2f 2f  enTree {.    ///
0bf0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
0c00: 65 72 20 6f 66 20 74 6f 6b 65 6e 73 20 69 6e 20  er of tokens in 
0c10: 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20 66 6e  the tree..    fn
0c20: 20 6c 65 6e 28 26 73 65 6c 66 29 20 2d 3e 20 75   len(&self) -> u
0c30: 73 69 7a 65 20 7b 0a 20 20 20 20 20 20 20 20 6d  size {.        m
0c40: 61 74 63 68 20 2a 73 65 6c 66 20 7b 0a 20 20 20  atch *self {.   
0c50: 20 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 54 72           TokenTr
0c60: 65 65 3a 3a 44 65 6c 69 6d 69 74 65 64 28 5f 2c  ee::Delimited(_,
0c70: 20 72 65 66 20 64 65 6c 69 6d 65 64 29 20 3d 3e   ref delimed) =>
0c80: 20 6d 61 74 63 68 20 64 65 6c 69 6d 65 64 2e 64   match delimed.d
0c90: 65 6c 69 6d 20 7b 0a 20 20 20 20 20 20 20 20 20  elim {.         
0ca0: 20 20 20 20 20 20 20 74 6f 6b 65 6e 3a 3a 4e 6f         token::No
0cb0: 44 65 6c 69 6d 20 3d 3e 20 64 65 6c 69 6d 65 64  Delim => delimed
0cc0: 2e 74 74 73 2e 6c 65 6e 28 29 2c 0a 20 20 20 20  .tts.len(),.    
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e              _ =>
0ce0: 20 64 65 6c 69 6d 65 64 2e 74 74 73 2e 6c 65 6e   delimed.tts.len
0cf0: 28 29 20 2b 20 32 2c 0a 20 20 20 20 20 20 20 20  () + 2,.        
0d00: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 20      },.         
0d10: 20 20 20 54 6f 6b 65 6e 54 72 65 65 3a 3a 53 65     TokenTree::Se
0d20: 71 75 65 6e 63 65 28 5f 2c 20 72 65 66 20 73 65  quence(_, ref se
0d30: 71 29 20 3d 3e 20 73 65 71 2e 74 74 73 2e 6c 65  q) => seq.tts.le
0d40: 6e 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n(),.           
0d50: 20 5f 20 3d 3e 20 30 2c 0a 20 20 20 20 20 20 20   _ => 0,.       
0d60: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
0d70: 2f 20 52 65 74 75 72 6e 73 20 60 74 72 75 65 60  / Returns `true`
0d80: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 74 6f   if the given to
0d90: 6b 65 6e 20 74 72 65 65 20 69 73 20 64 65 6c 69  ken tree is deli
0da0: 6d 69 74 65 64 2e 0a 20 20 20 20 66 6e 20 69 73  mited..    fn is
0db0: 5f 64 65 6c 69 6d 69 74 65 64 28 26 73 65 6c 66  _delimited(&self
0dc0: 29 20 2d 3e 20 62 6f 6f 6c 20 7b 0a 20 20 20 20  ) -> bool {.    
0dd0: 20 20 20 20 6d 61 74 63 68 20 2a 73 65 6c 66 20      match *self 
0de0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 54 6f  {.            To
0df0: 6b 65 6e 54 72 65 65 3a 3a 44 65 6c 69 6d 69 74  kenTree::Delimit
0e00: 65 64 28 2e 2e 29 20 3d 3e 20 74 72 75 65 2c 0a  ed(..) => true,.
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e              _ =>
0e20: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20   false,.        
0e30: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f  }.    }..    ///
0e40: 20 52 65 74 75 72 6e 73 20 60 74 72 75 65 60 20   Returns `true` 
0e50: 69 66 20 74 68 65 20 67 69 76 65 6e 20 74 6f 6b  if the given tok
0e60: 65 6e 20 74 72 65 65 20 69 73 20 61 20 74 6f 6b  en tree is a tok
0e70: 65 6e 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  en of the given 
0e80: 6b 69 6e 64 2e 0a 20 20 20 20 66 6e 20 69 73 5f  kind..    fn is_
0e90: 74 6f 6b 65 6e 28 26 73 65 6c 66 2c 20 65 78 70  token(&self, exp
0ea0: 65 63 74 65 64 5f 6b 69 6e 64 3a 20 26 54 6f 6b  ected_kind: &Tok
0eb0: 65 6e 4b 69 6e 64 29 20 2d 3e 20 62 6f 6f 6c 20  enKind) -> bool 
0ec0: 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
0ed0: 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20  self {.         
0ee0: 20 20 20 54 6f 6b 65 6e 54 72 65 65 3a 3a 54 6f     TokenTree::To
0ef0: 6b 65 6e 28 54 6f 6b 65 6e 20 7b 20 6b 69 6e 64  ken(Token { kind
0f00: 3a 20 61 63 74 75 61 6c 5f 6b 69 6e 64 2c 20 2e  : actual_kind, .
0f10: 2e 20 7d 29 20 3d 3e 20 61 63 74 75 61 6c 5f 6b  . }) => actual_k
0f20: 69 6e 64 20 3d 3d 20 65 78 70 65 63 74 65 64 5f  ind == expected_
0f30: 6b 69 6e 64 2c 0a 20 20 20 20 20 20 20 20 20 20  kind,.          
0f40: 20 20 5f 20 3d 3e 20 66 61 6c 73 65 2c 0a 20 20    _ => false,.  
0f50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
0f60: 20 20 20 2f 2f 2f 20 47 65 74 73 20 74 68 65 20     /// Gets the 
0f70: 60 69 6e 64 65 78 60 2d 74 68 20 73 75 62 2d 74  `index`-th sub-t
0f80: 6f 6b 65 6e 2d 74 72 65 65 2e 20 54 68 69 73 20  oken-tree. This 
0f90: 6f 6e 6c 79 20 6d 61 6b 65 73 20 73 65 6e 73 65  only makes sense
0fa0: 20 66 6f 72 20 64 65 6c 69 6d 69 74 65 64 20 74   for delimited t
0fb0: 72 65 65 73 20 61 6e 64 20 73 65 71 75 65 6e 63  rees and sequenc
0fc0: 65 73 2e 0a 20 20 20 20 66 6e 20 67 65 74 5f 74  es..    fn get_t
0fd0: 74 28 26 73 65 6c 66 2c 20 69 6e 64 65 78 3a 20  t(&self, index: 
0fe0: 75 73 69 7a 65 29 20 2d 3e 20 54 6f 6b 65 6e 54  usize) -> TokenT
0ff0: 72 65 65 20 7b 0a 20 20 20 20 20 20 20 20 6d 61  ree {.        ma
1000: 74 63 68 20 28 73 65 6c 66 2c 20 69 6e 64 65 78  tch (self, index
1010: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1020: 28 26 54 6f 6b 65 6e 54 72 65 65 3a 3a 44 65 6c  (&TokenTree::Del
1030: 69 6d 69 74 65 64 28 5f 2c 20 72 65 66 20 64 65  imited(_, ref de
1040: 6c 69 6d 65 64 29 2c 20 5f 29 20 69 66 20 64 65  limed), _) if de
1050: 6c 69 6d 65 64 2e 64 65 6c 69 6d 20 3d 3d 20 74  limed.delim == t
1060: 6f 6b 65 6e 3a 3a 4e 6f 44 65 6c 69 6d 20 3d 3e  oken::NoDelim =>
1070: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1080: 20 20 20 64 65 6c 69 6d 65 64 2e 74 74 73 5b 69     delimed.tts[i
1090: 6e 64 65 78 5d 2e 63 6c 6f 6e 65 28 29 0a 20 20  ndex].clone().  
10a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10b0: 20 20 20 20 20 20 20 20 28 26 54 6f 6b 65 6e 54          (&TokenT
10c0: 72 65 65 3a 3a 44 65 6c 69 6d 69 74 65 64 28 73  ree::Delimited(s
10d0: 70 61 6e 2c 20 72 65 66 20 64 65 6c 69 6d 65 64  pan, ref delimed
10e0: 29 2c 20 5f 29 20 3d 3e 20 7b 0a 20 20 20 20 20  ), _) => {.     
10f0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 6e             if in
1100: 64 65 78 20 3d 3d 20 30 20 7b 0a 20 20 20 20 20  dex == 0 {.     
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1120: 65 74 75 72 6e 20 64 65 6c 69 6d 65 64 2e 6f 70  eturn delimed.op
1130: 65 6e 5f 74 74 28 73 70 61 6e 29 3b 0a 20 20 20  en_tt(span);.   
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1160: 66 20 69 6e 64 65 78 20 3d 3d 20 64 65 6c 69 6d  f index == delim
1170: 65 64 2e 74 74 73 2e 6c 65 6e 28 29 20 2b 20 31  ed.tts.len() + 1
1180: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1190: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 65         return de
11a0: 6c 69 6d 65 64 2e 63 6c 6f 73 65 5f 74 74 28 73  limed.close_tt(s
11b0: 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pan);.          
11c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11d0: 20 20 20 20 20 20 20 20 64 65 6c 69 6d 65 64 2e          delimed.
11e0: 74 74 73 5b 69 6e 64 65 78 20 2d 20 31 5d 2e 63  tts[index - 1].c
11f0: 6c 6f 6e 65 28 29 0a 20 20 20 20 20 20 20 20 20  lone().         
1200: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1210: 20 28 26 54 6f 6b 65 6e 54 72 65 65 3a 3a 53 65   (&TokenTree::Se
1220: 71 75 65 6e 63 65 28 5f 2c 20 72 65 66 20 73 65  quence(_, ref se
1230: 71 29 2c 20 5f 29 20 3d 3e 20 73 65 71 2e 74 74  q), _) => seq.tt
1240: 73 5b 69 6e 64 65 78 5d 2e 63 6c 6f 6e 65 28 29  s[index].clone()
1250: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 5f 20  ,.            _ 
1260: 3d 3e 20 70 61 6e 69 63 21 28 22 43 61 6e 6e 6f  => panic!("Canno
1270: 74 20 65 78 70 61 6e 64 20 61 20 74 6f 6b 65 6e  t expand a token
1280: 20 74 72 65 65 22 29 2c 0a 20 20 20 20 20 20 20   tree"),.       
1290: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f   }.    }..    //
12a0: 2f 20 52 65 74 72 69 65 76 65 73 20 74 68 65 20  / Retrieves the 
12b0: 60 54 6f 6b 65 6e 54 72 65 65 60 27 73 20 73 70  `TokenTree`'s sp
12c0: 61 6e 2e 0a 20 20 20 20 66 6e 20 73 70 61 6e 28  an..    fn span(
12d0: 26 73 65 6c 66 29 20 2d 3e 20 53 70 61 6e 20 7b  &self) -> Span {
12e0: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a  .        match *
12f0: 73 65 6c 66 20 7b 0a 20 20 20 20 20 20 20 20 20  self {.         
1300: 20 20 20 54 6f 6b 65 6e 54 72 65 65 3a 3a 54 6f     TokenTree::To
1310: 6b 65 6e 28 54 6f 6b 65 6e 20 7b 20 73 70 61 6e  ken(Token { span
1320: 2c 20 2e 2e 20 7d 29 0a 20 20 20 20 20 20 20 20  , .. }).        
1330: 20 20 20 20 7c 20 54 6f 6b 65 6e 54 72 65 65 3a      | TokenTree:
1340: 3a 4d 65 74 61 56 61 72 28 73 70 61 6e 2c 20 5f  :MetaVar(span, _
1350: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 20  ).            | 
1360: 54 6f 6b 65 6e 54 72 65 65 3a 3a 4d 65 74 61 56  TokenTree::MetaV
1370: 61 72 44 65 63 6c 28 73 70 61 6e 2c 20 5f 2c 20  arDecl(span, _, 
1380: 5f 29 20 3d 3e 20 73 70 61 6e 2c 0a 20 20 20 20  _) => span,.    
1390: 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 54 72 65          TokenTre
13a0: 65 3a 3a 44 65 6c 69 6d 69 74 65 64 28 73 70 61  e::Delimited(spa
13b0: 6e 2c 20 5f 29 20 7c 20 54 6f 6b 65 6e 54 72 65  n, _) | TokenTre
13c0: 65 3a 3a 53 65 71 75 65 6e 63 65 28 73 70 61 6e  e::Sequence(span
13d0: 2c 20 5f 29 20 3d 3e 20 73 70 61 6e 2e 65 6e 74  , _) => span.ent
13e0: 69 72 65 28 29 2c 0a 20 20 20 20 20 20 20 20 7d  ire(),.        }
13f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 74  .    }..    fn t
1400: 6f 6b 65 6e 28 6b 69 6e 64 3a 20 54 6f 6b 65 6e  oken(kind: Token
1410: 4b 69 6e 64 2c 20 73 70 61 6e 3a 20 53 70 61 6e  Kind, span: Span
1420: 29 20 2d 3e 20 54 6f 6b 65 6e 54 72 65 65 20 7b  ) -> TokenTree {
1430: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 54 72  .        TokenTr
1440: 65 65 3a 3a 54 6f 6b 65 6e 28 54 6f 6b 65 6e 3a  ee::Token(Token:
1450: 3a 6e 65 77 28 6b 69 6e 64 2c 20 73 70 61 6e 29  :new(kind, span)
1460: 29 0a 20 20 20 20 7d 0a 7d 0a                    ).    }.}.