Hex Artifact Content
Not logged in

Artifact d4681592f91067140dba01bb972bd6585f091389:


0000: 75 73 65 20 41 72 67 75 6d 65 6e 74 54 79 70 65  use ArgumentType
0010: 3a 3a 2a 3b 0a 75 73 65 20 50 6f 73 69 74 69 6f  ::*;.use Positio
0020: 6e 3a 3a 2a 3b 0a 0a 75 73 65 20 66 6d 74 5f 6d  n::*;..use fmt_m
0030: 61 63 72 6f 73 20 61 73 20 70 61 72 73 65 3b 0a  acros as parse;.
0040: 0a 75 73 65 20 65 72 72 6f 72 73 3a 3a 44 69 61  .use errors::Dia
0050: 67 6e 6f 73 74 69 63 42 75 69 6c 64 65 72 3b 0a  gnosticBuilder;.
0060: 75 73 65 20 65 72 72 6f 72 73 3a 3a 41 70 70 6c  use errors::Appl
0070: 69 63 61 62 69 6c 69 74 79 3b 0a 75 73 65 20 65  icability;.use e
0080: 72 72 6f 72 73 3a 3a 70 6c 75 72 61 6c 69 7a 65  rrors::pluralize
0090: 3b 0a 0a 75 73 65 20 73 79 6e 74 61 78 3a 3a 61  ;..use syntax::a
00a0: 73 74 3b 0a 75 73 65 20 73 79 6e 74 61 78 5f 65  st;.use syntax_e
00b0: 78 70 61 6e 64 3a 3a 62 61 73 65 3a 3a 7b 73 65  xpand::base::{se
00c0: 6c 66 2c 20 2a 7d 3b 0a 75 73 65 20 73 79 6e 74  lf, *};.use synt
00d0: 61 78 3a 3a 74 6f 6b 65 6e 3b 0a 75 73 65 20 73  ax::token;.use s
00e0: 79 6e 74 61 78 3a 3a 70 74 72 3a 3a 50 3b 0a 75  yntax::ptr::P;.u
00f0: 73 65 20 73 79 6e 74 61 78 3a 3a 73 79 6d 62 6f  se syntax::symbo
0100: 6c 3a 3a 7b 53 79 6d 62 6f 6c 2c 20 73 79 6d 7d  l::{Symbol, sym}
0110: 3b 0a 75 73 65 20 73 79 6e 74 61 78 3a 3a 74 6f  ;.use syntax::to
0120: 6b 65 6e 73 74 72 65 61 6d 3a 3a 54 6f 6b 65 6e  kenstream::Token
0130: 53 74 72 65 61 6d 3b 0a 75 73 65 20 73 79 6e 74  Stream;.use synt
0140: 61 78 5f 70 6f 73 3a 3a 7b 4d 75 6c 74 69 53 70  ax_pos::{MultiSp
0150: 61 6e 2c 20 53 70 61 6e 7d 3b 0a 0a 75 73 65 20  an, Span};..use 
0160: 72 75 73 74 63 5f 64 61 74 61 5f 73 74 72 75 63  rustc_data_struc
0170: 74 75 72 65 73 3a 3a 66 78 3a 3a 7b 46 78 48 61  tures::fx::{FxHa
0180: 73 68 4d 61 70 2c 20 46 78 48 61 73 68 53 65 74  shMap, FxHashSet
0190: 7d 3b 0a 75 73 65 20 73 74 64 3a 3a 62 6f 72 72  };.use std::borr
01a0: 6f 77 3a 3a 43 6f 77 3b 0a 75 73 65 20 73 74 64  ow::Cow;.use std
01b0: 3a 3a 63 6f 6c 6c 65 63 74 69 6f 6e 73 3a 3a 68  ::collections::h
01c0: 61 73 68 5f 6d 61 70 3a 3a 45 6e 74 72 79 3b 0a  ash_map::Entry;.
01d0: 0a 23 5b 64 65 72 69 76 65 28 50 61 72 74 69 61  .#[derive(Partia
01e0: 6c 45 71 29 5d 0a 65 6e 75 6d 20 41 72 67 75 6d  lEq)].enum Argum
01f0: 65 6e 74 54 79 70 65 20 7b 0a 20 20 20 20 50 6c  entType {.    Pl
0200: 61 63 65 68 6f 6c 64 65 72 28 26 27 73 74 61 74  aceholder(&'stat
0210: 69 63 20 73 74 72 29 2c 0a 20 20 20 20 43 6f 75  ic str),.    Cou
0220: 6e 74 2c 0a 7d 0a 0a 65 6e 75 6d 20 50 6f 73 69  nt,.}..enum Posi
0230: 74 69 6f 6e 20 7b 0a 20 20 20 20 45 78 61 63 74  tion {.    Exact
0240: 28 75 73 69 7a 65 29 2c 0a 20 20 20 20 4e 61 6d  (usize),.    Nam
0250: 65 64 28 53 79 6d 62 6f 6c 29 2c 0a 7d 0a 0a 73  ed(Symbol),.}..s
0260: 74 72 75 63 74 20 43 6f 6e 74 65 78 74 3c 27 61  truct Context<'a
0270: 2c 20 27 62 3e 20 7b 0a 20 20 20 20 65 63 78 3a  , 'b> {.    ecx:
0280: 20 26 27 61 20 6d 75 74 20 45 78 74 43 74 78 74   &'a mut ExtCtxt
0290: 3c 27 62 3e 2c 0a 20 20 20 20 2f 2f 2f 20 54 68  <'b>,.    /// Th
02a0: 65 20 6d 61 63 72 6f 27 73 20 63 61 6c 6c 20 73  e macro's call s
02b0: 69 74 65 2e 20 52 65 66 65 72 65 6e 63 65 73 20  ite. References 
02c0: 74 6f 20 75 6e 73 74 61 62 6c 65 20 66 6f 72 6d  to unstable form
02d0: 61 74 74 69 6e 67 20 69 6e 74 65 72 6e 61 6c 73  atting internals
02e0: 20 6d 75 73 74 0a 20 20 20 20 2f 2f 2f 20 75 73   must.    /// us
02f0: 65 20 74 68 69 73 20 73 70 61 6e 20 74 6f 20 70  e this span to p
0300: 61 73 73 20 74 68 65 20 73 74 61 62 69 6c 69 74  ass the stabilit
0310: 79 20 63 68 65 63 6b 65 72 2e 0a 20 20 20 20 6d  y checker..    m
0320: 61 63 73 70 3a 20 53 70 61 6e 2c 0a 20 20 20 20  acsp: Span,.    
0330: 2f 2f 2f 20 54 68 65 20 73 70 61 6e 20 6f 66 20  /// The span of 
0340: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  the format strin
0350: 67 20 6c 69 74 65 72 61 6c 2e 0a 20 20 20 20 66  g literal..    f
0360: 6d 74 73 70 3a 20 53 70 61 6e 2c 0a 0a 20 20 20  mtsp: Span,..   
0370: 20 2f 2f 2f 20 4c 69 73 74 20 6f 66 20 70 61 72   /// List of par
0380: 73 65 64 20 61 72 67 75 6d 65 6e 74 20 65 78 70  sed argument exp
0390: 72 65 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2f 2f  ressions..    //
03a0: 2f 20 4e 61 6d 65 64 20 65 78 70 72 65 73 73 69  / Named expressi
03b0: 6f 6e 73 20 61 72 65 20 72 65 73 6f 6c 76 65 64  ons are resolved
03c0: 20 65 61 72 6c 79 2c 20 61 6e 64 20 61 72 65 20   early, and are 
03d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
03e0: 65 6e 64 20 6f 66 0a 20 20 20 20 2f 2f 2f 20 61  end of.    /// a
03f0: 72 67 75 6d 65 6e 74 20 65 78 70 72 65 73 73 69  rgument expressi
0400: 6f 6e 73 2e 0a 20 20 20 20 2f 2f 2f 0a 20 20 20  ons..    ///.   
0410: 20 2f 2f 2f 20 45 78 61 6d 70 6c 65 20 73 68 6f   /// Example sho
0420: 77 69 6e 67 20 74 68 65 20 76 61 72 69 6f 75 73  wing the various
0430: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
0440: 20 69 6e 20 6d 6f 74 69 6f 6e 3a 0a 20 20 20 20   in motion:.    
0450: 2f 2f 2f 0a 20 20 20 20 2f 2f 2f 20 2a 20 4f 72  ///.    /// * Or
0460: 69 67 69 6e 61 6c 3a 20 60 22 7b 66 6f 6f 3a 6f  iginal: `"{foo:o
0470: 7d 20 7b 3a 6f 7d 20 7b 66 6f 6f 3a 78 7d 20 7b  } {:o} {foo:x} {
0480: 30 3a 78 7d 20 7b 31 3a 6f 7d 20 7b 3a 78 7d 20  0:x} {1:o} {:x} 
0490: 7b 31 3a 78 7d 20 7b 30 3a 6f 7d 22 60 0a 20 20  {1:x} {0:o}"`.  
04a0: 20 20 2f 2f 2f 20 2a 20 49 6d 70 6c 69 63 69 74    /// * Implicit
04b0: 20 61 72 67 75 6d 65 6e 74 20 72 65 73 6f 6c 75   argument resolu
04c0: 74 69 6f 6e 3a 20 60 22 7b 66 6f 6f 3a 6f 7d 20  tion: `"{foo:o} 
04d0: 7b 30 3a 6f 7d 20 7b 66 6f 6f 3a 78 7d 20 7b 30  {0:o} {foo:x} {0
04e0: 3a 78 7d 20 7b 31 3a 6f 7d 20 7b 31 3a 78 7d 20  :x} {1:o} {1:x} 
04f0: 7b 31 3a 78 7d 20 7b 30 3a 6f 7d 22 60 0a 20 20  {1:x} {0:o}"`.  
0500: 20 20 2f 2f 2f 20 2a 20 4e 61 6d 65 20 72 65 73    /// * Name res
0510: 6f 6c 75 74 69 6f 6e 3a 20 60 22 7b 32 3a 6f 7d  olution: `"{2:o}
0520: 20 7b 30 3a 6f 7d 20 7b 32 3a 78 7d 20 7b 30 3a   {0:o} {2:x} {0:
0530: 78 7d 20 7b 31 3a 6f 7d 20 7b 31 3a 78 7d 20 7b  x} {1:o} {1:x} {
0540: 31 3a 78 7d 20 7b 30 3a 6f 7d 22 60 0a 20 20 20  1:x} {0:o}"`.   
0550: 20 2f 2f 2f 20 2a 20 60 61 72 67 5f 74 79 70 65   /// * `arg_type
0560: 73 60 20 28 69 6e 20 4a 53 4f 4e 29 3a 20 60 5b  s` (in JSON): `[
0570: 5b 30 2c 20 31 2c 20 30 5d 2c 20 5b 30 2c 20 31  [0, 1, 0], [0, 1
0580: 2c 20 31 5d 2c 20 5b 30 2c 20 31 5d 5d 60 0a 20  , 1], [0, 1]]`. 
0590: 20 20 20 2f 2f 2f 20 2a 20 60 61 72 67 5f 75 6e     /// * `arg_un
05a0: 69 71 75 65 5f 74 79 70 65 73 60 20 28 69 6e 20  ique_types` (in 
05b0: 73 69 6d 70 6c 69 66 69 65 64 20 4a 53 4f 4e 29  simplified JSON)
05c0: 3a 20 60 5b 5b 22 6f 22 2c 20 22 78 22 5d 2c 20  : `[["o", "x"], 
05d0: 5b 22 6f 22 2c 20 22 78 22 5d 2c 20 5b 22 6f 22  ["o", "x"], ["o"
05e0: 2c 20 22 78 22 5d 5d 60 0a 20 20 20 20 2f 2f 2f  , "x"]]`.    ///
05f0: 20 2a 20 60 6e 61 6d 65 73 60 20 28 69 6e 20 4a   * `names` (in J
0600: 53 4f 4e 29 3a 20 60 7b 22 66 6f 6f 22 3a 20 32  SON): `{"foo": 2
0610: 7d 60 0a 20 20 20 20 61 72 67 73 3a 20 56 65 63  }`.    args: Vec
0620: 3c 50 3c 61 73 74 3a 3a 45 78 70 72 3e 3e 2c 0a  <P<ast::Expr>>,.
0630: 20 20 20 20 2f 2f 2f 20 50 6c 61 63 65 68 6f 6c      /// Placehol
0640: 64 65 72 20 73 6c 6f 74 20 6e 75 6d 62 65 72 73  der slot numbers
0650: 20 69 6e 64 65 78 65 64 20 62 79 20 61 72 67 75   indexed by argu
0660: 6d 65 6e 74 2e 0a 20 20 20 20 61 72 67 5f 74 79  ment..    arg_ty
0670: 70 65 73 3a 20 56 65 63 3c 56 65 63 3c 75 73 69  pes: Vec<Vec<usi
0680: 7a 65 3e 3e 2c 0a 20 20 20 20 2f 2f 2f 20 55 6e  ze>>,.    /// Un
0690: 69 71 75 65 20 66 6f 72 6d 61 74 20 73 70 65 63  ique format spec
06a0: 73 20 73 65 65 6e 20 66 6f 72 20 65 61 63 68 20  s seen for each 
06b0: 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 61 72  argument..    ar
06c0: 67 5f 75 6e 69 71 75 65 5f 74 79 70 65 73 3a 20  g_unique_types: 
06d0: 56 65 63 3c 56 65 63 3c 41 72 67 75 6d 65 6e 74  Vec<Vec<Argument
06e0: 54 79 70 65 3e 3e 2c 0a 20 20 20 20 2f 2f 2f 20  Type>>,.    /// 
06f0: 4d 61 70 20 66 72 6f 6d 20 6e 61 6d 65 64 20 61  Map from named a
0700: 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 65 69  rguments to thei
0710: 72 20 72 65 73 6f 6c 76 65 64 20 69 6e 64 69 63  r resolved indic
0720: 65 73 2e 0a 20 20 20 20 6e 61 6d 65 73 3a 20 46  es..    names: F
0730: 78 48 61 73 68 4d 61 70 3c 53 79 6d 62 6f 6c 2c  xHashMap<Symbol,
0740: 20 75 73 69 7a 65 3e 2c 0a 0a 20 20 20 20 2f 2f   usize>,..    //
0750: 2f 20 54 68 65 20 6c 61 74 65 73 74 20 63 6f 6e  / The latest con
0760: 73 65 63 75 74 69 76 65 20 6c 69 74 65 72 61 6c  secutive literal
0770: 20 73 74 72 69 6e 67 73 2c 20 6f 72 20 65 6d 70   strings, or emp
0780: 74 79 20 69 66 20 74 68 65 72 65 20 77 65 72 65  ty if there were
0790: 6e 27 74 20 61 6e 79 2e 0a 20 20 20 20 6c 69 74  n't any..    lit
07a0: 65 72 61 6c 3a 20 53 74 72 69 6e 67 2c 0a 0a 20  eral: String,.. 
07b0: 20 20 20 2f 2f 2f 20 43 6f 6c 6c 65 63 74 69 6f     /// Collectio
07c0: 6e 20 6f 66 20 74 68 65 20 63 6f 6d 70 69 6c 65  n of the compile
07d0: 64 20 60 72 74 3a 3a 41 72 67 75 6d 65 6e 74 60  d `rt::Argument`
07e0: 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 20 20   structures.    
07f0: 70 69 65 63 65 73 3a 20 56 65 63 3c 50 3c 61 73  pieces: Vec<P<as
0800: 74 3a 3a 45 78 70 72 3e 3e 2c 0a 20 20 20 20 2f  t::Expr>>,.    /
0810: 2f 2f 20 43 6f 6c 6c 65 63 74 69 6f 6e 20 6f 66  // Collection of
0820: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73   string literals
0830: 0a 20 20 20 20 73 74 72 5f 70 69 65 63 65 73 3a  .    str_pieces:
0840: 20 56 65 63 3c 50 3c 61 73 74 3a 3a 45 78 70 72   Vec<P<ast::Expr
0850: 3e 3e 2c 0a 20 20 20 20 2f 2f 2f 20 53 74 61 79  >>,.    /// Stay
0860: 73 20 60 74 72 75 65 60 20 69 66 20 61 6c 6c 20  s `true` if all 
0870: 66 6f 72 6d 61 74 74 69 6e 67 20 70 61 72 61 6d  formatting param
0880: 65 74 65 72 73 20 61 72 65 20 64 65 66 61 75 6c  eters are defaul
0890: 74 20 28 61 73 20 69 6e 20 22 7b 7d 7b 7d 22 29  t (as in "{}{}")
08a0: 2e 0a 20 20 20 20 61 6c 6c 5f 70 69 65 63 65 73  ..    all_pieces
08b0: 5f 73 69 6d 70 6c 65 3a 20 62 6f 6f 6c 2c 0a 0a  _simple: bool,..
08c0: 20 20 20 20 2f 2f 2f 20 4d 61 70 70 69 6e 67 20      /// Mapping 
08d0: 62 65 74 77 65 65 6e 20 70 6f 73 69 74 69 6f 6e  between position
08e0: 61 6c 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  al argument refe
08f0: 72 65 6e 63 65 73 20 61 6e 64 20 69 6e 64 69 63  rences and indic
0900: 65 73 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  es into the.    
0910: 2f 2f 2f 20 66 69 6e 61 6c 20 67 65 6e 65 72 61  /// final genera
0920: 74 65 64 20 73 74 61 74 69 63 20 61 72 67 75 6d  ted static argum
0930: 65 6e 74 20 61 72 72 61 79 2e 20 57 65 20 72 65  ent array. We re
0940: 63 6f 72 64 20 74 68 65 20 73 74 61 72 74 69 6e  cord the startin
0950: 67 20 69 6e 64 69 63 65 73 0a 20 20 20 20 2f 2f  g indices.    //
0960: 2f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  / corresponding 
0970: 74 6f 20 65 61 63 68 20 70 6f 73 69 74 69 6f 6e  to each position
0980: 61 6c 20 61 72 67 75 6d 65 6e 74 2c 20 61 6e 64  al argument, and
0990: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
09a0: 65 6e 63 65 73 0a 20 20 20 20 2f 2f 2f 20 63 6f  ences.    /// co
09b0: 6e 73 75 6d 65 64 20 73 6f 20 66 61 72 20 66 6f  nsumed so far fo
09c0: 72 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2c  r each argument,
09d0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 63   to facilitate c
09e0: 6f 72 72 65 63 74 20 60 50 6f 73 69 74 69 6f 6e  orrect `Position
09f0: 60 0a 20 20 20 20 2f 2f 2f 20 6d 61 70 70 69 6e  `.    /// mappin
0a00: 67 20 69 6e 20 60 62 75 69 6c 64 5f 70 69 65 63  g in `build_piec
0a10: 65 60 2e 20 49 6e 20 65 66 66 65 63 74 20 74 68  e`. In effect th
0a20: 69 73 20 63 61 6e 20 62 65 20 73 65 65 6e 20 61  is can be seen a
0a30: 73 20 61 20 22 66 6c 61 74 74 65 6e 65 64 22 0a  s a "flattened".
0a40: 20 20 20 20 2f 2f 2f 20 76 65 72 73 69 6f 6e 20      /// version 
0a50: 6f 66 20 60 61 72 67 5f 75 6e 69 71 75 65 5f 74  of `arg_unique_t
0a60: 79 70 65 73 60 2e 0a 20 20 20 20 2f 2f 2f 0a 20  ypes`..    ///. 
0a70: 20 20 20 2f 2f 2f 20 41 67 61 69 6e 20 77 69 74     /// Again wit
0a80: 68 20 74 68 65 20 65 78 61 6d 70 6c 65 20 64 65  h the example de
0a90: 73 63 72 69 62 65 64 20 61 62 6f 76 65 20 69 6e  scribed above in
0aa0: 20 64 6f 63 73 74 72 69 6e 67 20 66 6f 72 20 60   docstring for `
0ab0: 61 72 67 73 60 3a 0a 20 20 20 20 2f 2f 2f 0a 20  args`:.    ///. 
0ac0: 20 20 20 2f 2f 2f 20 2a 20 60 61 72 67 5f 69 6e     /// * `arg_in
0ad0: 64 65 78 5f 6d 61 70 60 20 28 69 6e 20 4a 53 4f  dex_map` (in JSO
0ae0: 4e 29 3a 20 60 5b 5b 30 2c 20 31 2c 20 30 5d 2c  N): `[[0, 1, 0],
0af0: 20 5b 32 2c 20 33 2c 20 33 5d 2c 20 5b 34 2c 20   [2, 3, 3], [4, 
0b00: 35 5d 5d 60 0a 20 20 20 20 61 72 67 5f 69 6e 64  5]]`.    arg_ind
0b10: 65 78 5f 6d 61 70 3a 20 56 65 63 3c 56 65 63 3c  ex_map: Vec<Vec<
0b20: 75 73 69 7a 65 3e 3e 2c 0a 0a 20 20 20 20 2f 2f  usize>>,..    //
0b30: 2f 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73 65  / Starting offse
0b40: 74 20 6f 66 20 63 6f 75 6e 74 20 61 72 67 75 6d  t of count argum
0b50: 65 6e 74 20 73 6c 6f 74 73 2e 0a 20 20 20 20 63  ent slots..    c
0b60: 6f 75 6e 74 5f 61 72 67 73 5f 69 6e 64 65 78 5f  ount_args_index_
0b70: 6f 66 66 73 65 74 3a 20 75 73 69 7a 65 2c 0a 0a  offset: usize,..
0b80: 20 20 20 20 2f 2f 2f 20 43 6f 75 6e 74 20 61 72      /// Count ar
0b90: 67 75 6d 65 6e 74 20 73 6c 6f 74 73 20 61 6e 64  gument slots and
0ba0: 20 74 72 61 63 6b 69 6e 67 20 64 61 74 61 20 73   tracking data s
0bb0: 74 72 75 63 74 75 72 65 73 2e 0a 20 20 20 20 2f  tructures..    /
0bc0: 2f 2f 20 43 6f 75 6e 74 20 61 72 67 75 6d 65 6e  // Count argumen
0bd0: 74 73 20 61 72 65 20 73 65 70 61 72 61 74 65 6c  ts are separatel
0be0: 79 20 74 72 61 63 6b 65 64 20 66 6f 72 20 64 65  y tracked for de
0bf0: 2d 64 75 70 6c 69 63 61 74 69 6f 6e 20 69 6e 20  -duplication in 
0c00: 63 61 73 65 0a 20 20 20 20 2f 2f 2f 20 6d 75 6c  case.    /// mul
0c10: 74 69 70 6c 65 20 72 65 66 65 72 65 6e 63 65 73  tiple references
0c20: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 6f 6e 65   are made to one
0c30: 20 61 72 67 75 6d 65 6e 74 2e 20 46 6f 72 20 65   argument. For e
0c40: 78 61 6d 70 6c 65 2c 20 69 6e 20 74 68 69 73 0a  xample, in this.
0c50: 20 20 20 20 2f 2f 2f 20 66 6f 72 6d 61 74 20 73      /// format s
0c60: 74 72 69 6e 67 3a 0a 20 20 20 20 2f 2f 2f 0a 20  tring:.    ///. 
0c70: 20 20 20 2f 2f 2f 20 2a 20 4f 72 69 67 69 6e 61     /// * Origina
0c80: 6c 3a 20 60 22 7b 3a 2e 2a 7d 20 7b 3a 2e 66 6f  l: `"{:.*} {:.fo
0c90: 6f 24 7d 20 7b 31 3a 2e 2a 7d 20 7b 3a 2e 30 24  o$} {1:.*} {:.0$
0ca0: 7d 22 60 0a 20 20 20 20 2f 2f 2f 20 2a 20 49 6d  }"`.    /// * Im
0cb0: 70 6c 69 63 69 74 20 61 72 67 75 6d 65 6e 74 20  plicit argument 
0cc0: 72 65 73 6f 6c 75 74 69 6f 6e 3a 20 60 22 7b 31  resolution: `"{1
0cd0: 3a 2e 30 24 7d 20 7b 32 3a 2e 66 6f 6f 24 7d 20  :.0$} {2:.foo$} 
0ce0: 7b 31 3a 2e 33 24 7d 20 7b 34 3a 2e 30 24 7d 22  {1:.3$} {4:.0$}"
0cf0: 60 0a 20 20 20 20 2f 2f 2f 20 2a 20 4e 61 6d 65  `.    /// * Name
0d00: 20 72 65 73 6f 6c 75 74 69 6f 6e 3a 20 60 22 7b   resolution: `"{
0d10: 31 3a 2e 30 24 7d 20 7b 32 3a 2e 35 24 7d 20 7b  1:.0$} {2:.5$} {
0d20: 31 3a 2e 33 24 7d 20 7b 34 3a 2e 30 24 7d 22 60  1:.3$} {4:.0$}"`
0d30: 0a 20 20 20 20 2f 2f 2f 20 2a 20 60 63 6f 75 6e  .    /// * `coun
0d40: 74 5f 70 6f 73 69 74 69 6f 6e 73 60 20 28 69 6e  t_positions` (in
0d50: 20 4a 53 4f 4e 29 3a 20 60 7b 30 3a 20 30 2c 20   JSON): `{0: 0, 
0d60: 35 3a 20 31 2c 20 33 3a 20 32 7d 60 0a 20 20 20  5: 1, 3: 2}`.   
0d70: 20 2f 2f 2f 20 2a 20 60 63 6f 75 6e 74 5f 61 72   /// * `count_ar
0d80: 67 73 60 3a 20 60 76 65 63 21 5b 45 78 61 63 74  gs`: `vec![Exact
0d90: 28 30 29 2c 20 45 78 61 63 74 28 35 29 2c 20 45  (0), Exact(5), E
0da0: 78 61 63 74 28 33 29 5d 60 0a 20 20 20 20 63 6f  xact(3)]`.    co
0db0: 75 6e 74 5f 61 72 67 73 3a 20 56 65 63 3c 50 6f  unt_args: Vec<Po
0dc0: 73 69 74 69 6f 6e 3e 2c 0a 20 20 20 20 2f 2f 2f  sition>,.    ///
0dd0: 20 52 65 6c 61 74 69 76 65 20 73 6c 6f 74 20 6e   Relative slot n
0de0: 75 6d 62 65 72 73 20 66 6f 72 20 63 6f 75 6e 74  umbers for count
0df0: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 20 20   arguments..    
0e00: 63 6f 75 6e 74 5f 70 6f 73 69 74 69 6f 6e 73 3a  count_positions:
0e10: 20 46 78 48 61 73 68 4d 61 70 3c 75 73 69 7a 65   FxHashMap<usize
0e20: 2c 20 75 73 69 7a 65 3e 2c 0a 20 20 20 20 2f 2f  , usize>,.    //
0e30: 2f 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 75 6e  / Number of coun
0e40: 74 20 73 6c 6f 74 73 20 61 73 73 69 67 6e 65 64  t slots assigned
0e50: 2e 0a 20 20 20 20 63 6f 75 6e 74 5f 70 6f 73 69  ..    count_posi
0e60: 74 69 6f 6e 73 5f 63 6f 75 6e 74 3a 20 75 73 69  tions_count: usi
0e70: 7a 65 2c 0a 0a 20 20 20 20 2f 2f 2f 20 43 75 72  ze,..    /// Cur
0e80: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  rent position of
0e90: 20 74 68 65 20 69 6d 70 6c 69 63 69 74 20 70 6f   the implicit po
0ea0: 73 69 74 69 6f 6e 61 6c 20 61 72 67 20 70 6f 69  sitional arg poi
0eb0: 6e 74 65 72 2c 20 61 73 20 69 66 20 69 74 0a 20  nter, as if it. 
0ec0: 20 20 20 2f 2f 2f 20 73 74 69 6c 6c 20 65 78 69     /// still exi
0ed0: 73 74 65 64 20 69 6e 20 74 68 69 73 20 70 68 61  sted in this pha
0ee0: 73 65 20 6f 66 20 70 72 6f 63 65 73 73 69 6e 67  se of processing
0ef0: 2e 0a 20 20 20 20 2f 2f 2f 20 55 73 65 64 20 6f  ..    /// Used o
0f00: 6e 6c 79 20 66 6f 72 20 60 61 6c 6c 5f 70 69 65  nly for `all_pie
0f10: 63 65 73 5f 73 69 6d 70 6c 65 60 20 74 72 61 63  ces_simple` trac
0f20: 6b 69 6e 67 20 69 6e 20 60 62 75 69 6c 64 5f 70  king in `build_p
0f30: 69 65 63 65 60 2e 0a 20 20 20 20 63 75 72 61 72  iece`..    curar
0f40: 67 3a 20 75 73 69 7a 65 2c 0a 20 20 20 20 2f 2f  g: usize,.    //
0f50: 2f 20 43 75 72 72 65 6e 74 20 70 69 65 63 65 20  / Current piece 
0f60: 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64 2c  being evaluated,
0f70: 20 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   used for error 
0f80: 72 65 70 6f 72 74 69 6e 67 2e 0a 20 20 20 20 63  reporting..    c
0f90: 75 72 70 69 65 63 65 3a 20 75 73 69 7a 65 2c 0a  urpiece: usize,.
0fa0: 20 20 20 20 2f 2f 2f 20 4b 65 65 70 20 74 72 61      /// Keep tra
0fb0: 63 6b 20 6f 66 20 69 6e 76 61 6c 69 64 20 72 65  ck of invalid re
0fc0: 66 65 72 65 6e 63 65 73 20 74 6f 20 70 6f 73 69  ferences to posi
0fd0: 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73  tional arguments
0fe0: 2e 0a 20 20 20 20 69 6e 76 61 6c 69 64 5f 72 65  ..    invalid_re
0ff0: 66 73 3a 20 56 65 63 3c 28 75 73 69 7a 65 2c 20  fs: Vec<(usize, 
1000: 75 73 69 7a 65 29 3e 2c 0a 20 20 20 20 2f 2f 2f  usize)>,.    ///
1010: 20 53 70 61 6e 73 20 6f 66 20 61 6c 6c 20 74 68   Spans of all th
1020: 65 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 72 67  e formatting arg
1030: 75 6d 65 6e 74 73 2c 20 69 6e 20 6f 72 64 65 72  uments, in order
1040: 2e 0a 20 20 20 20 61 72 67 5f 73 70 61 6e 73 3a  ..    arg_spans:
1050: 20 56 65 63 3c 53 70 61 6e 3e 2c 0a 20 20 20 20   Vec<Span>,.    
1060: 2f 2f 2f 20 41 6c 6c 20 74 68 65 20 66 6f 72 6d  /// All the form
1070: 61 74 74 69 6e 67 20 61 72 67 75 6d 65 6e 74 73  atting arguments
1080: 20 74 68 61 74 20 68 61 76 65 20 66 6f 72 6d 61   that have forma
1090: 74 74 69 6e 67 20 66 6c 61 67 73 20 73 65 74 2c  tting flags set,
10a0: 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 64 69   in order for di
10b0: 61 67 6e 6f 73 74 69 63 73 2e 0a 20 20 20 20 61  agnostics..    a
10c0: 72 67 5f 77 69 74 68 5f 66 6f 72 6d 61 74 74 69  rg_with_formatti
10d0: 6e 67 3a 20 56 65 63 3c 70 61 72 73 65 3a 3a 46  ng: Vec<parse::F
10e0: 6f 72 6d 61 74 53 70 65 63 3c 27 61 3e 3e 2c 0a  ormatSpec<'a>>,.
10f0: 20 20 20 20 2f 2f 2f 20 57 68 65 74 68 65 72 20      /// Whether 
1100: 74 68 69 73 20 66 6f 72 6d 61 74 74 69 6e 67 20  this formatting 
1110: 73 74 72 69 6e 67 20 69 73 20 61 20 6c 69 74 65  string is a lite
1120: 72 61 6c 20 6f 72 20 69 74 20 63 6f 6d 65 73 20  ral or it comes 
1130: 66 72 6f 6d 20 61 20 6d 61 63 72 6f 2e 0a 20 20  from a macro..  
1140: 20 20 69 73 5f 6c 69 74 65 72 61 6c 3a 20 62 6f    is_literal: bo
1150: 6f 6c 2c 0a 7d 0a 0a 2f 2f 2f 20 50 61 72 73 65  ol,.}../// Parse
1160: 73 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20  s the arguments 
1170: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 6c  from the given l
1180: 69 73 74 20 6f 66 20 74 6f 6b 65 6e 73 2c 20 72  ist of tokens, r
1190: 65 74 75 72 6e 69 6e 67 20 74 68 65 20 64 69 61  eturning the dia
11a0: 67 6e 6f 73 74 69 63 0a 2f 2f 2f 20 69 66 20 74  gnostic./// if t
11b0: 68 65 72 65 27 73 20 61 20 70 61 72 73 65 20 65  here's a parse e
11c0: 72 72 6f 72 20 73 6f 20 77 65 20 63 61 6e 20 63  rror so we can c
11d0: 6f 6e 74 69 6e 75 65 20 70 61 72 73 69 6e 67 20  ontinue parsing 
11e0: 6f 74 68 65 72 20 66 6f 72 6d 61 74 21 0a 2f 2f  other format!.//
11f0: 2f 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2f  / expressions../
1200: 2f 2f 0a 2f 2f 2f 20 49 66 20 70 61 72 73 69 6e  //./// If parsin
1210: 67 20 73 75 63 63 65 65 64 73 2c 20 74 68 65 20  g succeeds, the 
1220: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 3a  return value is:
1230: 0a 2f 2f 2f 0a 2f 2f 2f 20 60 60 60 74 65 78 74  .///./// ```text
1240: 0a 2f 2f 2f 20 53 6f 6d 65 28 28 66 6d 74 73 74  ./// Some((fmtst
1250: 72 2c 20 70 61 72 73 65 64 20 61 72 67 75 6d 65  r, parsed argume
1260: 6e 74 73 2c 20 69 6e 64 65 78 20 6d 61 70 20 66  nts, index map f
1270: 6f 72 20 6e 61 6d 65 64 20 61 72 67 75 6d 65 6e  or named argumen
1280: 74 73 29 29 0a 2f 2f 2f 20 60 60 60 0a 66 6e 20  ts))./// ```.fn 
1290: 70 61 72 73 65 5f 61 72 67 73 3c 27 61 3e 28 0a  parse_args<'a>(.
12a0: 20 20 20 20 65 63 78 3a 20 26 6d 75 74 20 45 78      ecx: &mut Ex
12b0: 74 43 74 78 74 3c 27 61 3e 2c 0a 20 20 20 20 73  tCtxt<'a>,.    s
12c0: 70 3a 20 53 70 61 6e 2c 0a 20 20 20 20 74 74 73  p: Span,.    tts
12d0: 3a 20 54 6f 6b 65 6e 53 74 72 65 61 6d 2c 0a 29  : TokenStream,.)
12e0: 20 2d 3e 20 52 65 73 75 6c 74 3c 28 50 3c 61 73   -> Result<(P<as
12f0: 74 3a 3a 45 78 70 72 3e 2c 20 56 65 63 3c 50 3c  t::Expr>, Vec<P<
1300: 61 73 74 3a 3a 45 78 70 72 3e 3e 2c 20 46 78 48  ast::Expr>>, FxH
1310: 61 73 68 4d 61 70 3c 53 79 6d 62 6f 6c 2c 20 75  ashMap<Symbol, u
1320: 73 69 7a 65 3e 29 2c 20 44 69 61 67 6e 6f 73 74  size>), Diagnost
1330: 69 63 42 75 69 6c 64 65 72 3c 27 61 3e 3e 20 7b  icBuilder<'a>> {
1340: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 61 72 67  .    let mut arg
1350: 73 20 3d 20 56 65 63 3a 3a 3c 50 3c 61 73 74 3a  s = Vec::<P<ast:
1360: 3a 45 78 70 72 3e 3e 3a 3a 6e 65 77 28 29 3b 0a  :Expr>>::new();.
1370: 20 20 20 20 6c 65 74 20 6d 75 74 20 6e 61 6d 65      let mut name
1380: 73 20 3d 20 46 78 48 61 73 68 4d 61 70 3a 3a 3c  s = FxHashMap::<
1390: 53 79 6d 62 6f 6c 2c 20 75 73 69 7a 65 3e 3a 3a  Symbol, usize>::
13a0: 64 65 66 61 75 6c 74 28 29 3b 0a 0a 20 20 20 20  default();..    
13b0: 6c 65 74 20 6d 75 74 20 70 20 3d 20 65 63 78 2e  let mut p = ecx.
13c0: 6e 65 77 5f 70 61 72 73 65 72 5f 66 72 6f 6d 5f  new_parser_from_
13d0: 74 74 73 28 74 74 73 29 3b 0a 0a 20 20 20 20 69  tts(tts);..    i
13e0: 66 20 70 2e 74 6f 6b 65 6e 20 3d 3d 20 74 6f 6b  f p.token == tok
13f0: 65 6e 3a 3a 45 6f 66 20 7b 0a 20 20 20 20 20 20  en::Eof {.      
1400: 20 20 72 65 74 75 72 6e 20 45 72 72 28 65 63 78    return Err(ecx
1410: 2e 73 74 72 75 63 74 5f 73 70 61 6e 5f 65 72 72  .struct_span_err
1420: 28 73 70 2c 20 22 72 65 71 75 69 72 65 73 20 61  (sp, "requires a
1430: 74 20 6c 65 61 73 74 20 61 20 66 6f 72 6d 61 74  t least a format
1440: 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74   string argument
1450: 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "));.    }..    
1460: 6c 65 74 20 66 6d 74 73 74 72 20 3d 20 70 2e 70  let fmtstr = p.p
1470: 61 72 73 65 5f 65 78 70 72 28 29 3f 3b 0a 20 20  arse_expr()?;.  
1480: 20 20 6c 65 74 20 6d 75 74 20 66 69 72 73 74 20    let mut first 
1490: 3d 20 74 72 75 65 3b 0a 20 20 20 20 6c 65 74 20  = true;.    let 
14a0: 6d 75 74 20 6e 61 6d 65 64 20 3d 20 66 61 6c 73  mut named = fals
14b0: 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 70 2e  e;..    while p.
14c0: 74 6f 6b 65 6e 20 21 3d 20 74 6f 6b 65 6e 3a 3a  token != token::
14d0: 45 6f 66 20 7b 0a 20 20 20 20 20 20 20 20 69 66  Eof {.        if
14e0: 20 21 70 2e 65 61 74 28 26 74 6f 6b 65 6e 3a 3a   !p.eat(&token::
14f0: 43 6f 6d 6d 61 29 20 7b 0a 20 20 20 20 20 20 20  Comma) {.       
1500: 20 20 20 20 20 69 66 20 66 69 72 73 74 20 7b 0a       if first {.
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1520: 2f 2f 20 41 66 74 65 72 20 60 66 6f 72 6d 61 74  // After `format
1530: 21 28 22 22 60 20 77 65 20 61 6c 77 61 79 73 20  !(""` we always 
1540: 65 78 70 65 63 74 20 2a 6f 6e 6c 79 2a 20 61 20  expect *only* a 
1550: 63 6f 6d 6d 61 2e 2e 2e 0a 20 20 20 20 20 20 20  comma....       
1560: 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74           let mut
1570: 20 65 72 72 20 3d 20 65 63 78 2e 73 74 72 75 63   err = ecx.struc
1580: 74 5f 73 70 61 6e 5f 65 72 72 28 70 2e 74 6f 6b  t_span_err(p.tok
1590: 65 6e 2e 73 70 61 6e 2c 20 22 65 78 70 65 63 74  en.span, "expect
15a0: 65 64 20 74 6f 6b 65 6e 3a 20 60 2c 60 22 29 3b  ed token: `,`");
15b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15c0: 20 65 72 72 2e 73 70 61 6e 5f 6c 61 62 65 6c 28   err.span_label(
15d0: 70 2e 74 6f 6b 65 6e 2e 73 70 61 6e 2c 20 22 65  p.token.span, "e
15e0: 78 70 65 63 74 65 64 20 60 2c 60 22 29 3b 0a 20  xpected `,`");. 
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1600: 2e 6d 61 79 62 65 5f 61 6e 6e 6f 74 61 74 65 5f  .maybe_annotate_
1610: 77 69 74 68 5f 61 73 63 72 69 70 74 69 6f 6e 28  with_ascription(
1620: 26 6d 75 74 20 65 72 72 2c 20 66 61 6c 73 65 29  &mut err, false)
1630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1640: 20 20 72 65 74 75 72 6e 20 45 72 72 28 65 72 72    return Err(err
1650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1660: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1670: 20 20 20 20 20 20 20 20 2f 2f 20 2e 2e 2e 61 66          // ...af
1680: 74 65 72 20 74 68 61 74 20 64 65 6c 65 67 61 74  ter that delegat
1690: 65 20 74 6f 20 60 65 78 70 65 63 74 60 20 74 6f  e to `expect` to
16a0: 20 61 6c 73 6f 20 69 6e 63 6c 75 64 65 20 74 68   also include th
16b0: 65 20 6f 74 68 65 72 20 65 78 70 65 63 74 65 64  e other expected
16c0: 20 74 6f 6b 65 6e 73 2e 0a 20 20 20 20 20 20 20   tokens..       
16d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16e0: 45 72 72 28 70 2e 65 78 70 65 63 74 28 26 74 6f  Err(p.expect(&to
16f0: 6b 65 6e 3a 3a 43 6f 6d 6d 61 29 2e 65 72 72 28  ken::Comma).err(
1700: 29 2e 75 6e 77 72 61 70 28 29 29 3b 0a 20 20 20  ).unwrap());.   
1710: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1720: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 69 72     }.        fir
1730: 73 74 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  st = false;.    
1740: 20 20 20 20 69 66 20 70 2e 74 6f 6b 65 6e 20 3d      if p.token =
1750: 3d 20 74 6f 6b 65 6e 3a 3a 45 6f 66 20 7b 0a 20  = token::Eof {. 
1760: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1770: 3b 0a 20 20 20 20 20 20 20 20 7d 20 2f 2f 20 61  ;.        } // a
1780: 63 63 65 70 74 20 74 72 61 69 6c 69 6e 67 20 63  ccept trailing c
1790: 6f 6d 6d 61 73 0a 20 20 20 20 20 20 20 20 69 66  ommas.        if
17a0: 20 70 2e 74 6f 6b 65 6e 2e 69 73 5f 69 64 65 6e   p.token.is_iden
17b0: 74 28 29 20 26 26 20 70 2e 6c 6f 6f 6b 5f 61 68  t() && p.look_ah
17c0: 65 61 64 28 31 2c 20 7c 74 7c 20 2a 74 20 3d 3d  ead(1, |t| *t ==
17d0: 20 74 6f 6b 65 6e 3a 3a 45 71 29 20 7b 0a 20 20   token::Eq) {.  
17e0: 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 64 20            named 
17f0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20  = true;.        
1800: 20 20 20 20 6c 65 74 20 6e 61 6d 65 20 3d 20 69      let name = i
1810: 66 20 6c 65 74 20 74 6f 6b 65 6e 3a 3a 49 64 65  f let token::Ide
1820: 6e 74 28 6e 61 6d 65 2c 20 5f 29 20 3d 20 70 2e  nt(name, _) = p.
1830: 74 6f 6b 65 6e 2e 6b 69 6e 64 20 7b 0a 20 20 20  token.kind {.   
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2e 62               p.b
1850: 75 6d 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ump();.         
1860: 20 20 20 20 20 20 20 6e 61 6d 65 0a 20 20 20 20         name.    
1870: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1890: 20 75 6e 72 65 61 63 68 61 62 6c 65 21 28 29 3b   unreachable!();
18a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a  .            };.
18b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2e 65  .            p.e
18c0: 78 70 65 63 74 28 26 74 6f 6b 65 6e 3a 3a 45 71  xpect(&token::Eq
18d0: 29 3f 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  )?;.            
18e0: 6c 65 74 20 65 20 3d 20 70 2e 70 61 72 73 65 5f  let e = p.parse_
18f0: 65 78 70 72 28 29 3f 3b 0a 20 20 20 20 20 20 20  expr()?;.       
1900: 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d 65       if let Some
1910: 28 70 72 65 76 29 20 3d 20 6e 61 6d 65 73 2e 67  (prev) = names.g
1920: 65 74 28 26 6e 61 6d 65 29 20 7b 0a 20 20 20 20  et(&name) {.    
1930: 20 20 20 20 20 20 20 20 20 20 20 20 65 63 78 2e              ecx.
1940: 73 74 72 75 63 74 5f 73 70 61 6e 5f 65 72 72 28  struct_span_err(
1950: 65 2e 73 70 61 6e 2c 20 26 66 6f 72 6d 61 74 21  e.span, &format!
1960: 28 22 64 75 70 6c 69 63 61 74 65 20 61 72 67 75  ("duplicate argu
1970: 6d 65 6e 74 20 6e 61 6d 65 64 20 60 7b 7d 60 22  ment named `{}`"
1980: 2c 20 6e 61 6d 65 29 29 0a 20 20 20 20 20 20 20  , name)).       
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 73 70               .sp
19a0: 61 6e 5f 6c 61 62 65 6c 28 61 72 67 73 5b 2a 70  an_label(args[*p
19b0: 72 65 76 5d 2e 73 70 61 6e 2c 20 22 70 72 65 76  rev].span, "prev
19c0: 69 6f 75 73 6c 79 20 68 65 72 65 22 29 0a 20 20  iously here").  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 20 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 65 2e    .span_label(e.
19f0: 73 70 61 6e 2c 20 22 64 75 70 6c 69 63 61 74 65  span, "duplicate
1a00: 20 61 72 67 75 6d 65 6e 74 22 29 0a 20 20 20 20   argument").    
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a20: 2e 65 6d 69 74 28 29 3b 0a 20 20 20 20 20 20 20  .emit();.       
1a30: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1a40: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1a50: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  ..            //
1a60: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
1a70: 6e 74 6f 20 73 6c 6f 74 73 20 65 61 72 6c 79 2e  nto slots early.
1a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
1a90: 53 69 6e 63 65 20 61 6c 6c 20 74 68 65 20 70 6f  Since all the po
1aa0: 73 69 74 69 6f 6e 61 6c 20 61 72 67 73 20 61 72  sitional args ar
1ab0: 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20 61  e already seen a
1ac0: 74 20 74 68 69 73 20 70 6f 69 6e 74 0a 20 20 20  t this point.   
1ad0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 74           // if t
1ae0: 68 65 20 69 6e 70 75 74 20 69 73 20 76 61 6c 69  he input is vali
1af0: 64 2c 20 77 65 20 63 61 6e 20 73 69 6d 70 6c 79  d, we can simply
1b00: 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 70   append to the p
1b10: 6f 73 69 74 69 6f 6e 61 6c 0a 20 20 20 20 20 20  ositional.      
1b20: 20 20 20 20 20 20 2f 2f 20 61 72 67 73 2e 20 41        // args. A
1b30: 6e 64 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20  nd remember the 
1b40: 6e 61 6d 65 73 2e 0a 20 20 20 20 20 20 20 20 20  names..         
1b50: 20 20 20 6c 65 74 20 73 6c 6f 74 20 3d 20 61 72     let slot = ar
1b60: 67 73 2e 6c 65 6e 28 29 3b 0a 20 20 20 20 20 20  gs.len();.      
1b70: 20 20 20 20 20 20 6e 61 6d 65 73 2e 69 6e 73 65        names.inse
1b80: 72 74 28 6e 61 6d 65 2c 20 73 6c 6f 74 29 3b 0a  rt(name, slot);.
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67 73              args
1ba0: 2e 70 75 73 68 28 65 29 3b 0a 20 20 20 20 20 20  .push(e);.      
1bb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
1bc0: 20 20 20 20 20 20 20 6c 65 74 20 65 20 3d 20 70         let e = p
1bd0: 2e 70 61 72 73 65 5f 65 78 70 72 28 29 3f 3b 0a  .parse_expr()?;.
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6e              if n
1bf0: 61 6d 65 64 20 7b 0a 20 20 20 20 20 20 20 20 20  amed {.         
1c00: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 65         let mut e
1c10: 72 72 20 3d 20 65 63 78 2e 73 74 72 75 63 74 5f  rr = ecx.struct_
1c20: 73 70 61 6e 5f 65 72 72 28 0a 20 20 20 20 20 20  span_err(.      
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 2e                e.
1c40: 73 70 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  span,.          
1c50: 20 20 20 20 20 20 20 20 20 20 22 70 6f 73 69 74            "posit
1c60: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20  ional arguments 
1c70: 63 61 6e 6e 6f 74 20 66 6f 6c 6c 6f 77 20 6e 61  cannot follow na
1c80: 6d 65 64 20 61 72 67 75 6d 65 6e 74 73 22 2c 0a  med arguments",.
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1cb0: 20 20 20 65 72 72 2e 73 70 61 6e 5f 6c 61 62 65     err.span_labe
1cc0: 6c 28 65 2e 73 70 61 6e 2c 20 22 70 6f 73 69 74  l(e.span, "posit
1cd0: 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20  ional arguments 
1ce0: 6d 75 73 74 20 62 65 20 62 65 66 6f 72 65 20 6e  must be before n
1cf0: 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 73 22 29  amed arguments")
1d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d10: 20 20 66 6f 72 20 28 5f 2c 20 70 6f 73 29 20 69    for (_, pos) i
1d20: 6e 20 26 6e 61 6d 65 73 20 7b 0a 20 20 20 20 20  n &names {.     
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1d40: 72 72 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 61 72  rr.span_label(ar
1d50: 67 73 5b 2a 70 6f 73 5d 2e 73 70 61 6e 2c 20 22  gs[*pos].span, "
1d60: 6e 61 6d 65 64 20 61 72 67 75 6d 65 6e 74 22 29  named argument")
1d70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1d80: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1d90: 20 20 20 20 65 72 72 2e 65 6d 69 74 28 29 3b 0a      err.emit();.
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1db0: 20 20 20 20 20 20 20 20 20 20 61 72 67 73 2e 70            args.p
1dc0: 75 73 68 28 65 29 3b 0a 20 20 20 20 20 20 20 20  ush(e);.        
1dd0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4f 6b 28 28  }.    }.    Ok((
1de0: 66 6d 74 73 74 72 2c 20 61 72 67 73 2c 20 6e 61  fmtstr, args, na
1df0: 6d 65 73 29 29 0a 7d 0a 0a 69 6d 70 6c 3c 27 61  mes)).}..impl<'a
1e00: 2c 20 27 62 3e 20 43 6f 6e 74 65 78 74 3c 27 61  , 'b> Context<'a
1e10: 2c 20 27 62 3e 20 7b 0a 20 20 20 20 66 6e 20 72  , 'b> {.    fn r
1e20: 65 73 6f 6c 76 65 5f 6e 61 6d 65 5f 69 6e 70 6c  esolve_name_inpl
1e30: 61 63 65 28 26 73 65 6c 66 2c 20 70 3a 20 26 6d  ace(&self, p: &m
1e40: 75 74 20 70 61 72 73 65 3a 3a 50 69 65 63 65 3c  ut parse::Piece<
1e50: 27 5f 3e 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  '_>) {.        /
1e60: 2f 20 4e 4f 54 45 3a 20 74 68 65 20 60 75 6e 77  / NOTE: the `unw
1e70: 72 61 70 5f 6f 72 60 20 62 72 61 6e 63 68 20 69  rap_or` branch i
1e80: 73 20 6e 65 65 64 65 64 20 69 6e 20 63 61 73 65  s needed in case
1e90: 20 6f 66 20 69 6e 76 61 6c 69 64 20 66 6f 72 6d   of invalid form
1ea0: 61 74 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 72  at.        // ar
1eb0: 67 75 6d 65 6e 74 73 2c 20 65 2e 67 2e 2c 20 60  guments, e.g., `
1ec0: 66 6f 72 6d 61 74 5f 61 72 67 73 21 28 22 7b 66  format_args!("{f
1ed0: 6f 6f 7d 22 29 60 2e 0a 20 20 20 20 20 20 20 20  oo}")`..        
1ee0: 6c 65 74 20 6c 6f 6f 6b 75 70 20 3d 20 7c 73 3a  let lookup = |s:
1ef0: 20 53 79 6d 62 6f 6c 7c 20 2a 73 65 6c 66 2e 6e   Symbol| *self.n
1f00: 61 6d 65 73 2e 67 65 74 28 26 73 29 2e 75 6e 77  ames.get(&s).unw
1f10: 72 61 70 5f 6f 72 28 26 30 29 3b 0a 0a 20 20 20  rap_or(&0);..   
1f20: 20 20 20 20 20 6d 61 74 63 68 20 2a 70 20 7b 0a       match *p {.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73              pars
1f40: 65 3a 3a 53 74 72 69 6e 67 28 5f 29 20 3d 3e 20  e::String(_) => 
1f50: 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  {}.            p
1f60: 61 72 73 65 3a 3a 4e 65 78 74 41 72 67 75 6d 65  arse::NextArgume
1f70: 6e 74 28 72 65 66 20 6d 75 74 20 61 72 67 29 20  nt(ref mut arg) 
1f80: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  => {.           
1f90: 20 20 20 20 20 69 66 20 6c 65 74 20 70 61 72 73       if let pars
1fa0: 65 3a 3a 41 72 67 75 6d 65 6e 74 4e 61 6d 65 64  e::ArgumentNamed
1fb0: 28 73 29 20 3d 20 61 72 67 2e 70 6f 73 69 74 69  (s) = arg.positi
1fc0: 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  on {.           
1fd0: 20 20 20 20 20 20 20 20 20 61 72 67 2e 70 6f 73           arg.pos
1fe0: 69 74 69 6f 6e 20 3d 20 70 61 72 73 65 3a 3a 41  ition = parse::A
1ff0: 72 67 75 6d 65 6e 74 49 73 28 6c 6f 6f 6b 75 70  rgumentIs(lookup
2000: 28 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  (s));.          
2010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2020: 20 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 70          if let p
2030: 61 72 73 65 3a 3a 43 6f 75 6e 74 49 73 4e 61 6d  arse::CountIsNam
2040: 65 28 73 29 20 3d 20 61 72 67 2e 66 6f 72 6d 61  e(s) = arg.forma
2050: 74 2e 77 69 64 74 68 20 7b 0a 20 20 20 20 20 20  t.width {.      
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72                ar
2070: 67 2e 66 6f 72 6d 61 74 2e 77 69 64 74 68 20 3d  g.format.width =
2080: 20 70 61 72 73 65 3a 3a 43 6f 75 6e 74 49 73 50   parse::CountIsP
2090: 61 72 61 6d 28 6c 6f 6f 6b 75 70 28 73 29 29 3b  aram(lookup(s));
20a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
20c0: 20 20 20 69 66 20 6c 65 74 20 70 61 72 73 65 3a     if let parse:
20d0: 3a 43 6f 75 6e 74 49 73 4e 61 6d 65 28 73 29 20  :CountIsName(s) 
20e0: 3d 20 61 72 67 2e 66 6f 72 6d 61 74 2e 70 72 65  = arg.format.pre
20f0: 63 69 73 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  cision {.       
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 67               arg
2110: 2e 66 6f 72 6d 61 74 2e 70 72 65 63 69 73 69 6f  .format.precisio
2120: 6e 20 3d 20 70 61 72 73 65 3a 3a 43 6f 75 6e 74  n = parse::Count
2130: 49 73 50 61 72 61 6d 28 6c 6f 6f 6b 75 70 28 73  IsParam(lookup(s
2140: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2150: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2160: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2170: 20 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 56 65 72    }..    /// Ver
2180: 69 66 69 65 73 20 6f 6e 65 20 70 69 65 63 65 20  ifies one piece 
2190: 6f 66 20 61 20 70 61 72 73 65 20 73 74 72 69 6e  of a parse strin
21a0: 67 2c 20 61 6e 64 20 72 65 6d 65 6d 62 65 72 73  g, and remembers
21b0: 20 69 74 20 69 66 20 76 61 6c 69 64 2e 0a 20 20   it if valid..  
21c0: 20 20 2f 2f 2f 20 41 6c 6c 20 65 72 72 6f 72 73    /// All errors
21d0: 20 61 72 65 20 6e 6f 74 20 65 6d 69 74 74 65 64   are not emitted
21e0: 20 61 73 20 66 61 74 61 6c 20 73 6f 20 77 65 20   as fatal so we 
21f0: 63 61 6e 20 63 6f 6e 74 69 6e 75 65 20 67 69 76  can continue giv
2200: 69 6e 67 20 65 72 72 6f 72 73 0a 20 20 20 20 2f  ing errors.    /
2210: 2f 2f 20 61 62 6f 75 74 20 74 68 69 73 20 61 6e  // about this an
2220: 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72  d possibly other
2230: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 73 2e   format strings.
2240: 0a 20 20 20 20 66 6e 20 76 65 72 69 66 79 5f 70  .    fn verify_p
2250: 69 65 63 65 28 26 6d 75 74 20 73 65 6c 66 2c 20  iece(&mut self, 
2260: 70 3a 20 26 70 61 72 73 65 3a 3a 50 69 65 63 65  p: &parse::Piece
2270: 3c 27 5f 3e 29 20 7b 0a 20 20 20 20 20 20 20 20  <'_>) {.        
2280: 6d 61 74 63 68 20 2a 70 20 7b 0a 20 20 20 20 20  match *p {.     
2290: 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a 53 74         parse::St
22a0: 72 69 6e 67 28 2e 2e 29 20 3d 3e 20 7b 7d 0a 20  ring(..) => {}. 
22b0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
22c0: 3a 3a 4e 65 78 74 41 72 67 75 6d 65 6e 74 28 72  ::NextArgument(r
22d0: 65 66 20 61 72 67 29 20 3d 3e 20 7b 0a 20 20 20  ef arg) => {.   
22e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
22f0: 77 69 64 74 68 2f 70 72 65 63 69 73 69 6f 6e 20  width/precision 
2300: 66 69 72 73 74 2c 20 69 66 20 74 68 65 79 20 68  first, if they h
2310: 61 76 65 20 69 6d 70 6c 69 63 69 74 20 70 6f 73  ave implicit pos
2320: 69 74 69 6f 6e 61 6c 0a 20 20 20 20 20 20 20 20  itional.        
2330: 20 20 20 20 20 20 20 20 2f 2f 20 70 61 72 61 6d          // param
2340: 65 74 65 72 73 20 69 74 20 6d 61 6b 65 73 20 6d  eters it makes m
2350: 6f 72 65 20 73 65 6e 73 65 20 74 6f 20 63 6f 6e  ore sense to con
2360: 73 75 6d 65 20 74 68 65 6d 20 66 69 72 73 74 2e  sume them first.
2370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2380: 20 73 65 6c 66 2e 76 65 72 69 66 79 5f 63 6f 75   self.verify_cou
2390: 6e 74 28 61 72 67 2e 66 6f 72 6d 61 74 2e 77 69  nt(arg.format.wi
23a0: 64 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dth);.          
23b0: 20 20 20 20 20 20 73 65 6c 66 2e 76 65 72 69 66        self.verif
23c0: 79 5f 63 6f 75 6e 74 28 61 72 67 2e 66 6f 72 6d  y_count(arg.form
23d0: 61 74 2e 70 72 65 63 69 73 69 6f 6e 29 3b 0a 0a  at.precision);..
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 2f 2f 20 61 72 67 75 6d 65 6e 74 20 73 65 63 6f  // argument seco
2400: 6e 64 2c 20 69 66 20 69 74 27 73 20 61 6e 20 69  nd, if it's an i
2410: 6d 70 6c 69 63 69 74 20 70 6f 73 69 74 69 6f 6e  mplicit position
2420: 61 6c 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20  al parameter.   
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2440: 69 74 27 73 20 77 72 69 74 74 65 6e 20 73 65 63  it's written sec
2450: 6f 6e 64 2c 20 73 6f 20 69 74 20 73 68 6f 75 6c  ond, so it shoul
2460: 64 20 63 6f 6d 65 20 61 66 74 65 72 20 77 69 64  d come after wid
2470: 74 68 2f 70 72 65 63 69 73 69 6f 6e 2e 0a 20 20  th/precision..  
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
2490: 74 20 70 6f 73 20 3d 20 6d 61 74 63 68 20 61 72  t pos = match ar
24a0: 67 2e 70 6f 73 69 74 69 6f 6e 20 7b 0a 20 20 20  g.position {.   
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c0: 20 70 61 72 73 65 3a 3a 41 72 67 75 6d 65 6e 74   parse::Argument
24d0: 49 73 28 69 29 20 7c 20 70 61 72 73 65 3a 3a 41  Is(i) | parse::A
24e0: 72 67 75 6d 65 6e 74 49 6d 70 6c 69 63 69 74 6c  rgumentImplicitl
24f0: 79 49 73 28 69 29 20 3d 3e 20 45 78 61 63 74 28  yIs(i) => Exact(
2500: 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
2510: 20 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a 41          parse::A
2520: 72 67 75 6d 65 6e 74 4e 61 6d 65 64 28 73 29 20  rgumentNamed(s) 
2530: 3d 3e 20 4e 61 6d 65 64 28 73 29 2c 0a 20 20 20  => Named(s),.   
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a               };.
2550: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2560: 20 6c 65 74 20 74 79 20 3d 20 50 6c 61 63 65 68   let ty = Placeh
2570: 6f 6c 64 65 72 28 6d 61 74 63 68 20 26 61 72 67  older(match &arg
2580: 2e 66 6f 72 6d 61 74 2e 74 79 5b 2e 2e 5d 20 7b  .format.ty[..] {
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25a0: 20 20 20 20 20 22 22 20 3d 3e 20 22 44 69 73 70       "" => "Disp
25b0: 6c 61 79 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lay",.          
25c0: 20 20 20 20 20 20 20 20 20 20 22 3f 22 20 3d 3e            "?" =>
25d0: 20 22 44 65 62 75 67 22 2c 0a 20 20 20 20 20 20   "Debug",.      
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
25f0: 22 20 3d 3e 20 22 4c 6f 77 65 72 45 78 70 22 2c  " => "LowerExp",
2600: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2610: 20 20 20 20 20 22 45 22 20 3d 3e 20 22 55 70 70       "E" => "Upp
2620: 65 72 45 78 70 22 2c 0a 20 20 20 20 20 20 20 20  erExp",.        
2630: 20 20 20 20 20 20 20 20 20 20 20 20 22 6f 22 20              "o" 
2640: 3d 3e 20 22 4f 63 74 61 6c 22 2c 0a 20 20 20 20  => "Octal",.    
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 22 70 22 20 3d 3e 20 22 50 6f 69 6e 74 65 72 22  "p" => "Pointer"
2670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2680: 20 20 20 20 20 20 22 62 22 20 3d 3e 20 22 42 69        "b" => "Bi
2690: 6e 61 72 79 22 2c 0a 20 20 20 20 20 20 20 20 20  nary",.         
26a0: 20 20 20 20 20 20 20 20 20 20 20 22 78 22 20 3d             "x" =
26b0: 3e 20 22 4c 6f 77 65 72 48 65 78 22 2c 0a 20 20  > "LowerHex",.  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 22 58 22 20 3d 3e 20 22 55 70 70 65 72 48    "X" => "UpperH
26e0: 65 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ex",.           
26f0: 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b 0a           _ => {.
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 6c 65 74 20 66 6d 74 73          let fmts
2720: 70 20 3d 20 73 65 6c 66 2e 66 6d 74 73 70 3b 0a  p = self.fmtsp;.
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 20 20 20 20 20 6c 65 74 20 73 70 20 3d          let sp =
2750: 20 61 72 67 2e 66 6f 72 6d 61 74 2e 74 79 5f 73   arg.format.ty_s
2760: 70 61 6e 2e 6d 61 70 28 7c 73 70 7c 20 66 6d 74  pan.map(|sp| fmt
2770: 73 70 2e 66 72 6f 6d 5f 69 6e 6e 65 72 28 73 70  sp.from_inner(sp
2780: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2790: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
27a0: 6d 75 74 20 65 72 72 20 3d 20 73 65 6c 66 2e 65  mut err = self.e
27b0: 63 78 2e 73 74 72 75 63 74 5f 73 70 61 6e 5f 65  cx.struct_span_e
27c0: 72 72 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr(.            
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 73 70 2e 75 6e 77 72 61 70 5f 6f 72 28 66 6d 74  sp.unwrap_or(fmt
27f0: 73 70 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sp),.           
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 26 66 6f 72 6d 61 74 21 28 22 75 6e 6b 6e 6f   &format!("unkno
2820: 77 6e 20 66 6f 72 6d 61 74 20 74 72 61 69 74 20  wn format trait 
2830: 60 7b 7d 60 22 2c 20 61 72 67 2e 66 6f 72 6d 61  `{}`", arg.forma
2840: 74 2e 74 79 29 2c 0a 20 20 20 20 20 20 20 20 20  t.ty),.         
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
2860: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2870: 20 20 20 20 20 20 20 20 20 20 65 72 72 2e 6e 6f            err.no
2880: 74 65 28 22 74 68 65 20 6f 6e 6c 79 20 61 70 70  te("the only app
2890: 72 6f 70 72 69 61 74 65 20 66 6f 72 6d 61 74 74  ropriate formatt
28a0: 69 6e 67 20 74 72 61 69 74 73 20 61 72 65 3a 5c  ing traits are:\
28b0: 6e 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n\.             
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 2d 20 60 60 2c 20 77 68 69 63 68 20 75     - ``, which u
28e0: 73 65 73 20 74 68 65 20 60 44 69 73 70 6c 61 79  ses the `Display
28f0: 60 20 74 72 61 69 74 5c 6e 5c 0a 20 20 20 20 20  ` trait\n\.     
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 2d 20 60 3f 60             - `?`
2920: 2c 20 77 68 69 63 68 20 75 73 65 73 20 74 68 65  , which uses the
2930: 20 60 44 65 62 75 67 60 20 74 72 61 69 74 5c 6e   `Debug` trait\n
2940: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 2d 20 60 65 60 2c 20 77 68 69 63 68 20 75    - `e`, which u
2970: 73 65 73 20 74 68 65 20 60 4c 6f 77 65 72 45 78  ses the `LowerEx
2980: 70 60 20 74 72 61 69 74 5c 6e 5c 0a 20 20 20 20  p` trait\n\.    
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 60 45              - `E
29b0: 60 2c 20 77 68 69 63 68 20 75 73 65 73 20 74 68  `, which uses th
29c0: 65 20 60 55 70 70 65 72 45 78 70 60 20 74 72 61  e `UpperExp` tra
29d0: 69 74 5c 6e 5c 0a 20 20 20 20 20 20 20 20 20 20  it\n\.          
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f0: 20 20 20 20 20 20 2d 20 60 6f 60 2c 20 77 68 69        - `o`, whi
2a00: 63 68 20 75 73 65 73 20 74 68 65 20 60 4f 63 74  ch uses the `Oct
2a10: 61 6c 60 20 74 72 61 69 74 5c 6e 5c 0a 20 20 20  al` trait\n\.   
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 60               - `
2a40: 70 60 2c 20 77 68 69 63 68 20 75 73 65 73 20 74  p`, which uses t
2a50: 68 65 20 60 50 6f 69 6e 74 65 72 60 20 74 72 61  he `Pointer` tra
2a60: 69 74 5c 6e 5c 0a 20 20 20 20 20 20 20 20 20 20  it\n\.          
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 20 20 20 2d 20 60 62 60 2c 20 77 68 69        - `b`, whi
2a90: 63 68 20 75 73 65 73 20 74 68 65 20 60 42 69 6e  ch uses the `Bin
2aa0: 61 72 79 60 20 74 72 61 69 74 5c 6e 5c 0a 20 20  ary` trait\n\.  
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20                - 
2ad0: 60 78 60 2c 20 77 68 69 63 68 20 75 73 65 73 20  `x`, which uses 
2ae0: 74 68 65 20 60 4c 6f 77 65 72 48 65 78 60 20 74  the `LowerHex` t
2af0: 72 61 69 74 5c 6e 5c 0a 20 20 20 20 20 20 20 20  rait\n\.        
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 20 20 20 20 2d 20 60 58 60 2c 20 77          - `X`, w
2b20: 68 69 63 68 20 75 73 65 73 20 74 68 65 20 60 55  hich uses the `U
2b30: 70 70 65 72 48 65 78 60 20 74 72 61 69 74 22 29  pperHex` trait")
2b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2b50: 20 20 20 20 20 20 20 20 20 20 69 66 20 6c 65 74            if let
2b60: 20 53 6f 6d 65 28 73 70 29 20 3d 20 73 70 20 7b   Some(sp) = sp {
2b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
2b90: 20 28 66 6d 74 2c 20 6e 61 6d 65 29 20 69 6e 20   (fmt, name) in 
2ba0: 26 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &[.             
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc0: 20 20 20 28 22 22 2c 20 22 44 69 73 70 6c 61 79     ("", "Display
2bd0: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 28 22 3f 22 2c 20 22 44 65 62 75 67      ("?", "Debug
2c00: 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  "),.            
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c20: 20 20 20 20 28 22 65 22 2c 20 22 4c 6f 77 65 72      ("e", "Lower
2c30: 45 78 70 22 29 2c 0a 20 20 20 20 20 20 20 20 20  Exp"),.         
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 20 20 20 20 20 28 22 45 22 2c 20 22 55 70         ("E", "Up
2c60: 70 65 72 45 78 70 22 29 2c 0a 20 20 20 20 20 20  perExp"),.      
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 20 20 20 20 20 28 22 6f 22 2c 20            ("o", 
2c90: 22 4f 63 74 61 6c 22 29 2c 0a 20 20 20 20 20 20  "Octal"),.      
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb0: 20 20 20 20 20 20 20 20 20 20 28 22 70 22 2c 20            ("p", 
2cc0: 22 50 6f 69 6e 74 65 72 22 29 2c 0a 20 20 20 20  "Pointer"),.    
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 28 22 62 22              ("b"
2cf0: 2c 20 22 42 69 6e 61 72 79 22 29 2c 0a 20 20 20  , "Binary"),.   
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 22 78               ("x
2d20: 22 2c 20 22 4c 6f 77 65 72 48 65 78 22 29 2c 0a  ", "LowerHex"),.
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d50: 28 22 58 22 2c 20 22 55 70 70 65 72 48 65 78 22  ("X", "UpperHex"
2d60: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d                 ]
2d80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da0: 20 20 20 65 72 72 2e 74 6f 6f 6c 5f 6f 6e 6c 79     err.tool_only
2db0: 5f 73 70 61 6e 5f 73 75 67 67 65 73 74 69 6f 6e  _span_suggestion
2dc0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 20 20 20 20 20 20 73 70 2c 0a 20 20 20 20 20 20        sp,.      
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 66                &f
2e10: 6f 72 6d 61 74 21 28 22 75 73 65 20 74 68 65 20  ormat!("use the 
2e20: 60 7b 7d 60 20 74 72 61 69 74 22 2c 20 6e 61 6d  `{}` trait", nam
2e30: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e),.            
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 66 6d 74 2e 74 6f 5f 73          fmt.to_s
2e60: 74 72 69 6e 67 28 29 2c 0a 20 20 20 20 20 20 20  tring(),.       
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
2e90: 6c 69 63 61 62 69 6c 69 74 79 3a 3a 4d 61 79 62  licability::Mayb
2ea0: 65 49 6e 63 6f 72 72 65 63 74 2c 0a 20 20 20 20  eIncorrect,.    
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2f20: 72 72 2e 65 6d 69 74 28 29 3b 0a 20 20 20 20 20  rr.emit();.     
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 22 3c 69 6e 76 61 6c 69 64 3e 22 0a 20     "<invalid>". 
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2f70: 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20       });.       
2f80: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 76 65           self.ve
2f90: 72 69 66 79 5f 61 72 67 5f 74 79 70 65 28 70 6f  rify_arg_type(po
2fa0: 73 2c 20 74 79 29 3b 0a 20 20 20 20 20 20 20 20  s, ty);.        
2fb0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63 75 72          self.cur
2fc0: 70 69 65 63 65 20 2b 3d 20 31 3b 0a 20 20 20 20  piece += 1;.    
2fd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fe0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66    }.    }..    f
2ff0: 6e 20 76 65 72 69 66 79 5f 63 6f 75 6e 74 28 26  n verify_count(&
3000: 6d 75 74 20 73 65 6c 66 2c 20 63 3a 20 70 61 72  mut self, c: par
3010: 73 65 3a 3a 43 6f 75 6e 74 29 20 7b 0a 20 20 20  se::Count) {.   
3020: 20 20 20 20 20 6d 61 74 63 68 20 63 20 7b 0a 20       match c {. 
3030: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
3040: 3a 3a 43 6f 75 6e 74 49 6d 70 6c 69 65 64 20 7c  ::CountImplied |
3050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72  .            par
3060: 73 65 3a 3a 43 6f 75 6e 74 49 73 28 2e 2e 29 20  se::CountIs(..) 
3070: 3d 3e 20 7b 7d 0a 20 20 20 20 20 20 20 20 20 20  => {}.          
3080: 20 20 70 61 72 73 65 3a 3a 43 6f 75 6e 74 49 73    parse::CountIs
3090: 50 61 72 61 6d 28 69 29 20 3d 3e 20 7b 0a 20 20  Param(i) => {.  
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
30b0: 6c 66 2e 76 65 72 69 66 79 5f 61 72 67 5f 74 79  lf.verify_arg_ty
30c0: 70 65 28 45 78 61 63 74 28 69 29 2c 20 43 6f 75  pe(Exact(i), Cou
30d0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nt);.           
30e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
30f0: 61 72 73 65 3a 3a 43 6f 75 6e 74 49 73 4e 61 6d  arse::CountIsNam
3100: 65 28 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20  e(s) => {.      
3110: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 76            self.v
3120: 65 72 69 66 79 5f 61 72 67 5f 74 79 70 65 28 4e  erify_arg_type(N
3130: 61 6d 65 64 28 73 29 2c 20 43 6f 75 6e 74 29 3b  amed(s), Count);
3140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3150: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
3160: 20 20 20 20 66 6e 20 64 65 73 63 72 69 62 65 5f      fn describe_
3170: 6e 75 6d 5f 61 72 67 73 28 26 73 65 6c 66 29 20  num_args(&self) 
3180: 2d 3e 20 43 6f 77 3c 27 5f 2c 20 73 74 72 3e 20  -> Cow<'_, str> 
3190: 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
31a0: 73 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28 29 20  self.args.len() 
31b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 20  {.            0 
31c0: 3d 3e 20 22 6e 6f 20 61 72 67 75 6d 65 6e 74 73  => "no arguments
31d0: 20 77 65 72 65 20 67 69 76 65 6e 22 2e 69 6e 74   were given".int
31e0: 6f 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  o(),.           
31f0: 20 31 20 3d 3e 20 22 74 68 65 72 65 20 69 73 20   1 => "there is 
3200: 31 20 61 72 67 75 6d 65 6e 74 22 2e 69 6e 74 6f  1 argument".into
3210: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
3220: 78 20 3d 3e 20 66 6f 72 6d 61 74 21 28 22 74 68  x => format!("th
3230: 65 72 65 20 61 72 65 20 7b 7d 20 61 72 67 75 6d  ere are {} argum
3240: 65 6e 74 73 22 2c 20 78 29 2e 69 6e 74 6f 28 29  ents", x).into()
3250: 2c 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ,.        }.    
3260: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 48 61 6e 64 6c  }..    /// Handl
3270: 65 20 69 6e 76 61 6c 69 64 20 72 65 66 65 72 65  e invalid refere
3280: 6e 63 65 73 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nces to position
3290: 61 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 4f 75  al arguments. Ou
32a0: 74 70 75 74 20 64 69 66 66 65 72 65 6e 74 0a 20  tput different. 
32b0: 20 20 20 2f 2f 2f 20 65 72 72 6f 72 73 20 66 6f     /// errors fo
32c0: 72 20 74 68 65 20 63 61 73 65 20 77 68 65 72 65  r the case where
32d0: 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 61   all arguments a
32e0: 72 65 20 70 6f 73 69 74 69 6f 6e 61 6c 20 61 6e  re positional an
32f0: 64 20 66 6f 72 20 77 68 65 6e 0a 20 20 20 20 2f  d for when.    /
3300: 2f 2f 20 74 68 65 72 65 20 61 72 65 20 6e 61 6d  // there are nam
3310: 65 64 20 61 72 67 75 6d 65 6e 74 73 20 6f 72 20  ed arguments or 
3320: 6e 75 6d 62 65 72 65 64 20 70 6f 73 69 74 69 6f  numbered positio
3330: 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  nal arguments in
3340: 20 74 68 65 0a 20 20 20 20 2f 2f 2f 20 66 6f 72   the.    /// for
3350: 6d 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  mat string..    
3360: 66 6e 20 72 65 70 6f 72 74 5f 69 6e 76 61 6c 69  fn report_invali
3370: 64 5f 72 65 66 65 72 65 6e 63 65 73 28 26 73 65  d_references(&se
3380: 6c 66 2c 20 6e 75 6d 62 65 72 65 64 5f 70 6f 73  lf, numbered_pos
3390: 69 74 69 6f 6e 5f 61 72 67 73 3a 20 62 6f 6f 6c  ition_args: bool
33a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
33b0: 6d 75 74 20 65 3b 0a 20 20 20 20 20 20 20 20 6c  mut e;.        l
33c0: 65 74 20 73 70 20 3d 20 69 66 20 73 65 6c 66 2e  et sp = if self.
33d0: 69 73 5f 6c 69 74 65 72 61 6c 20 7b 20 2f 2f 20  is_literal { // 
33e0: 50 6f 69 6e 74 20 61 74 20 74 68 65 20 66 6f 72  Point at the for
33f0: 6d 61 74 74 69 6e 67 20 61 72 67 75 6d 65 6e 74  matting argument
3400: 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d  s..            M
3410: 75 6c 74 69 53 70 61 6e 3a 3a 66 72 6f 6d 5f 73  ultiSpan::from_s
3420: 70 61 6e 73 28 73 65 6c 66 2e 61 72 67 5f 73 70  pans(self.arg_sp
3430: 61 6e 73 2e 63 6c 6f 6e 65 28 29 29 0a 20 20 20  ans.clone()).   
3440: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
3450: 20 20 20 20 20 20 20 20 20 20 4d 75 6c 74 69 53            MultiS
3460: 70 61 6e 3a 3a 66 72 6f 6d 5f 73 70 61 6e 28 73  pan::from_span(s
3470: 65 6c 66 2e 66 6d 74 73 70 29 0a 20 20 20 20 20  elf.fmtsp).     
3480: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 6c 65     };.        le
3490: 74 20 72 65 66 73 20 3d 20 73 65 6c 66 0a 20 20  t refs = self.  
34a0: 20 20 20 20 20 20 20 20 20 20 2e 69 6e 76 61 6c            .inval
34b0: 69 64 5f 72 65 66 73 0a 20 20 20 20 20 20 20 20  id_refs.        
34c0: 20 20 20 20 2e 69 74 65 72 28 29 0a 20 20 20 20      .iter().    
34d0: 20 20 20 20 20 20 20 20 2e 6d 61 70 28 7c 28 72          .map(|(r
34e0: 2c 20 70 6f 73 29 7c 20 28 72 2e 74 6f 5f 73 74  , pos)| (r.to_st
34f0: 72 69 6e 67 28 29 2c 20 73 65 6c 66 2e 61 72 67  ring(), self.arg
3500: 5f 73 70 61 6e 73 2e 67 65 74 28 2a 70 6f 73 29  _spans.get(*pos)
3510: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  ));..        let
3520: 20 6d 75 74 20 7a 65 72 6f 5f 62 61 73 65 64 5f   mut zero_based_
3530: 6e 6f 74 65 20 3d 20 66 61 6c 73 65 3b 0a 0a 20  note = false;.. 
3540: 20 20 20 20 20 20 20 6c 65 74 20 63 6f 75 6e 74         let count
3550: 20 3d 20 73 65 6c 66 2e 70 69 65 63 65 73 2e 6c   = self.pieces.l
3560: 65 6e 28 29 20 2b 20 73 65 6c 66 2e 61 72 67 5f  en() + self.arg_
3570: 77 69 74 68 5f 66 6f 72 6d 61 74 74 69 6e 67 0a  with_formatting.
3580: 20 20 20 20 20 20 20 20 20 20 20 20 2e 69 74 65              .ite
3590: 72 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r().            
35a0: 2e 66 69 6c 74 65 72 28 7c 66 6d 74 7c 20 66 6d  .filter(|fmt| fm
35b0: 74 2e 70 72 65 63 69 73 69 6f 6e 5f 73 70 61 6e  t.precision_span
35c0: 2e 69 73 5f 73 6f 6d 65 28 29 29 0a 20 20 20 20  .is_some()).    
35d0: 20 20 20 20 20 20 20 20 2e 63 6f 75 6e 74 28 29          .count()
35e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 20 73 65 6c  ;.        if sel
35f0: 66 2e 6e 61 6d 65 73 2e 69 73 5f 65 6d 70 74 79  f.names.is_empty
3600: 28 29 20 26 26 20 21 6e 75 6d 62 65 72 65 64 5f  () && !numbered_
3610: 70 6f 73 69 74 69 6f 6e 5f 61 72 67 73 20 26 26  position_args &&
3620: 20 63 6f 75 6e 74 20 21 3d 20 73 65 6c 66 2e 61   count != self.a
3630: 72 67 73 2e 6c 65 6e 28 29 20 7b 0a 20 20 20 20  rgs.len() {.    
3640: 20 20 20 20 20 20 20 20 65 20 3d 20 73 65 6c 66          e = self
3650: 2e 65 63 78 2e 73 74 72 75 63 74 5f 73 70 61 6e  .ecx.struct_span
3660: 5f 65 72 72 28 0a 20 20 20 20 20 20 20 20 20 20  _err(.          
3670: 20 20 20 20 20 20 73 70 2c 0a 20 20 20 20 20 20        sp,.      
3680: 20 20 20 20 20 20 20 20 20 20 26 66 6f 72 6d 61            &forma
3690: 74 21 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  t!(.            
36a0: 20 20 20 20 20 20 20 20 22 7b 7d 20 70 6f 73 69          "{} posi
36b0: 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74 7b  tional argument{
36c0: 7d 20 69 6e 20 66 6f 72 6d 61 74 20 73 74 72 69  } in format stri
36d0: 6e 67 2c 20 62 75 74 20 7b 7d 22 2c 0a 20 20 20  ng, but {}",.   
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f0: 20 63 6f 75 6e 74 2c 0a 20 20 20 20 20 20 20 20   count,.        
3700: 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 75 72              plur
3710: 61 6c 69 7a 65 21 28 63 6f 75 6e 74 29 2c 0a 20  alize!(count),. 
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3730: 20 20 20 73 65 6c 66 2e 64 65 73 63 72 69 62 65     self.describe
3740: 5f 6e 75 6d 5f 61 72 67 73 28 29 2c 0a 20 20 20  _num_args(),.   
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 2c 0a               ),.
3760: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
3770: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 61             for a
3780: 72 67 20 69 6e 20 26 73 65 6c 66 2e 61 72 67 73  rg in &self.args
3790: 20 7b 20 2f 2f 20 50 6f 69 6e 74 20 61 74 20 74   { // Point at t
37a0: 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 68 61  he arguments tha
37b0: 74 20 77 69 6c 6c 20 62 65 20 66 6f 72 6d 61 74  t will be format
37c0: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ted..           
37d0: 20 20 20 20 20 65 2e 73 70 61 6e 5f 6c 61 62 65       e.span_labe
37e0: 6c 28 61 72 67 2e 73 70 61 6e 2c 20 22 22 29 3b  l(arg.span, "");
37f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3800: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
3810: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
3820: 28 6d 75 74 20 72 65 66 73 2c 20 73 70 61 6e 73  (mut refs, spans
3830: 29 3a 20 28 56 65 63 3c 5f 3e 2c 20 56 65 63 3c  ): (Vec<_>, Vec<
3840: 5f 3e 29 20 3d 20 72 65 66 73 2e 75 6e 7a 69 70  _>) = refs.unzip
3850: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
3860: 2f 2f 20 41 76 6f 69 64 20 60 69 6e 76 61 6c 69  // Avoid `invali
3870: 64 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  d reference to p
3880: 6f 73 69 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65  ositional argume
3890: 6e 74 73 20 37 20 61 6e 64 20 37 20 28 74 68 65  nts 7 and 7 (the
38a0: 72 65 20 69 73 20 31 20 61 72 67 75 6d 65 6e 74  re is 1 argument
38b0: 29 60 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  )`.            /
38c0: 2f 20 66 6f 72 20 60 70 72 69 6e 74 6c 6e 21 28  / for `println!(
38d0: 22 7b 37 3a 37 24 7d 22 2c 20 31 29 3b 60 0a 20  "{7:7$}", 1);`. 
38e0: 20 20 20 20 20 20 20 20 20 20 20 72 65 66 73 2e             refs.
38f0: 73 6f 72 74 28 29 3b 0a 20 20 20 20 20 20 20 20  sort();.        
3900: 20 20 20 20 72 65 66 73 2e 64 65 64 75 70 28 29      refs.dedup()
3910: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  ;.            le
3920: 74 20 28 61 72 67 5f 6c 69 73 74 2c 20 6d 75 74  t (arg_list, mut
3930: 20 73 70 29 20 3d 20 69 66 20 72 65 66 73 2e 6c   sp) = if refs.l
3940: 65 6e 28 29 20 3d 3d 20 31 20 7b 0a 20 20 20 20  en() == 1 {.    
3950: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
3960: 73 70 61 6e 73 3a 20 56 65 63 3c 5f 3e 20 3d 20  spans: Vec<_> = 
3970: 73 70 61 6e 73 2e 69 6e 74 6f 5f 69 74 65 72 28  spans.into_iter(
3980: 29 2e 66 69 6c 74 65 72 5f 6d 61 70 28 7c 73 70  ).filter_map(|sp
3990: 7c 20 73 70 2e 6d 61 70 28 7c 73 70 7c 20 2a 73  | sp.map(|sp| *s
39a0: 70 29 29 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 20  p)).collect();. 
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
39c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
39d0: 20 20 20 20 20 66 6f 72 6d 61 74 21 28 22 61 72       format!("ar
39e0: 67 75 6d 65 6e 74 20 7b 7d 22 2c 20 72 65 66 73  gument {}", refs
39f0: 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20  [0]),.          
3a00: 20 20 20 20 20 20 20 20 20 20 69 66 20 73 70 61            if spa
3a10: 6e 73 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b 0a  ns.is_empty() {.
3a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a30: 20 20 20 20 20 20 20 20 4d 75 6c 74 69 53 70 61          MultiSpa
3a40: 6e 3a 3a 66 72 6f 6d 5f 73 70 61 6e 28 73 65 6c  n::from_span(sel
3a50: 66 2e 66 6d 74 73 70 29 0a 20 20 20 20 20 20 20  f.fmtsp).       
3a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
3a70: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4d 75                Mu
3a90: 6c 74 69 53 70 61 6e 3a 3a 66 72 6f 6d 5f 73 70  ltiSpan::from_sp
3aa0: 61 6e 73 28 73 70 61 6e 73 29 0a 20 20 20 20 20  ans(spans).     
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
3ac0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3ad0: 20 20 29 0a 20 20 20 20 20 20 20 20 20 20 20 20    ).            
3ae0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
3af0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 6f 73           let pos
3b00: 20 3d 20 4d 75 6c 74 69 53 70 61 6e 3a 3a 66 72   = MultiSpan::fr
3b10: 6f 6d 5f 73 70 61 6e 73 28 73 70 61 6e 73 2e 69  om_spans(spans.i
3b20: 6e 74 6f 5f 69 74 65 72 28 29 2e 6d 61 70 28 7c  nto_iter().map(|
3b30: 73 7c 20 2a 73 2e 75 6e 77 72 61 70 28 29 29 2e  s| *s.unwrap()).
3b40: 63 6f 6c 6c 65 63 74 28 29 29 3b 0a 20 20 20 20  collect());.    
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
3b60: 72 65 67 20 3d 20 72 65 66 73 2e 70 6f 70 28 29  reg = refs.pop()
3b70: 2e 75 6e 77 72 61 70 28 29 3b 0a 20 20 20 20 20  .unwrap();.     
3b80: 20 20 20 20 20 20 20 20 20 20 20 28 0a 20 20 20             (.   
3b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ba0: 20 66 6f 72 6d 61 74 21 28 0a 20 20 20 20 20 20   format!(.      
3bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bc0: 20 20 22 61 72 67 75 6d 65 6e 74 73 20 7b 68 65    "arguments {he
3bd0: 61 64 7d 20 61 6e 64 20 7b 74 61 69 6c 7d 22 2c  ad} and {tail}",
3be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3bf0: 20 20 20 20 20 20 20 20 20 68 65 61 64 20 3d 20           head = 
3c00: 72 65 66 73 2e 6a 6f 69 6e 28 22 2c 20 22 29 2c  refs.join(", "),
3c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c20: 20 20 20 20 20 20 20 20 20 74 61 69 6c 20 3d 20           tail = 
3c30: 72 65 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  reg,.           
3c40: 20 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20           ),.    
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c60: 70 6f 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pos,.           
3c70: 20 20 20 20 20 29 0a 20 20 20 20 20 20 20 20 20       ).         
3c80: 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 20 20     };.          
3c90: 20 20 69 66 20 21 73 65 6c 66 2e 69 73 5f 6c 69    if !self.is_li
3ca0: 74 65 72 61 6c 20 7b 0a 20 20 20 20 20 20 20 20  teral {.        
3cb0: 20 20 20 20 20 20 20 20 73 70 20 3d 20 4d 75 6c          sp = Mul
3cc0: 74 69 53 70 61 6e 3a 3a 66 72 6f 6d 5f 73 70 61  tiSpan::from_spa
3cd0: 6e 28 73 65 6c 66 2e 66 6d 74 73 70 29 3b 0a 20  n(self.fmtsp);. 
3ce0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
3cf0: 20 20 20 20 20 20 20 20 20 20 65 20 3d 20 73 65            e = se
3d00: 6c 66 2e 65 63 78 2e 73 74 72 75 63 74 5f 73 70  lf.ecx.struct_sp
3d10: 61 6e 5f 65 72 72 28 73 70 2c 0a 20 20 20 20 20  an_err(sp,.     
3d20: 20 20 20 20 20 20 20 20 20 20 20 26 66 6f 72 6d             &form
3d30: 61 74 21 28 22 69 6e 76 61 6c 69 64 20 72 65 66  at!("invalid ref
3d40: 65 72 65 6e 63 65 20 74 6f 20 70 6f 73 69 74 69  erence to positi
3d50: 6f 6e 61 6c 20 7b 7d 20 28 7b 7d 29 22 2c 0a 20  onal {} ({})",. 
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d70: 20 20 20 20 20 20 20 20 61 72 67 5f 6c 69 73 74          arg_list
3d80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3d90: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
3da0: 64 65 73 63 72 69 62 65 5f 6e 75 6d 5f 61 72 67  describe_num_arg
3db0: 73 28 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  s()));.         
3dc0: 20 20 20 7a 65 72 6f 5f 62 61 73 65 64 5f 6e 6f     zero_based_no
3dd0: 74 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  te = true;.     
3de0: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 66     };..        f
3df0: 6f 72 20 66 6d 74 20 69 6e 20 26 73 65 6c 66 2e  or fmt in &self.
3e00: 61 72 67 5f 77 69 74 68 5f 66 6f 72 6d 61 74 74  arg_with_formatt
3e10: 69 6e 67 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ing {.          
3e20: 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28 73 70    if let Some(sp
3e30: 61 6e 29 20 3d 20 66 6d 74 2e 70 72 65 63 69 73  an) = fmt.precis
3e40: 69 6f 6e 5f 73 70 61 6e 20 7b 0a 20 20 20 20 20  ion_span {.     
3e50: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73             let s
3e60: 70 61 6e 20 3d 20 73 65 6c 66 2e 66 6d 74 73 70  pan = self.fmtsp
3e70: 2e 66 72 6f 6d 5f 69 6e 6e 65 72 28 73 70 61 6e  .from_inner(span
3e80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3e90: 20 20 20 6d 61 74 63 68 20 66 6d 74 2e 70 72 65     match fmt.pre
3ea0: 63 69 73 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  cision {.       
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 72               par
3ec0: 73 65 3a 3a 43 6f 75 6e 74 49 73 50 61 72 61 6d  se::CountIsParam
3ed0: 28 70 6f 73 29 20 69 66 20 70 6f 73 20 3e 20 73  (pos) if pos > s
3ee0: 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28 29 20 3d  elf.args.len() =
3ef0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 65 2e 73 70              e.sp
3f10: 61 6e 5f 6c 61 62 65 6c 28 73 70 61 6e 2c 20 26  an_label(span, &
3f20: 66 6f 72 6d 61 74 21 28 0a 20 20 20 20 20 20 20  format!(.       
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 22 74 68 69 73 20 70 72 65 63 69       "this preci
3f50: 73 69 6f 6e 20 66 6c 61 67 20 65 78 70 65 63 74  sion flag expect
3f60: 73 20 61 6e 20 60 75 73 69 7a 65 60 20 61 72 67  s an `usize` arg
3f70: 75 6d 65 6e 74 20 61 74 20 70 6f 73 69 74 69 6f  ument at positio
3f80: 6e 20 7b 7d 2c 20 5c 0a 20 20 20 20 20 20 20 20  n {}, \.        
3f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fa0: 20 20 20 20 20 62 75 74 20 7b 7d 22 2c 0a 20 20       but {}",.  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 20 20 20 20 20 70 6f 73 2c 0a 20            pos,. 
3fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fe0: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
3ff0: 64 65 73 63 72 69 62 65 5f 6e 75 6d 5f 61 72 67  describe_num_arg
4000: 73 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s(),.           
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 29 29 3b               ));
4020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4030: 20 20 20 20 20 20 20 20 20 7a 65 72 6f 5f 62 61           zero_ba
4040: 73 65 64 5f 6e 6f 74 65 20 3d 20 74 72 75 65 3b  sed_note = true;
4050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
4070: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
4080: 3a 3a 43 6f 75 6e 74 49 73 50 61 72 61 6d 28 70  ::CountIsParam(p
4090: 6f 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  os) => {.       
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40b0: 20 6c 65 74 20 63 6f 75 6e 74 20 3d 20 73 65 6c   let count = sel
40c0: 66 2e 70 69 65 63 65 73 2e 6c 65 6e 28 29 20 2b  f.pieces.len() +
40d0: 20 73 65 6c 66 2e 61 72 67 5f 77 69 74 68 5f 66   self.arg_with_f
40e0: 6f 72 6d 61 74 74 69 6e 67 0a 20 20 20 20 20 20  ormatting.      
40f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4100: 20 20 20 20 20 20 2e 69 74 65 72 28 29 0a 20 20        .iter().  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 20 20 20 20 20 20 20 20 2e 66 69 6c 74 65            .filte
4130: 72 28 7c 66 6d 74 7c 20 66 6d 74 2e 70 72 65 63  r(|fmt| fmt.prec
4140: 69 73 69 6f 6e 5f 73 70 61 6e 2e 69 73 5f 73 6f  ision_span.is_so
4150: 6d 65 28 29 29 0a 20 20 20 20 20 20 20 20 20 20  me()).          
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4170: 20 20 2e 63 6f 75 6e 74 28 29 3b 0a 20 20 20 20    .count();.    
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4190: 20 20 20 20 65 2e 73 70 61 6e 5f 6c 61 62 65 6c      e.span_label
41a0: 28 73 70 61 6e 2c 20 26 66 6f 72 6d 61 74 21 28  (span, &format!(
41b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
41c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68               "th
41d0: 69 73 20 70 72 65 63 69 73 69 6f 6e 20 66 6c 61  is precision fla
41e0: 67 20 61 64 64 73 20 61 6e 20 65 78 74 72 61 20  g adds an extra 
41f0: 72 65 71 75 69 72 65 64 20 61 72 67 75 6d 65 6e  required argumen
4200: 74 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 7b 7d  t at position {}
4210: 2c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  , \.            
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4230: 20 77 68 69 63 68 20 69 73 20 77 68 79 20 74 68   which is why th
4240: 65 72 65 20 7b 7d 20 65 78 70 65 63 74 65 64 22  ere {} expected"
4250: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f                po
4270: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
4290: 66 20 63 6f 75 6e 74 20 3d 3d 20 31 20 7b 0a 20  f count == 1 {. 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
42c0: 69 73 20 31 20 61 72 67 75 6d 65 6e 74 22 2e 74  is 1 argument".t
42d0: 6f 5f 73 74 72 69 6e 67 28 29 0a 20 20 20 20 20  o_string().     
42e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42f0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
4300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 66 6f 72 6d 61 74 21 28 22 61 72 65 20 7b 7d 20  format!("are {} 
4330: 61 72 67 75 6d 65 6e 74 73 22 2c 20 63 6f 75 6e  arguments", coun
4340: 74 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t).             
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
4360: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4370: 20 20 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20            ));.  
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4390: 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d        if let Som
43a0: 65 28 61 72 67 29 20 3d 20 73 65 6c 66 2e 61 72  e(arg) = self.ar
43b0: 67 73 2e 67 65 74 28 70 6f 73 29 20 7b 0a 20 20  gs.get(pos) {.  
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 20 20 20 20 20 20 20 20 65 2e 73 70 61 6e            e.span
43e0: 5f 6c 61 62 65 6c 28 0a 20 20 20 20 20 20 20 20  _label(.        
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 20 61 72 67 2e 73 70 61 6e          arg.span
4410: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4430: 20 20 22 74 68 69 73 20 70 61 72 61 6d 65 74 65    "this paramete
4440: 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
4450: 20 74 68 65 20 70 72 65 63 69 73 69 6f 6e 20 66   the precision f
4460: 6c 61 67 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lag",.          
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20    );.           
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 20 20 20 20 7a 65 72 6f 5f 62 61 73 65         zero_base
44c0: 64 5f 6e 6f 74 65 20 3d 20 74 72 75 65 3b 0a 20  d_note = true;. 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
44f0: 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b 7d           _ => {}
4500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4510: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
4520: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4530: 6c 65 74 20 53 6f 6d 65 28 73 70 61 6e 29 20 3d  let Some(span) =
4540: 20 66 6d 74 2e 77 69 64 74 68 5f 73 70 61 6e 20   fmt.width_span 
4550: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
4560: 20 20 6c 65 74 20 73 70 61 6e 20 3d 20 73 65 6c    let span = sel
4570: 66 2e 66 6d 74 73 70 2e 66 72 6f 6d 5f 69 6e 6e  f.fmtsp.from_inn
4580: 65 72 28 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  er(span);.      
4590: 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20            match 
45a0: 66 6d 74 2e 77 69 64 74 68 20 7b 0a 20 20 20 20  fmt.width {.    
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45c0: 70 61 72 73 65 3a 3a 43 6f 75 6e 74 49 73 50 61  parse::CountIsPa
45d0: 72 61 6d 28 70 6f 73 29 20 69 66 20 70 6f 73 20  ram(pos) if pos 
45e0: 3e 20 73 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28  > self.args.len(
45f0: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
4610: 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 73 70 61 6e  .span_label(span
4620: 2c 20 26 66 6f 72 6d 61 74 21 28 0a 20 20 20 20  , &format!(.    
4630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4640: 20 20 20 20 20 20 20 20 22 74 68 69 73 20 77 69          "this wi
4650: 64 74 68 20 66 6c 61 67 20 65 78 70 65 63 74 73  dth flag expects
4660: 20 61 6e 20 60 75 73 69 7a 65 60 20 61 72 67 75   an `usize` argu
4670: 6d 65 6e 74 20 61 74 20 70 6f 73 69 74 69 6f 6e  ment at position
4680: 20 7b 7d 2c 20 5c 0a 20 20 20 20 20 20 20 20 20   {}, \.         
4690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46a0: 20 20 20 20 62 75 74 20 7b 7d 22 2c 0a 20 20 20      but {}",.   
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 20 20 20 20 20 20 70 6f 73 2c 0a 20 20           pos,.  
46d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46e0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 64            self.d
46f0: 65 73 63 72 69 62 65 5f 6e 75 6d 5f 61 72 67 73  escribe_num_args
4700: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
4710: 20 20 20 20 20 20 20 20 20 20 20 20 29 29 3b 0a              ));.
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 20 20 20 20 20 20 7a 65 72 6f 5f 62 61 73          zero_bas
4740: 65 64 5f 6e 6f 74 65 20 3d 20 74 72 75 65 3b 0a  ed_note = true;.
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4770: 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b            _ => {
4780: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4790: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
47a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
47b0: 20 20 20 20 69 66 20 7a 65 72 6f 5f 62 61 73 65      if zero_base
47c0: 64 5f 6e 6f 74 65 20 7b 0a 20 20 20 20 20 20 20  d_note {.       
47d0: 20 20 20 20 20 65 2e 6e 6f 74 65 28 22 70 6f 73       e.note("pos
47e0: 69 74 69 6f 6e 61 6c 20 61 72 67 75 6d 65 6e 74  itional argument
47f0: 73 20 61 72 65 20 7a 65 72 6f 2d 62 61 73 65 64  s are zero-based
4800: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
4810: 20 20 20 20 20 20 69 66 20 21 73 65 6c 66 2e 61        if !self.a
4820: 72 67 5f 77 69 74 68 5f 66 6f 72 6d 61 74 74 69  rg_with_formatti
4830: 6e 67 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b 0a  ng.is_empty() {.
4840: 20 20 20 20 20 20 20 20 20 20 20 20 65 2e 6e 6f              e.no
4850: 74 65 28 22 66 6f 72 20 69 6e 66 6f 72 6d 61 74  te("for informat
4860: 69 6f 6e 20 61 62 6f 75 74 20 66 6f 72 6d 61 74  ion about format
4870: 74 69 6e 67 20 66 6c 61 67 73 2c 20 76 69 73 69  ting flags, visi
4880: 74 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t \.            
4890: 20 20 20 20 20 20 20 20 68 74 74 70 73 3a 2f 2f          https://
48a0: 64 6f 63 2e 72 75 73 74 2d 6c 61 6e 67 2e 6f 72  doc.rust-lang.or
48b0: 67 2f 73 74 64 2f 66 6d 74 2f 69 6e 64 65 78 2e  g/std/fmt/index.
48c0: 68 74 6d 6c 22 29 3b 0a 20 20 20 20 20 20 20 20  html");.        
48d0: 7d 0a 0a 20 20 20 20 20 20 20 20 65 2e 65 6d 69  }..        e.emi
48e0: 74 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  t();.    }..    
48f0: 2f 2f 2f 20 41 63 74 75 61 6c 6c 79 20 76 65 72  /// Actually ver
4900: 69 66 69 65 73 20 61 6e 64 20 74 72 61 63 6b 73  ifies and tracks
4910: 20 61 20 67 69 76 65 6e 20 66 6f 72 6d 61 74 20   a given format 
4920: 70 6c 61 63 65 68 6f 6c 64 65 72 0a 20 20 20 20  placeholder.    
4930: 2f 2f 2f 20 28 61 2e 6b 2e 61 2e 20 61 72 67 75  /// (a.k.a. argu
4940: 6d 65 6e 74 29 2e 0a 20 20 20 20 66 6e 20 76 65  ment)..    fn ve
4950: 72 69 66 79 5f 61 72 67 5f 74 79 70 65 28 26 6d  rify_arg_type(&m
4960: 75 74 20 73 65 6c 66 2c 20 61 72 67 3a 20 50 6f  ut self, arg: Po
4970: 73 69 74 69 6f 6e 2c 20 74 79 3a 20 41 72 67 75  sition, ty: Argu
4980: 6d 65 6e 74 54 79 70 65 29 20 7b 0a 20 20 20 20  mentType) {.    
4990: 20 20 20 20 6d 61 74 63 68 20 61 72 67 20 7b 0a      match arg {.
49a0: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 61 63              Exac
49b0: 74 28 61 72 67 29 20 3d 3e 20 7b 0a 20 20 20 20  t(arg) => {.    
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
49d0: 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28 29 20 3c  elf.args.len() <
49e0: 3d 20 61 72 67 20 7b 0a 20 20 20 20 20 20 20 20  = arg {.        
49f0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
4a00: 2e 69 6e 76 61 6c 69 64 5f 72 65 66 73 2e 70 75  .invalid_refs.pu
4a10: 73 68 28 28 61 72 67 2c 20 73 65 6c 66 2e 63 75  sh((arg, self.cu
4a20: 72 70 69 65 63 65 29 29 3b 0a 20 20 20 20 20 20  rpiece));.      
4a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
4a40: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
4a50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4a60: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 74 79          match ty
4a70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4a80: 20 20 20 20 20 20 20 50 6c 61 63 65 68 6f 6c 64         Placehold
4a90: 65 72 28 5f 29 20 3d 3e 20 7b 0a 20 20 20 20 20  er(_) => {.     
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 2f 2f 20 72 65 63 6f 72 64 20 65 76 65     // record eve
4ac0: 72 79 20 28 70 6f 73 69 74 69 6f 6e 2c 20 74 79  ry (position, ty
4ad0: 70 65 29 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  pe) combination 
4ae0: 6f 6e 6c 79 20 6f 6e 63 65 0a 20 20 20 20 20 20  only once.      
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 6c 65 74 20 72 65 66 20 6d 75 74 20 73 65    let ref mut se
4b10: 65 6e 5f 74 79 20 3d 20 73 65 6c 66 2e 61 72 67  en_ty = self.arg
4b20: 5f 75 6e 69 71 75 65 5f 74 79 70 65 73 5b 61 72  _unique_types[ar
4b30: 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g];.            
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
4b50: 69 20 3d 20 73 65 65 6e 5f 74 79 2e 69 74 65 72  i = seen_ty.iter
4b60: 28 29 2e 70 6f 73 69 74 69 6f 6e 28 7c 78 7c 20  ().position(|x| 
4b70: 2a 78 20 3d 3d 20 74 79 29 2e 75 6e 77 72 61 70  *x == ty).unwrap
4b80: 5f 6f 72 5f 65 6c 73 65 28 7c 7c 20 7b 0a 20 20  _or_else(|| {.  
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ba0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 69 20            let i 
4bb0: 3d 20 73 65 65 6e 5f 74 79 2e 6c 65 6e 28 29 3b  = seen_ty.len();
4bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65               see
4be0: 6e 5f 74 79 2e 70 75 73 68 28 74 79 29 3b 0a 20  n_ty.push(ty);. 
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 20 20 20 20 20 20 20 69 0a 20 20 20             i.   
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20       });.       
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 73 65 6c 66 2e 61 72 67 5f 74 79 70 65 73 5b   self.arg_types[
4c50: 61 72 67 5d 2e 70 75 73 68 28 69 29 3b 0a 20 20  arg].push(i);.  
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
4c80: 20 20 20 20 20 20 20 20 43 6f 75 6e 74 20 3d 3e          Count =>
4c90: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4ca0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 6c 65             if le
4cb0: 74 20 45 6e 74 72 79 3a 3a 56 61 63 61 6e 74 28  t Entry::Vacant(
4cc0: 65 29 20 3d 20 73 65 6c 66 2e 63 6f 75 6e 74 5f  e) = self.count_
4cd0: 70 6f 73 69 74 69 6f 6e 73 2e 65 6e 74 72 79 28  positions.entry(
4ce0: 61 72 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  arg) {.         
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 20 20 20 6c 65 74 20 69 20 3d 20 73 65 6c 66 2e     let i = self.
4d10: 63 6f 75 6e 74 5f 70 6f 73 69 74 69 6f 6e 73 5f  count_positions_
4d20: 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 20  count;.         
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d40: 20 20 20 65 2e 69 6e 73 65 72 74 28 69 29 3b 0a     e.insert(i);.
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
4d70: 2e 63 6f 75 6e 74 5f 61 72 67 73 2e 70 75 73 68  .count_args.push
4d80: 28 45 78 61 63 74 28 61 72 67 29 29 3b 0a 20 20  (Exact(arg));.  
4d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4da0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63            self.c
4db0: 6f 75 6e 74 5f 70 6f 73 69 74 69 6f 6e 73 5f 63  ount_positions_c
4dc0: 6f 75 6e 74 20 2b 3d 20 31 3b 0a 20 20 20 20 20  ount += 1;.     
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
4df0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4e00: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
4e10: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
4e20: 20 20 20 20 20 20 20 20 4e 61 6d 65 64 28 6e 61          Named(na
4e30: 6d 65 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20  me) => {.       
4e40: 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 73           match s
4e50: 65 6c 66 2e 6e 61 6d 65 73 2e 67 65 74 28 26 6e  elf.names.get(&n
4e60: 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ame) {.         
4e70: 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28             Some(
4e80: 26 69 64 78 29 20 3d 3e 20 7b 0a 20 20 20 20 20  &idx) => {.     
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ea0: 20 20 20 2f 2f 20 54 72 65 61 74 20 61 73 20 70     // Treat as p
4eb0: 6f 73 69 74 69 6f 6e 61 6c 20 61 72 67 2e 0a 20  ositional arg.. 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ed0: 20 20 20 20 20 20 20 73 65 6c 66 2e 76 65 72 69         self.veri
4ee0: 66 79 5f 61 72 67 5f 74 79 70 65 28 45 78 61 63  fy_arg_type(Exac
4ef0: 74 28 69 64 78 29 2c 20 74 79 29 0a 20 20 20 20  t(idx), ty).    
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
4f20: 20 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 7b 0a        None => {.
4f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f40: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 73 67 20          let msg 
4f50: 3d 20 66 6f 72 6d 61 74 21 28 22 74 68 65 72 65  = format!("there
4f60: 20 69 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 20   is no argument 
4f70: 6e 61 6d 65 64 20 60 7b 7d 60 22 2c 20 6e 61 6d  named `{}`", nam
4f80: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
4fa0: 73 70 20 3d 20 69 66 20 73 65 6c 66 2e 69 73 5f  sp = if self.is_
4fb0: 6c 69 74 65 72 61 6c 20 7b 0a 20 20 20 20 20 20  literal {.      
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fd0: 20 20 20 20 20 20 2a 73 65 6c 66 2e 61 72 67 5f        *self.arg_
4fe0: 73 70 61 6e 73 2e 67 65 74 28 73 65 6c 66 2e 63  spans.get(self.c
4ff0: 75 72 70 69 65 63 65 29 2e 75 6e 77 72 61 70 5f  urpiece).unwrap_
5000: 6f 72 28 26 73 65 6c 66 2e 66 6d 74 73 70 29 0a  or(&self.fmtsp).
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
5030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c               sel
5050: 66 2e 66 6d 74 73 70 0a 20 20 20 20 20 20 20 20  f.fmtsp.        
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
5080: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
5090: 75 74 20 65 72 72 20 3d 20 73 65 6c 66 2e 65 63  ut err = self.ec
50a0: 78 2e 73 74 72 75 63 74 5f 73 70 61 6e 5f 65 72  x.struct_span_er
50b0: 72 28 73 70 2c 20 26 6d 73 67 5b 2e 2e 5d 29 3b  r(sp, &msg[..]);
50c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
50d0: 20 20 20 20 20 20 20 20 20 65 72 72 2e 65 6d 69           err.emi
50e0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t();.           
50f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5100: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
5110: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5120: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
5130: 2f 2f 2f 20 42 75 69 6c 64 73 20 74 68 65 20 6d  /// Builds the m
5140: 61 70 70 69 6e 67 20 62 65 74 77 65 65 6e 20 66  apping between f
5150: 6f 72 6d 61 74 20 70 6c 61 63 65 68 6f 6c 64 65  ormat placeholde
5160: 72 73 20 61 6e 64 20 61 72 67 75 6d 65 6e 74 20  rs and argument 
5170: 6f 62 6a 65 63 74 73 2e 0a 20 20 20 20 66 6e 20  objects..    fn 
5180: 62 75 69 6c 64 5f 69 6e 64 65 78 5f 6d 61 70 28  build_index_map(
5190: 26 6d 75 74 20 73 65 6c 66 29 20 7b 0a 20 20 20  &mut self) {.   
51a0: 20 20 20 20 20 2f 2f 20 4e 4f 54 45 3a 20 4b 65       // NOTE: Ke
51b0: 65 70 20 74 68 65 20 6f 72 64 65 72 69 6e 67 20  ep the ordering 
51c0: 74 68 65 20 73 61 6d 65 20 61 73 20 60 69 6e 74  the same as `int
51d0: 6f 5f 65 78 70 72 60 27 73 20 65 78 70 61 6e 73  o_expr`'s expans
51e0: 69 6f 6e 20 77 6f 75 6c 64 20 64 6f 21 0a 20 20  ion would do!.  
51f0: 20 20 20 20 20 20 6c 65 74 20 61 72 67 73 5f 6c        let args_l
5200: 65 6e 20 3d 20 73 65 6c 66 2e 61 72 67 73 2e 6c  en = self.args.l
5210: 65 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65  en();.        se
5220: 6c 66 2e 61 72 67 5f 69 6e 64 65 78 5f 6d 61 70  lf.arg_index_map
5230: 2e 72 65 73 65 72 76 65 28 61 72 67 73 5f 6c 65  .reserve(args_le
5240: 6e 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74  n);..        let
5250: 20 6d 75 74 20 73 6f 66 61 72 20 3d 20 30 75 73   mut sofar = 0us
5260: 69 7a 65 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  ize;..        //
5270: 20 4d 61 70 20 74 68 65 20 61 72 67 75 6d 65 6e   Map the argumen
5280: 74 73 0a 20 20 20 20 20 20 20 20 66 6f 72 20 69  ts.        for i
5290: 20 69 6e 20 30 2e 2e 61 72 67 73 5f 6c 65 6e 20   in 0..args_len 
52a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65  {.            le
52b0: 74 20 72 65 66 20 61 72 67 5f 74 79 70 65 73 20  t ref arg_types 
52c0: 3d 20 73 65 6c 66 2e 61 72 67 5f 74 79 70 65 73  = self.arg_types
52d0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
52e0: 20 6c 65 74 20 61 72 67 5f 6f 66 66 73 65 74 73   let arg_offsets
52f0: 20 3d 20 61 72 67 5f 74 79 70 65 73 2e 69 74 65   = arg_types.ite
5300: 72 28 29 2e 6d 61 70 28 7c 6f 66 66 73 65 74 7c  r().map(|offset|
5310: 20 73 6f 66 61 72 20 2b 20 2a 6f 66 66 73 65 74   sofar + *offset
5320: 29 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65 63 3c  ).collect::<Vec<
5330: 5f 3e 3e 28 29 3b 0a 20 20 20 20 20 20 20 20 20  _>>();.         
5340: 20 20 20 73 65 6c 66 2e 61 72 67 5f 69 6e 64 65     self.arg_inde
5350: 78 5f 6d 61 70 2e 70 75 73 68 28 61 72 67 5f 6f  x_map.push(arg_o
5360: 66 66 73 65 74 73 29 3b 0a 20 20 20 20 20 20 20  ffsets);.       
5370: 20 20 20 20 20 73 6f 66 61 72 20 2b 3d 20 73 65       sofar += se
5380: 6c 66 2e 61 72 67 5f 75 6e 69 71 75 65 5f 74 79  lf.arg_unique_ty
5390: 70 65 73 5b 69 5d 2e 6c 65 6e 28 29 3b 0a 20 20  pes[i].len();.  
53a0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
53b0: 20 2f 2f 20 52 65 63 6f 72 64 20 73 74 61 72 74   // Record start
53c0: 69 6e 67 20 69 6e 64 65 78 20 66 6f 72 20 63 6f  ing index for co
53d0: 75 6e 74 73 2c 20 77 68 69 63 68 20 61 70 70 65  unts, which appe
53e0: 61 72 20 6a 75 73 74 20 61 66 74 65 72 20 61 72  ar just after ar
53f0: 67 75 6d 65 6e 74 73 0a 20 20 20 20 20 20 20 20  guments.        
5400: 73 65 6c 66 2e 63 6f 75 6e 74 5f 61 72 67 73 5f  self.count_args_
5410: 69 6e 64 65 78 5f 6f 66 66 73 65 74 20 3d 20 73  index_offset = s
5420: 6f 66 61 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ofar;.    }..   
5430: 20 66 6e 20 72 74 70 61 74 68 28 65 63 78 3a 20   fn rtpath(ecx: 
5440: 26 45 78 74 43 74 78 74 3c 27 5f 3e 2c 20 73 3a  &ExtCtxt<'_>, s:
5450: 20 26 73 74 72 29 20 2d 3e 20 56 65 63 3c 61 73   &str) -> Vec<as
5460: 74 3a 3a 49 64 65 6e 74 3e 20 7b 0a 20 20 20 20  t::Ident> {.    
5470: 20 20 20 20 65 63 78 2e 73 74 64 5f 70 61 74 68      ecx.std_path
5480: 28 26 5b 73 79 6d 3a 3a 66 6d 74 2c 20 73 79 6d  (&[sym::fmt, sym
5490: 3a 3a 72 74 2c 20 73 79 6d 3a 3a 76 31 2c 20 53  ::rt, sym::v1, S
54a0: 79 6d 62 6f 6c 3a 3a 69 6e 74 65 72 6e 28 73 29  ymbol::intern(s)
54b0: 5d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e  ]).    }..    fn
54c0: 20 62 75 69 6c 64 5f 63 6f 75 6e 74 28 26 73 65   build_count(&se
54d0: 6c 66 2c 20 63 3a 20 70 61 72 73 65 3a 3a 43 6f  lf, c: parse::Co
54e0: 75 6e 74 29 20 2d 3e 20 50 3c 61 73 74 3a 3a 45  unt) -> P<ast::E
54f0: 78 70 72 3e 20 7b 0a 20 20 20 20 20 20 20 20 6c  xpr> {.        l
5500: 65 74 20 73 70 20 3d 20 73 65 6c 66 2e 6d 61 63  et sp = self.mac
5510: 73 70 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  sp;.        let 
5520: 63 6f 75 6e 74 20 3d 20 7c 63 2c 20 61 72 67 7c  count = |c, arg|
5530: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c   {.            l
5540: 65 74 20 6d 75 74 20 70 61 74 68 20 3d 20 43 6f  et mut path = Co
5550: 6e 74 65 78 74 3a 3a 72 74 70 61 74 68 28 73 65  ntext::rtpath(se
5560: 6c 66 2e 65 63 78 2c 20 22 43 6f 75 6e 74 22 29  lf.ecx, "Count")
5570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  ;.            pa
5580: 74 68 2e 70 75 73 68 28 73 65 6c 66 2e 65 63 78  th.push(self.ecx
5590: 2e 69 64 65 6e 74 5f 6f 66 28 63 2c 20 73 70 29  .ident_of(c, sp)
55a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  );.            m
55b0: 61 74 63 68 20 61 72 67 20 7b 0a 20 20 20 20 20  atch arg {.     
55c0: 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28             Some(
55d0: 61 72 67 29 20 3d 3e 20 73 65 6c 66 2e 65 63 78  arg) => self.ecx
55e0: 2e 65 78 70 72 5f 63 61 6c 6c 5f 67 6c 6f 62 61  .expr_call_globa
55f0: 6c 28 73 70 2c 20 70 61 74 68 2c 20 76 65 63 21  l(sp, path, vec!
5600: 5b 61 72 67 5d 29 2c 0a 20 20 20 20 20 20 20 20  [arg]),.        
5610: 20 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20          None => 
5620: 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f 70 61  self.ecx.expr_pa
5630: 74 68 28 73 65 6c 66 2e 65 63 78 2e 70 61 74 68  th(self.ecx.path
5640: 5f 67 6c 6f 62 61 6c 28 73 70 2c 20 70 61 74 68  _global(sp, path
5650: 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )),.            
5660: 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  }.        };.   
5670: 20 20 20 20 20 6d 61 74 63 68 20 63 20 7b 0a 20       match c {. 
5680: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
5690: 3a 3a 43 6f 75 6e 74 49 73 28 69 29 20 3d 3e 20  ::CountIs(i) => 
56a0: 63 6f 75 6e 74 28 22 49 73 22 2c 20 53 6f 6d 65  count("Is", Some
56b0: 28 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f 75  (self.ecx.expr_u
56c0: 73 69 7a 65 28 73 70 2c 20 69 29 29 29 2c 0a 20  size(sp, i))),. 
56d0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
56e0: 3a 3a 43 6f 75 6e 74 49 73 50 61 72 61 6d 28 69  ::CountIsParam(i
56f0: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
5700: 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 6e         // This n
5710: 65 65 64 73 20 6d 61 70 70 69 6e 67 20 74 6f 6f  eeds mapping too
5720: 2c 20 61 73 20 60 69 60 20 69 73 20 72 65 66 65  , as `i` is refe
5730: 72 72 69 6e 67 20 74 6f 20 61 20 6d 61 63 72 6f  rring to a macro
5740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5750: 20 2f 2f 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   // argument. If
5760: 20 60 69 60 20 69 73 20 6e 6f 74 20 66 6f 75 6e   `i` is not foun
5770: 64 20 69 6e 20 60 63 6f 75 6e 74 5f 70 6f 73 69  d in `count_posi
5780: 74 69 6f 6e 73 60 20 74 68 65 6e 0a 20 20 20 20  tions` then.    
5790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
57a0: 68 65 20 65 72 72 6f 72 20 68 61 64 20 61 6c 72  he error had alr
57b0: 65 61 64 79 20 62 65 65 6e 20 65 6d 69 74 74 65  eady been emitte
57c0: 64 20 65 6c 73 65 77 68 65 72 65 2e 0a 20 20 20  d elsewhere..   
57d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
57e0: 20 69 20 3d 20 73 65 6c 66 2e 63 6f 75 6e 74 5f   i = self.count_
57f0: 70 6f 73 69 74 69 6f 6e 73 2e 67 65 74 28 26 69  positions.get(&i
5800: 29 2e 63 6c 6f 6e 65 64 28 29 2e 75 6e 77 72 61  ).cloned().unwra
5810: 70 5f 6f 72 28 30 29 0a 20 20 20 20 20 20 20 20  p_or(0).        
5820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
5830: 73 65 6c 66 2e 63 6f 75 6e 74 5f 61 72 67 73 5f  self.count_args_
5840: 69 6e 64 65 78 5f 6f 66 66 73 65 74 3b 0a 20 20  index_offset;.  
5850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
5860: 75 6e 74 28 22 50 61 72 61 6d 22 2c 20 53 6f 6d  unt("Param", Som
5870: 65 28 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f  e(self.ecx.expr_
5880: 75 73 69 7a 65 28 73 70 2c 20 69 29 29 29 0a 20  usize(sp, i))). 
5890: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
58a0: 20 20 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a           parse::
58b0: 43 6f 75 6e 74 49 6d 70 6c 69 65 64 20 3d 3e 20  CountImplied => 
58c0: 63 6f 75 6e 74 28 22 49 6d 70 6c 69 65 64 22 2c  count("Implied",
58d0: 20 4e 6f 6e 65 29 2c 0a 20 20 20 20 20 20 20 20   None),.        
58e0: 20 20 20 20 2f 2f 20 73 68 6f 75 6c 64 20 6e 65      // should ne
58f0: 76 65 72 20 62 65 20 74 68 65 20 63 61 73 65 2c  ver be the case,
5900: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 72 65 61   names are alrea
5910: 64 79 20 72 65 73 6f 6c 76 65 64 0a 20 20 20 20  dy resolved.    
5920: 20 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a 43          parse::C
5930: 6f 75 6e 74 49 73 4e 61 6d 65 28 5f 29 20 3d 3e  ountIsName(_) =>
5940: 20 70 61 6e 69 63 21 28 22 73 68 6f 75 6c 64 20   panic!("should 
5950: 6e 65 76 65 72 20 68 61 70 70 65 6e 22 29 2c 0a  never happen"),.
5960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
5970: 0a 20 20 20 20 2f 2f 2f 20 42 75 69 6c 64 20 61  .    /// Build a
5980: 20 6c 69 74 65 72 61 6c 20 65 78 70 72 65 73 73   literal express
5990: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 61 63 63  ion from the acc
59a0: 75 6d 75 6c 61 74 65 64 20 73 74 72 69 6e 67 20  umulated string 
59b0: 6c 69 74 65 72 61 6c 73 0a 20 20 20 20 66 6e 20  literals.    fn 
59c0: 62 75 69 6c 64 5f 6c 69 74 65 72 61 6c 5f 73 74  build_literal_st
59d0: 72 69 6e 67 28 26 6d 75 74 20 73 65 6c 66 29 20  ring(&mut self) 
59e0: 2d 3e 20 50 3c 61 73 74 3a 3a 45 78 70 72 3e 20  -> P<ast::Expr> 
59f0: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73 70  {.        let sp
5a00: 20 3d 20 73 65 6c 66 2e 66 6d 74 73 70 3b 0a 20   = self.fmtsp;. 
5a10: 20 20 20 20 20 20 20 6c 65 74 20 73 20 3d 20 53         let s = S
5a20: 79 6d 62 6f 6c 3a 3a 69 6e 74 65 72 6e 28 26 73  ymbol::intern(&s
5a30: 65 6c 66 2e 6c 69 74 65 72 61 6c 29 3b 0a 20 20  elf.literal);.  
5a40: 20 20 20 20 20 20 73 65 6c 66 2e 6c 69 74 65 72        self.liter
5a50: 61 6c 2e 63 6c 65 61 72 28 29 3b 0a 20 20 20 20  al.clear();.    
5a60: 20 20 20 20 73 65 6c 66 2e 65 63 78 2e 65 78 70      self.ecx.exp
5a70: 72 5f 73 74 72 28 73 70 2c 20 73 29 0a 20 20 20  r_str(sp, s).   
5a80: 20 7d 0a 0a 20 20 20 20 2f 2f 2f 20 42 75 69 6c   }..    /// Buil
5a90: 64 73 20 61 20 73 74 61 74 69 63 20 60 72 74 3a  ds a static `rt:
5aa0: 3a 41 72 67 75 6d 65 6e 74 60 20 66 72 6f 6d 20  :Argument` from 
5ab0: 61 20 60 70 61 72 73 65 3a 3a 50 69 65 63 65 60  a `parse::Piece`
5ac0: 20 6f 72 20 61 70 70 65 6e 64 0a 20 20 20 20 2f   or append.    /
5ad0: 2f 2f 20 74 6f 20 74 68 65 20 60 6c 69 74 65 72  // to the `liter
5ae0: 61 6c 60 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  al` string..    
5af0: 66 6e 20 62 75 69 6c 64 5f 70 69 65 63 65 28 0a  fn build_piece(.
5b00: 20 20 20 20 20 20 20 20 26 6d 75 74 20 73 65 6c          &mut sel
5b10: 66 2c 0a 20 20 20 20 20 20 20 20 70 69 65 63 65  f,.        piece
5b20: 3a 20 26 70 61 72 73 65 3a 3a 50 69 65 63 65 3c  : &parse::Piece<
5b30: 27 61 3e 2c 0a 20 20 20 20 20 20 20 20 61 72 67  'a>,.        arg
5b40: 5f 69 6e 64 65 78 5f 63 6f 6e 73 75 6d 65 64 3a  _index_consumed:
5b50: 20 26 6d 75 74 20 56 65 63 3c 75 73 69 7a 65 3e   &mut Vec<usize>
5b60: 2c 0a 20 20 20 20 29 20 2d 3e 20 4f 70 74 69 6f  ,.    ) -> Optio
5b70: 6e 3c 50 3c 61 73 74 3a 3a 45 78 70 72 3e 3e 20  n<P<ast::Expr>> 
5b80: 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 73 70  {.        let sp
5b90: 20 3d 20 73 65 6c 66 2e 6d 61 63 73 70 3b 0a 20   = self.macsp;. 
5ba0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2a 70 69         match *pi
5bb0: 65 63 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ece {.          
5bc0: 20 20 70 61 72 73 65 3a 3a 53 74 72 69 6e 67 28    parse::String(
5bd0: 73 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  s) => {.        
5be0: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 6c 69 74          self.lit
5bf0: 65 72 61 6c 2e 70 75 73 68 5f 73 74 72 28 73 29  eral.push_str(s)
5c00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5c10: 20 20 4e 6f 6e 65 0a 20 20 20 20 20 20 20 20 20    None.         
5c20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
5c30: 20 70 61 72 73 65 3a 3a 4e 65 78 74 41 72 67 75   parse::NextArgu
5c40: 6d 65 6e 74 28 72 65 66 20 61 72 67 29 20 3d 3e  ment(ref arg) =>
5c50: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
5c60: 20 20 20 2f 2f 20 42 75 69 6c 64 20 74 68 65 20     // Build the 
5c70: 70 6f 73 69 74 69 6f 6e 0a 20 20 20 20 20 20 20  position.       
5c80: 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 6f 73           let pos
5c90: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
5ca0: 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 6f 73           let pos
5cb0: 20 3d 20 7c 63 2c 20 61 72 67 7c 20 7b 0a 20 20   = |c, arg| {.  
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 70 61        let mut pa
5ce0: 74 68 20 3d 20 43 6f 6e 74 65 78 74 3a 3a 72 74  th = Context::rt
5cf0: 70 61 74 68 28 73 65 6c 66 2e 65 63 78 2c 20 22  path(self.ecx, "
5d00: 50 6f 73 69 74 69 6f 6e 22 29 3b 0a 20 20 20 20  Position");.    
5d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d20: 20 20 20 20 70 61 74 68 2e 70 75 73 68 28 73 65      path.push(se
5d30: 6c 66 2e 65 63 78 2e 69 64 65 6e 74 5f 6f 66 28  lf.ecx.ident_of(
5d40: 63 2c 20 73 70 29 29 3b 0a 20 20 20 20 20 20 20  c, sp));.       
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d60: 20 6d 61 74 63 68 20 61 72 67 20 7b 0a 20 20 20   match arg {.   
5d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d80: 20 20 20 20 20 20 20 20 20 53 6f 6d 65 28 69 29           Some(i)
5d90: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
5da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5db0: 20 20 20 20 20 20 6c 65 74 20 61 72 67 20 3d 20        let arg = 
5dc0: 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f 75 73  self.ecx.expr_us
5dd0: 69 7a 65 28 73 70 2c 20 69 29 3b 0a 20 20 20 20  ize(sp, i);.    
5de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
5e00: 2e 65 63 78 2e 65 78 70 72 5f 63 61 6c 6c 5f 67  .ecx.expr_call_g
5e10: 6c 6f 62 61 6c 28 73 70 2c 20 70 61 74 68 2c 20  lobal(sp, path, 
5e20: 76 65 63 21 5b 61 72 67 5d 29 0a 20 20 20 20 20  vec![arg]).     
5e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e60: 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 73 65 6c       None => sel
5e70: 66 2e 65 63 78 2e 65 78 70 72 5f 70 61 74 68 28  f.ecx.expr_path(
5e80: 73 65 6c 66 2e 65 63 78 2e 70 61 74 68 5f 67 6c  self.ecx.path_gl
5e90: 6f 62 61 6c 28 73 70 2c 20 70 61 74 68 29 29 2c  obal(sp, path)),
5ea0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
5ed0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
5ee0: 20 20 20 20 20 20 6d 61 74 63 68 20 61 72 67 2e        match arg.
5ef0: 70 6f 73 69 74 69 6f 6e 20 7b 0a 20 20 20 20 20  position {.     
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 20 70 61 72 73 65 3a 3a 41 72 67 75 6d 65     parse::Argume
5f20: 6e 74 49 73 28 69 29 0a 20 20 20 20 20 20 20 20  ntIs(i).        
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f40: 7c 20 70 61 72 73 65 3a 3a 41 72 67 75 6d 65 6e  | parse::Argumen
5f50: 74 49 6d 70 6c 69 63 69 74 6c 79 49 73 28 69 29  tImplicitlyIs(i)
5f60: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f80: 20 20 2f 2f 20 4d 61 70 20 74 6f 20 69 6e 64 65    // Map to inde
5f90: 78 20 69 6e 20 66 69 6e 61 6c 20 67 65 6e 65 72  x in final gener
5fa0: 61 74 65 64 20 61 72 67 75 6d 65 6e 74 20 61 72  ated argument ar
5fb0: 72 61 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  ray.            
5fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fd0: 2f 2f 20 69 6e 20 63 61 73 65 20 6f 66 20 6d 75  // in case of mu
5fe0: 6c 74 69 70 6c 65 20 74 79 70 65 73 20 73 70 65  ltiple types spe
5ff0: 63 69 66 69 65 64 0a 20 20 20 20 20 20 20 20 20  cified.         
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6010: 20 20 20 6c 65 74 20 61 72 67 5f 69 64 78 20 3d     let arg_idx =
6020: 20 6d 61 74 63 68 20 61 72 67 5f 69 6e 64 65 78   match arg_index
6030: 5f 63 6f 6e 73 75 6d 65 64 2e 67 65 74 5f 6d 75  _consumed.get_mu
6040: 74 28 69 29 20 7b 0a 20 20 20 20 20 20 20 20 20  t(i) {.         
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 30         None => 0
6070: 2c 20 2f 2f 20 65 72 72 6f 72 20 61 6c 72 65 61  , // error alrea
6080: 64 79 20 65 6d 69 74 74 65 64 20 65 6c 73 65 77  dy emitted elsew
6090: 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 53 6f 6d 65 28 6f 66 66 73 65 74       Some(offset
60c0: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60e0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 72             let r
60f0: 65 66 20 69 64 78 5f 6d 61 70 20 3d 20 73 65 6c  ef idx_map = sel
6100: 66 2e 61 72 67 5f 69 6e 64 65 78 5f 6d 61 70 5b  f.arg_index_map[
6110: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 20 20 20 20 20 2f 2f 20 75 6e 77 72 61          // unwra
6140: 70 5f 6f 72 20 62 72 61 6e 63 68 3a 20 65 72 72  p_or branch: err
6150: 6f 72 20 61 6c 72 65 61 64 79 20 65 6d 69 74 74  or already emitt
6160: 65 64 20 65 6c 73 65 77 68 65 72 65 0a 20 20 20  ed elsewhere.   
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6190: 20 6c 65 74 20 61 72 67 5f 69 64 78 20 3d 20 2a   let arg_idx = *
61a0: 69 64 78 5f 6d 61 70 2e 67 65 74 28 2a 6f 66 66  idx_map.get(*off
61b0: 73 65 74 29 2e 75 6e 77 72 61 70 5f 6f 72 28 26  set).unwrap_or(&
61c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 20 20 20 20 20 2a 6f 66 66 73 65 74 20          *offset 
61f0: 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  += 1;.          
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6210: 20 20 20 20 20 20 20 20 20 20 61 72 67 5f 69 64            arg_id
6220: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6240: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
6250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6260: 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  };.             
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6280: 6f 73 28 22 41 74 22 2c 20 53 6f 6d 65 28 61 72  os("At", Some(ar
6290: 67 5f 69 64 78 29 29 0a 20 20 20 20 20 20 20 20  g_idx)).        
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62b0: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  }..             
62c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 68             // sh
62d0: 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 74 68  ould never be th
62e0: 65 20 63 61 73 65 2c 20 62 65 63 61 75 73 65 20  e case, because 
62f0: 6e 61 6d 65 73 20 61 72 65 20 61 6c 72 65 61 64  names are alread
6300: 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
6310: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65 73            // res
6320: 6f 6c 76 65 64 2e 0a 20 20 20 20 20 20 20 20 20  olved..         
6330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6340: 61 72 73 65 3a 3a 41 72 67 75 6d 65 6e 74 4e 61  arse::ArgumentNa
6350: 6d 65 64 28 5f 29 20 3d 3e 20 70 61 6e 69 63 21  med(_) => panic!
6360: 28 22 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  ("should never h
6370: 61 70 70 65 6e 22 29 2c 0a 20 20 20 20 20 20 20  appen"),.       
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
63a0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
63b0: 20 20 20 6c 65 74 20 73 69 6d 70 6c 65 5f 61 72     let simple_ar
63c0: 67 20 3d 20 70 61 72 73 65 3a 3a 41 72 67 75 6d  g = parse::Argum
63d0: 65 6e 74 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ent {.          
63e0: 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 74 69            positi
63f0: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  on: {.          
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
6410: 20 57 65 20 64 6f 6e 27 74 20 68 61 76 65 20 41   We don't have A
6420: 72 67 75 6d 65 6e 74 4e 65 78 74 20 61 6e 79 20  rgumentNext any 
6430: 6d 6f 72 65 2c 20 73 6f 20 77 65 20 68 61 76 65  more, so we have
6440: 20 74 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20   to.            
6450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
6460: 72 61 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  rack the current
6470: 20 61 72 67 75 6d 65 6e 74 20 6f 75 72 73 65 6c   argument oursel
6480: 76 65 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ves..           
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
64a0: 20 69 20 3d 20 73 65 6c 66 2e 63 75 72 61 72 67   i = self.curarg
64b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
64c0: 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 63            self.c
64d0: 75 72 61 72 67 20 2b 3d 20 31 3b 0a 20 20 20 20  urarg += 1;.    
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 70 61 72 73 65 3a 3a 41 72 67 75 6d      parse::Argum
6500: 65 6e 74 49 73 28 69 29 0a 20 20 20 20 20 20 20  entIs(i).       
6510: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 66 6f 72 6d 61 74 3a 20 70 61 72 73      format: pars
6540: 65 3a 3a 46 6f 72 6d 61 74 53 70 65 63 20 7b 0a  e::FormatSpec {.
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 20 20 20 20 20 20 66 69 6c 6c 3a 20 61 72          fill: ar
6570: 67 2e 66 6f 72 6d 61 74 2e 66 69 6c 6c 2c 0a 20  g.format.fill,. 
6580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6590: 20 20 20 20 20 20 20 61 6c 69 67 6e 3a 20 70 61         align: pa
65a0: 72 73 65 3a 3a 41 6c 69 67 6e 55 6e 6b 6e 6f 77  rse::AlignUnknow
65b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
65c0: 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
65d0: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
65e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
65f0: 63 69 73 69 6f 6e 3a 20 70 61 72 73 65 3a 3a 43  cision: parse::C
6600: 6f 75 6e 74 49 6d 70 6c 69 65 64 2c 0a 20 20 20  ountImplied,.   
6610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6620: 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 5f 73       precision_s
6630: 70 61 6e 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20  pan: None,.     
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6650: 20 20 20 77 69 64 74 68 3a 20 70 61 72 73 65 3a     width: parse:
6660: 3a 43 6f 75 6e 74 49 6d 70 6c 69 65 64 2c 0a 20  :CountImplied,. 
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 20 20 77 69 64 74 68 5f 73 70 61         width_spa
6690: 6e 3a 20 4e 6f 6e 65 2c 0a 20 20 20 20 20 20 20  n: None,.       
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 74 79 3a 20 61 72 67 2e 66 6f 72 6d 61 74 2e   ty: arg.format.
66c0: 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ty,.            
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 79 5f 73              ty_s
66e0: 70 61 6e 3a 20 61 72 67 2e 66 6f 72 6d 61 74 2e  pan: arg.format.
66f0: 74 79 5f 73 70 61 6e 2c 0a 20 20 20 20 20 20 20  ty_span,.       
6700: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6720: 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  };..            
6730: 20 20 20 20 6c 65 74 20 66 69 6c 6c 20 3d 20 61      let fill = a
6740: 72 67 2e 66 6f 72 6d 61 74 2e 66 69 6c 6c 2e 75  rg.format.fill.u
6750: 6e 77 72 61 70 5f 6f 72 28 27 20 27 29 3b 0a 0a  nwrap_or(' ');..
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 6c 65 74 20 70 6f 73 5f 73 69 6d 70 6c 65 20 3d  let pos_simple =
6780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6790: 20 20 20 20 20 61 72 67 2e 70 6f 73 69 74 69 6f       arg.positio
67a0: 6e 2e 69 6e 64 65 78 28 29 20 3d 3d 20 73 69 6d  n.index() == sim
67b0: 70 6c 65 5f 61 72 67 2e 70 6f 73 69 74 69 6f 6e  ple_arg.position
67c0: 2e 69 6e 64 65 78 28 29 3b 0a 0a 20 20 20 20 20  .index();..     
67d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 61 72             if ar
67e0: 67 2e 66 6f 72 6d 61 74 2e 70 72 65 63 69 73 69  g.format.precisi
67f0: 6f 6e 5f 73 70 61 6e 2e 69 73 5f 73 6f 6d 65 28  on_span.is_some(
6800: 29 20 7c 7c 20 61 72 67 2e 66 6f 72 6d 61 74 2e  ) || arg.format.
6810: 77 69 64 74 68 5f 73 70 61 6e 2e 69 73 5f 73 6f  width_span.is_so
6820: 6d 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  me() {.         
6830: 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e             self.
6840: 61 72 67 5f 77 69 74 68 5f 66 6f 72 6d 61 74 74  arg_with_formatt
6850: 69 6e 67 2e 70 75 73 68 28 61 72 67 2e 66 6f 72  ing.push(arg.for
6860: 6d 61 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mat);.          
6870: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6880: 20 20 20 20 20 20 20 20 69 66 20 21 70 6f 73 5f          if !pos_
6890: 73 69 6d 70 6c 65 20 7c 7c 20 61 72 67 2e 66 6f  simple || arg.fo
68a0: 72 6d 61 74 20 21 3d 20 73 69 6d 70 6c 65 5f 61  rmat != simple_a
68b0: 72 67 2e 66 6f 72 6d 61 74 20 7c 7c 20 66 69 6c  rg.format || fil
68c0: 6c 20 21 3d 20 27 20 27 20 7b 0a 20 20 20 20 20  l != ' ' {.     
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
68e0: 65 6c 66 2e 61 6c 6c 5f 70 69 65 63 65 73 5f 73  elf.all_pieces_s
68f0: 69 6d 70 6c 65 20 3d 20 66 61 6c 73 65 3b 0a 20  imple = false;. 
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
6910: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
6920: 20 20 2f 2f 20 42 75 69 6c 64 20 74 68 65 20 66    // Build the f
6930: 6f 72 6d 61 74 0a 20 20 20 20 20 20 20 20 20 20  ormat.          
6940: 20 20 20 20 20 20 6c 65 74 20 66 69 6c 6c 20 3d        let fill =
6950: 20 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f 6c   self.ecx.expr_l
6960: 69 74 28 73 70 2c 20 61 73 74 3a 3a 4c 69 74 4b  it(sp, ast::LitK
6970: 69 6e 64 3a 3a 43 68 61 72 28 66 69 6c 6c 29 29  ind::Char(fill))
6980: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6990: 20 20 6c 65 74 20 61 6c 69 67 6e 20 3d 20 7c 6e    let align = |n
69a0: 61 6d 65 7c 20 7b 0a 20 20 20 20 20 20 20 20 20  ame| {.         
69b0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
69c0: 75 74 20 70 20 3d 20 43 6f 6e 74 65 78 74 3a 3a  ut p = Context::
69d0: 72 74 70 61 74 68 28 73 65 6c 66 2e 65 63 78 2c  rtpath(self.ecx,
69e0: 20 22 41 6c 69 67 6e 6d 65 6e 74 22 29 3b 0a 20   "Alignment");. 
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 70 2e 70 75 73 68 28 73 65 6c 66 2e 65     p.push(self.e
6a10: 63 78 2e 69 64 65 6e 74 5f 6f 66 28 6e 61 6d 65  cx.ident_of(name
6a20: 2c 20 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  , sp));.        
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
6a40: 2e 65 63 78 2e 70 61 74 68 5f 67 6c 6f 62 61 6c  .ecx.path_global
6a50: 28 73 70 2c 20 70 29 0a 20 20 20 20 20 20 20 20  (sp, p).        
6a60: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
6a70: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 61             let a
6a80: 6c 69 67 6e 20 3d 20 6d 61 74 63 68 20 61 72 67  lign = match arg
6a90: 2e 66 6f 72 6d 61 74 2e 61 6c 69 67 6e 20 7b 0a  .format.align {.
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 20 70 61 72 73 65 3a 3a 41 6c 69 67 6e      parse::Align
6ac0: 4c 65 66 74 20 3d 3e 20 61 6c 69 67 6e 28 22 4c  Left => align("L
6ad0: 65 66 74 22 29 2c 0a 20 20 20 20 20 20 20 20 20  eft"),.         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 70 61 72 73 65             parse
6af0: 3a 3a 41 6c 69 67 6e 52 69 67 68 74 20 3d 3e 20  ::AlignRight => 
6b00: 61 6c 69 67 6e 28 22 52 69 67 68 74 22 29 2c 0a  align("Right"),.
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b20: 20 20 20 20 70 61 72 73 65 3a 3a 41 6c 69 67 6e      parse::Align
6b30: 43 65 6e 74 65 72 20 3d 3e 20 61 6c 69 67 6e 28  Center => align(
6b40: 22 43 65 6e 74 65 72 22 29 2c 0a 20 20 20 20 20  "Center"),.     
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6b60: 61 72 73 65 3a 3a 41 6c 69 67 6e 55 6e 6b 6e 6f  arse::AlignUnkno
6b70: 77 6e 20 3d 3e 20 61 6c 69 67 6e 28 22 55 6e 6b  wn => align("Unk
6b80: 6e 6f 77 6e 22 29 2c 0a 20 20 20 20 20 20 20 20  nown"),.        
6b90: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
6ba0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 61             let a
6bb0: 6c 69 67 6e 20 3d 20 73 65 6c 66 2e 65 63 78 2e  lign = self.ecx.
6bc0: 65 78 70 72 5f 70 61 74 68 28 61 6c 69 67 6e 29  expr_path(align)
6bd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6be0: 20 20 6c 65 74 20 66 6c 61 67 73 20 3d 20 73 65    let flags = se
6bf0: 6c 66 2e 65 63 78 2e 65 78 70 72 5f 75 33 32 28  lf.ecx.expr_u32(
6c00: 73 70 2c 20 61 72 67 2e 66 6f 72 6d 61 74 2e 66  sp, arg.format.f
6c10: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20  lags);.         
6c20: 20 20 20 20 20 20 20 6c 65 74 20 70 72 65 63 20         let prec 
6c30: 3d 20 73 65 6c 66 2e 62 75 69 6c 64 5f 63 6f 75  = self.build_cou
6c40: 6e 74 28 61 72 67 2e 66 6f 72 6d 61 74 2e 70 72  nt(arg.format.pr
6c50: 65 63 69 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  ecision);.      
6c60: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 77 69            let wi
6c70: 64 74 68 20 3d 20 73 65 6c 66 2e 62 75 69 6c 64  dth = self.build
6c80: 5f 63 6f 75 6e 74 28 61 72 67 2e 66 6f 72 6d 61  _count(arg.forma
6c90: 74 2e 77 69 64 74 68 29 3b 0a 20 20 20 20 20 20  t.width);.      
6ca0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 70 61            let pa
6cb0: 74 68 20 3d 20 73 65 6c 66 2e 65 63 78 2e 70 61  th = self.ecx.pa
6cc0: 74 68 5f 67 6c 6f 62 61 6c 28 73 70 2c 20 43 6f  th_global(sp, Co
6cd0: 6e 74 65 78 74 3a 3a 72 74 70 61 74 68 28 73 65  ntext::rtpath(se
6ce0: 6c 66 2e 65 63 78 2c 20 22 46 6f 72 6d 61 74 53  lf.ecx, "FormatS
6cf0: 70 65 63 22 29 29 3b 0a 20 20 20 20 20 20 20 20  pec"));.        
6d00: 20 20 20 20 20 20 20 20 6c 65 74 20 66 6d 74 20          let fmt 
6d10: 3d 20 73 65 6c 66 2e 65 63 78 2e 65 78 70 72 5f  = self.ecx.expr_
6d20: 73 74 72 75 63 74 28 0a 20 20 20 20 20 20 20 20  struct(.        
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 73 70 2c 0a              sp,.
6d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d50: 20 20 20 20 70 61 74 68 2c 0a 20 20 20 20 20 20      path,.      
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 65                ve
6d70: 63 21 5b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c![.            
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
6d90: 2e 65 63 78 2e 66 69 65 6c 64 5f 69 6d 6d 28 73  .ecx.field_imm(s
6da0: 70 2c 20 73 65 6c 66 2e 65 63 78 2e 69 64 65 6e  p, self.ecx.iden
6db0: 74 5f 6f 66 28 22 66 69 6c 6c 22 2c 20 73 70 29  t_of("fill", sp)
6dc0: 2c 20 66 69 6c 6c 29 2c 0a 20 20 20 20 20 20 20  , fill),.       
6dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6de0: 20 73 65 6c 66 2e 65 63 78 2e 66 69 65 6c 64 5f   self.ecx.field_
6df0: 69 6d 6d 28 73 70 2c 20 73 65 6c 66 2e 65 63 78  imm(sp, self.ecx
6e00: 2e 69 64 65 6e 74 5f 6f 66 28 22 61 6c 69 67 6e  .ident_of("align
6e10: 22 2c 20 73 70 29 2c 20 61 6c 69 67 6e 29 2c 0a  ", sp), align),.
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 20 20 20 73 65 6c 66 2e 65 63 78          self.ecx
6e40: 2e 66 69 65 6c 64 5f 69 6d 6d 28 73 70 2c 20 73  .field_imm(sp, s
6e50: 65 6c 66 2e 65 63 78 2e 69 64 65 6e 74 5f 6f 66  elf.ecx.ident_of
6e60: 28 22 66 6c 61 67 73 22 2c 20 73 70 29 2c 20 66  ("flags", sp), f
6e70: 6c 61 67 73 29 2c 0a 20 20 20 20 20 20 20 20 20  lags),.         
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
6e90: 65 6c 66 2e 65 63 78 2e 66 69 65 6c 64 5f 69 6d  elf.ecx.field_im
6ea0: 6d 28 73 70 2c 20 73 65 6c 66 2e 65 63 78 2e 69  m(sp, self.ecx.i
6eb0: 64 65 6e 74 5f 6f 66 28 22 70 72 65 63 69 73 69  dent_of("precisi
6ec0: 6f 6e 22 2c 20 73 70 29 2c 20 70 72 65 63 29 2c  on", sp), prec),
6ed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ee0: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 65 63           self.ec
6ef0: 78 2e 66 69 65 6c 64 5f 69 6d 6d 28 73 70 2c 20  x.field_imm(sp, 
6f00: 73 65 6c 66 2e 65 63 78 2e 69 64 65 6e 74 5f 6f  self.ecx.ident_o
6f10: 66 28 22 77 69 64 74 68 22 2c 20 73 70 29 2c 20  f("width", sp), 
6f20: 77 69 64 74 68 29 2c 0a 20 20 20 20 20 20 20 20  width),.        
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c 0a 20              ],. 
6f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 29                 )
6f50: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
6f60: 20 20 20 6c 65 74 20 70 61 74 68 20 3d 20 73 65     let path = se
6f70: 6c 66 2e 65 63 78 2e 70 61 74 68 5f 67 6c 6f 62  lf.ecx.path_glob
6f80: 61 6c 28 73 70 2c 20 43 6f 6e 74 65 78 74 3a 3a  al(sp, Context::
6f90: 72 74 70 61 74 68 28 73 65 6c 66 2e 65 63 78 2c  rtpath(self.ecx,
6fa0: 20 22 41 72 67 75 6d 65 6e 74 22 29 29 3b 0a 20   "Argument"));. 
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
6fc0: 6f 6d 65 28 73 65 6c 66 2e 65 63 78 2e 65 78 70  ome(self.ecx.exp
6fd0: 72 5f 73 74 72 75 63 74 28 0a 20 20 20 20 20 20  r_struct(.      
6fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70                sp
6ff0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7010: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
7020: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7030: 20 20 20 20 20 20 76 65 63 21 5b 0a 20 20 20 20        vec![.    
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 73 65 6c 66 2e 65 63 78 2e 66 69 65      self.ecx.fie
7060: 6c 64 5f 69 6d 6d 28 73 70 2c 20 73 65 6c 66 2e  ld_imm(sp, self.
7070: 65 63 78 2e 69 64 65 6e 74 5f 6f 66 28 22 70 6f  ecx.ident_of("po
7080: 73 69 74 69 6f 6e 22 2c 20 73 70 29 2c 20 70 6f  sition", sp), po
7090: 73 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s),.            
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c 66              self
70b0: 2e 65 63 78 2e 66 69 65 6c 64 5f 69 6d 6d 28 73  .ecx.field_imm(s
70c0: 70 2c 20 73 65 6c 66 2e 65 63 78 2e 69 64 65 6e  p, self.ecx.iden
70d0: 74 5f 6f 66 28 22 66 6f 72 6d 61 74 22 2c 20 73  t_of("format", s
70e0: 70 29 2c 20 66 6d 74 29 2c 0a 20 20 20 20 20 20  p), fmt),.      
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5d 2c                ],
7100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7110: 20 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   )).            
7120: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7130: 7d 0a 0a 20 20 20 20 2f 2f 2f 20 41 63 74 75 61  }..    /// Actua
7140: 6c 6c 79 20 62 75 69 6c 64 73 20 74 68 65 20 65  lly builds the e
7150: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
7160: 74 68 65 20 66 6f 72 6d 61 74 5f 61 72 67 73 21  the format_args!
7170: 20 62 6c 6f 63 6b 20 77 69 6c 6c 20 62 65 0a 20   block will be. 
7180: 20 20 20 2f 2f 2f 20 65 78 70 61 6e 64 65 64 20     /// expanded 
7190: 74 6f 2e 0a 20 20 20 20 66 6e 20 69 6e 74 6f 5f  to..    fn into_
71a0: 65 78 70 72 28 73 65 6c 66 29 20 2d 3e 20 50 3c  expr(self) -> P<
71b0: 61 73 74 3a 3a 45 78 70 72 3e 20 7b 0a 20 20 20  ast::Expr> {.   
71c0: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 6c 6f 63       let mut loc
71d0: 61 6c 73 20 3d 20 56 65 63 3a 3a 77 69 74 68 5f  als = Vec::with_
71e0: 63 61 70 61 63 69 74 79 28 0a 20 20 20 20 20 20  capacity(.      
71f0: 20 20 20 20 20 20 28 30 2e 2e 73 65 6c 66 2e 61        (0..self.a
7200: 72 67 73 2e 6c 65 6e 28 29 29 2e 6d 61 70 28 7c  rgs.len()).map(|
7210: 69 7c 20 73 65 6c 66 2e 61 72 67 5f 75 6e 69 71  i| self.arg_uniq
7220: 75 65 5f 74 79 70 65 73 5b 69 5d 2e 6c 65 6e 28  ue_types[i].len(
7230: 29 29 2e 73 75 6d 28 29 0a 20 20 20 20 20 20 20  )).sum().       
7240: 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20   );.        let 
7250: 6d 75 74 20 63 6f 75 6e 74 73 20 3d 20 56 65 63  mut counts = Vec
7260: 3a 3a 77 69 74 68 5f 63 61 70 61 63 69 74 79 28  ::with_capacity(
7270: 73 65 6c 66 2e 63 6f 75 6e 74 5f 61 72 67 73 2e  self.count_args.
7280: 6c 65 6e 28 29 29 3b 0a 20 20 20 20 20 20 20 20  len());.        
7290: 6c 65 74 20 6d 75 74 20 70 61 74 73 20 3d 20 56  let mut pats = V
72a0: 65 63 3a 3a 77 69 74 68 5f 63 61 70 61 63 69 74  ec::with_capacit
72b0: 79 28 73 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28  y(self.args.len(
72c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ));.        let 
72d0: 6d 75 74 20 68 65 61 64 73 20 3d 20 56 65 63 3a  mut heads = Vec:
72e0: 3a 77 69 74 68 5f 63 61 70 61 63 69 74 79 28 73  :with_capacity(s
72f0: 65 6c 66 2e 61 72 67 73 2e 6c 65 6e 28 29 29 3b  elf.args.len());
7300: 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6e 61  ..        let na
7310: 6d 65 73 5f 70 6f 73 3a 20 56 65 63 3c 5f 3e 20  mes_pos: Vec<_> 
7320: 3d 20 28 30 2e 2e 73 65 6c 66 2e 61 72 67 73 2e  = (0..self.args.
7330: 6c 65 6e 28 29 29 0a 20 20 20 20 20 20 20 20 20  len()).         
7340: 20 20 20 2e 6d 61 70 28 7c 69 7c 20 73 65 6c 66     .map(|i| self
7350: 2e 65 63 78 2e 69 64 65 6e 74 5f 6f 66 28 26 66  .ecx.ident_of(&f
7360: 6f 72 6d 61 74 21 28 22 61 72 67 7b 7d 22 2c 20  ormat!("arg{}", 
7370: 69 29 2c 20 73 65 6c 66 2e 6d 61 63 73 70 29 29  i), self.macsp))
7380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 63 6f  .            .co
7390: 6c 6c 65 63 74 28 29 3b 0a 0a 20 20 20 20 20 20  llect();..      
73a0: 20 20 2f 2f 20 46 69 72 73 74 2c 20 62 75 69 6c    // First, buil
73b0: 64 20 75 70 20 74 68 65 20 73 74 61 74 69 63 20  d up the static 
73c0: 61 72 72 61 79 20 77 68 69 63 68 20 77 69 6c 6c  array which will
73d0: 20 62 65 63 6f 6d 65 20 6f 75 72 20 70 72 65 63   become our prec
73e0: 6f 6d 70 69 6c 65 64 0a 20 20 20 20 20 20 20 20  ompiled.        
73f0: 2f 2f 20 66 6f 72 6d 61 74 20 22 73 74 72 69 6e  // format "strin
7400: 67 22 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70  g".        let p
7410: 69 65 63 65 73 20 3d 20 73 65 6c 66 2e 65 63 78  ieces = self.ecx
7420: 2e 65 78 70 72 5f 76 65 63 5f 73 6c 69 63 65 28  .expr_vec_slice(
7430: 73 65 6c 66 2e 66 6d 74 73 70 2c 20 73 65 6c 66  self.fmtsp, self
7440: 2e 73 74 72 5f 70 69 65 63 65 73 29 3b 0a 0a 20  .str_pieces);.. 
7450: 20 20 20 20 20 20 20 2f 2f 20 42 65 66 6f 72 65         // Before
7460: 20 63 6f 6e 73 75 6d 69 6e 67 20 74 68 65 20 65   consuming the e
7470: 78 70 72 65 73 73 69 6f 6e 73 2c 20 77 65 20 68  xpressions, we h
7480: 61 76 65 20 74 6f 20 72 65 6d 65 6d 62 65 72 20  ave to remember 
7490: 73 70 61 6e 73 20 66 6f 72 0a 20 20 20 20 20 20  spans for.      
74a0: 20 20 2f 2f 20 63 6f 75 6e 74 20 61 72 67 75 6d    // count argum
74b0: 65 6e 74 73 20 61 73 20 74 68 65 79 20 61 72 65  ents as they are
74c0: 20 6e 6f 77 20 67 65 6e 65 72 61 74 65 64 20 73   now generated s
74d0: 65 70 61 72 61 74 65 20 66 72 6f 6d 20 6f 74 68  eparate from oth
74e0: 65 72 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 72  er.        // ar
74f0: 67 75 6d 65 6e 74 73 2c 20 68 65 6e 63 65 20 68  guments, hence h
7500: 61 76 65 20 6e 6f 20 61 63 63 65 73 73 20 74 6f  ave no access to
7510: 20 74 68 65 20 60 50 3c 61 73 74 3a 3a 45 78 70   the `P<ast::Exp
7520: 72 3e 60 27 73 2e 0a 20 20 20 20 20 20 20 20 6c  r>`'s..        l
7530: 65 74 20 73 70 61 6e 73 5f 70 6f 73 3a 20 56 65  et spans_pos: Ve
7540: 63 3c 5f 3e 20 3d 20 73 65 6c 66 2e 61 72 67 73  c<_> = self.args
7550: 2e 69 74 65 72 28 29 2e 6d 61 70 28 7c 65 7c 20  .iter().map(|e| 
7560: 65 2e 73 70 61 6e 2e 63 6c 6f 6e 65 28 29 29 2e  e.span.clone()).
7570: 63 6f 6c 6c 65 63 74 28 29 3b 0a 0a 20 20 20 20  collect();..    
7580: 20 20 20 20 2f 2f 20 52 69 67 68 74 20 6e 6f 77      // Right now
7590: 20 74 68 65 72 65 20 69 73 20 61 20 62 75 67 20   there is a bug 
75a0: 73 75 63 68 20 74 68 61 74 20 66 6f 72 20 74 68  such that for th
75b0: 65 20 65 78 70 72 65 73 73 69 6f 6e 3a 0a 20 20  e expression:.  
75c0: 20 20 20 20 20 20 2f 2f 20 20 20 20 20 20 66 6f        //      fo
75d0: 6f 28 62 61 72 28 26 31 29 29 0a 20 20 20 20 20  o(bar(&1)).     
75e0: 20 20 20 2f 2f 20 74 68 65 20 6c 69 66 65 74 69     // the lifeti
75f0: 6d 65 20 6f 66 20 60 31 60 20 64 6f 65 73 6e 27  me of `1` doesn'
7600: 74 20 6f 75 74 6c 61 73 74 20 74 68 65 20 63 61  t outlast the ca
7610: 6c 6c 20 74 6f 20 60 62 61 72 60 2c 20 73 6f 20  ll to `bar`, so 
7620: 69 74 27 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  it's not.       
7630: 20 2f 2f 20 76 61 6c 69 64 20 66 6f 72 20 74 68   // valid for th
7640: 65 20 63 61 6c 6c 20 74 6f 20 60 66 6f 6f 60 2e  e call to `foo`.
7650: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
7660: 74 68 69 73 20 61 6c 6c 20 61 72 67 75 6d 65 6e  this all argumen
7670: 74 73 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ts to the.      
7680: 20 20 2f 2f 20 66 6f 72 6d 61 74 21 20 73 74 72    // format! str
7690: 69 6e 67 20 61 72 65 20 73 68 6f 76 65 64 20 69  ing are shoved i
76a0: 6e 74 6f 20 6c 6f 63 61 6c 73 2e 20 46 75 72 74  nto locals. Furt
76b0: 68 65 72 6d 6f 72 65 2c 20 77 65 20 73 68 6f 76  hermore, we shov
76c0: 65 20 74 68 65 20 61 64 64 72 65 73 73 0a 20 20  e the address.  
76d0: 20 20 20 20 20 20 2f 2f 20 6f 66 20 65 61 63 68        // of each
76e0: 20 76 61 72 69 61 62 6c 65 20 62 65 63 61 75 73   variable becaus
76f0: 65 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  e we don't want 
7700: 74 6f 20 6d 6f 76 65 20 6f 75 74 20 6f 66 20 74  to move out of t
7710: 68 65 20 61 72 67 75 6d 65 6e 74 73 0a 20 20 20  he arguments.   
7720: 20 20 20 20 20 2f 2f 20 70 61 73 73 65 64 20 74       // passed t
7730: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
7740: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 2c  .        for (i,
7750: 20 65 29 20 69 6e 20 73 65 6c 66 2e 61 72 67 73   e) in self.args
7760: 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 65 6e 75  .into_iter().enu
7770: 6d 65 72 61 74 65 28 29 20 7b 0a 20 20 20 20 20  merate() {.     
7780: 20 20 20 20 20 20 20 6c 65 74 20 6e 61 6d 65 20         let name 
7790: 3d 20 6e 61 6d 65 73 5f 70 6f 73 5b 69 5d 3b 0a  = names_pos[i];.
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
77b0: 73 70 61 6e 20 3d 20 73 65 6c 66 2e 65 63 78 2e  span = self.ecx.
77c0: 77 69 74 68 5f 64 65 66 5f 73 69 74 65 5f 63 74  with_def_site_ct
77d0: 78 74 28 65 2e 73 70 61 6e 29 3b 0a 20 20 20 20  xt(e.span);.    
77e0: 20 20 20 20 20 20 20 20 70 61 74 73 2e 70 75 73          pats.pus
77f0: 68 28 73 65 6c 66 2e 65 63 78 2e 70 61 74 5f 69  h(self.ecx.pat_i
7800: 64 65 6e 74 28 73 70 61 6e 2c 20 6e 61 6d 65 29  dent(span, name)
7810: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
7820: 6f 72 20 72 65 66 20 61 72 67 5f 74 79 20 69 6e  or ref arg_ty in
7830: 20 73 65 6c 66 2e 61 72 67 5f 75 6e 69 71 75 65   self.arg_unique
7840: 5f 74 79 70 65 73 5b 69 5d 2e 69 74 65 72 28 29  _types[i].iter()
7850: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7860: 20 20 20 6c 6f 63 61 6c 73 2e 70 75 73 68 28 43     locals.push(C
7870: 6f 6e 74 65 78 74 3a 3a 66 6f 72 6d 61 74 5f 61  ontext::format_a
7880: 72 67 28 73 65 6c 66 2e 65 63 78 2c 20 73 65 6c  rg(self.ecx, sel
7890: 66 2e 6d 61 63 73 70 2c 20 65 2e 73 70 61 6e 2c  f.macsp, e.span,
78a0: 20 61 72 67 5f 74 79 2c 20 6e 61 6d 65 29 29 3b   arg_ty, name));
78b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
78c0: 20 20 20 20 20 20 20 20 20 20 20 68 65 61 64 73             heads
78d0: 2e 70 75 73 68 28 73 65 6c 66 2e 65 63 78 2e 65  .push(self.ecx.e
78e0: 78 70 72 5f 61 64 64 72 5f 6f 66 28 65 2e 73 70  xpr_addr_of(e.sp
78f0: 61 6e 2c 20 65 29 29 3b 0a 20 20 20 20 20 20 20  an, e));.       
7900: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 20 70   }.        for p
7910: 6f 73 20 69 6e 20 73 65 6c 66 2e 63 6f 75 6e 74  os in self.count
7920: 5f 61 72 67 73 20 7b 0a 20 20 20 20 20 20 20 20  _args {.        
7930: 20 20 20 20 6c 65 74 20 69 6e 64 65 78 20 3d 20      let index = 
7940: 6d 61 74 63 68 20 70 6f 73 20 7b 0a 20 20 20 20  match pos {.    
7950: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 61 63              Exac
7960: 74 28 69 29 20 3d 3e 20 69 2c 0a 20 20 20 20 20  t(i) => i,.     
7970: 20 20 20 20 20 20 20 20 20 20 20 5f 20 3d 3e 20             _ => 
7980: 70 61 6e 69 63 21 28 22 73 68 6f 75 6c 64 20 6e  panic!("should n
7990: 65 76 65 72 20 68 61 70 70 65 6e 22 29 2c 0a 20  ever happen"),. 
79a0: 20 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20             };.  
79b0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6e 61            let na
79c0: 6d 65 20 3d 20 6e 61 6d 65 73 5f 70 6f 73 5b 69  me = names_pos[i
79d0: 6e 64 65 78 5d 3b 0a 20 20 20 20 20 20 20 20 20  ndex];.         
79e0: 20 20 20 6c 65 74 20 73 70 61 6e 20 3d 20 73 70     let span = sp
79f0: 61 6e 73 5f 70 6f 73 5b 69 6e 64 65 78 5d 3b 0a  ans_pos[index];.
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 75 6e              coun
7a10: 74 73 2e 70 75 73 68 28 43 6f 6e 74 65 78 74 3a  ts.push(Context:
7a20: 3a 66 6f 72 6d 61 74 5f 61 72 67 28 73 65 6c 66  :format_arg(self
7a30: 2e 65 63 78 2c 20 73 65 6c 66 2e 6d 61 63 73 70  .ecx, self.macsp
7a40: 2c 20 73 70 61 6e 2c 20 26 43 6f 75 6e 74 2c 20  , span, &Count, 
7a50: 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20  name));.        
7a60: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f  }..        // No
7a70: 77 20 63 72 65 61 74 65 20 61 20 76 65 63 74 6f  w create a vecto
7a80: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  r containing all
7a90: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 0a 20   the arguments. 
7aa0: 20 20 20 20 20 20 20 6c 65 74 20 61 72 67 73 20         let args 
7ab0: 3d 20 6c 6f 63 61 6c 73 2e 69 6e 74 6f 5f 69 74  = locals.into_it
7ac0: 65 72 28 29 2e 63 68 61 69 6e 28 63 6f 75 6e 74  er().chain(count
7ad0: 73 2e 69 6e 74 6f 5f 69 74 65 72 28 29 29 3b 0a  s.into_iter());.
7ae0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 72 67  .        let arg
7af0: 73 5f 61 72 72 61 79 20 3d 20 73 65 6c 66 2e 65  s_array = self.e
7b00: 63 78 2e 65 78 70 72 5f 76 65 63 28 73 65 6c 66  cx.expr_vec(self
7b10: 2e 6d 61 63 73 70 2c 20 61 72 67 73 2e 63 6f 6c  .macsp, args.col
7b20: 6c 65 63 74 28 29 29 3b 0a 0a 20 20 20 20 20 20  lect());..      
7b30: 20 20 2f 2f 20 43 6f 6e 73 74 72 75 63 74 73 20    // Constructs 
7b40: 61 6e 20 41 53 54 20 65 71 75 69 76 61 6c 65 6e  an AST equivalen
7b50: 74 20 74 6f 3a 0a 20 20 20 20 20 20 20 20 2f 2f  t to:.        //
7b60: 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20  .        //     
7b70: 20 6d 61 74 63 68 20 28 26 61 72 67 30 2c 20 26   match (&arg0, &
7b80: 61 72 67 31 29 20 7b 0a 20 20 20 20 20 20 20 20  arg1) {.        
7b90: 2f 2f 20 20 20 20 20 20 20 20 20 20 28 74 6d 70  //          (tmp
7ba0: 30 2c 20 74 6d 70 31 29 20 3d 3e 20 61 72 67 73  0, tmp1) => args
7bb0: 5f 61 72 72 61 79 0a 20 20 20 20 20 20 20 20 2f  _array.        /
7bc0: 2f 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20  /      }.       
7bd0: 20 2f 2f 0a 20 20 20 20 20 20 20 20 2f 2f 20 49   //.        // I
7be0: 74 20 77 61 73 3a 0a 20 20 20 20 20 20 20 20 2f  t was:.        /
7bf0: 2f 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20  /.        //    
7c00: 20 20 6c 65 74 20 74 6d 70 30 20 3d 20 26 61 72    let tmp0 = &ar
7c10: 67 30 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  g0;.        //  
7c20: 20 20 20 20 6c 65 74 20 74 6d 70 31 20 3d 20 26      let tmp1 = &
7c30: 61 72 67 31 3b 0a 20 20 20 20 20 20 20 20 2f 2f  arg1;.        //
7c40: 20 20 20 20 20 20 61 72 67 73 5f 61 72 72 61 79        args_array
7c50: 0a 20 20 20 20 20 20 20 20 2f 2f 0a 20 20 20 20  .        //.    
7c60: 20 20 20 20 2f 2f 20 42 65 63 61 75 73 65 20 6f      // Because o
7c70: 66 20 23 31 31 35 38 35 20 74 68 65 20 6e 65 77  f #11585 the new
7c80: 20 74 65 6d 70 6f 72 61 72 79 20 6c 69 66 65 74   temporary lifet
7c90: 69 6d 65 20 72 75 6c 65 2c 20 74 68 65 20 65 6e  ime rule, the en
7ca0: 63 6c 6f 73 69 6e 67 0a 20 20 20 20 20 20 20 20  closing.        
7cb0: 2f 2f 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  // statements fo
7cc0: 72 20 74 68 65 73 65 20 74 65 6d 70 6f 72 61 72  r these temporar
7cd0: 69 65 73 20 62 65 63 6f 6d 65 20 74 68 65 20 6c  ies become the l
7ce0: 65 74 27 73 20 74 68 65 6d 73 65 6c 76 65 73 2e  et's themselves.
7cf0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 6f  .        // If o
7d00: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
7d10: 65 6d 20 61 72 65 20 52 65 66 43 65 6c 6c 27 73  em are RefCell's
7d20: 2c 20 52 65 66 43 65 6c 6c 20 62 6f 72 72 6f 77  , RefCell borrow
7d30: 28 29 20 77 69 6c 6c 20 61 6c 73 6f 0a 20 20 20  () will also.   
7d40: 20 20 20 20 20 2f 2f 20 65 6e 64 20 74 68 65 72       // end ther
7d50: 65 3b 20 74 68 65 79 20 64 6f 6e 27 74 20 6c 61  e; they don't la
7d60: 73 74 20 6c 6f 6e 67 20 65 6e 6f 75 67 68 20 66  st long enough f
7d70: 6f 72 20 61 72 67 73 5f 61 72 72 61 79 20 74 6f  or args_array to
7d80: 20 75 73 65 20 74 68 65 6d 2e 0a 20 20 20 20 20   use them..     
7d90: 20 20 20 2f 2f 20 54 68 65 20 6d 61 74 63 68 20     // The match 
7da0: 65 78 70 72 65 73 73 69 6f 6e 20 73 6f 6c 76 65  expression solve
7db0: 73 20 74 68 65 20 73 63 6f 70 65 20 70 72 6f 62  s the scope prob
7dc0: 6c 65 6d 2e 0a 20 20 20 20 20 20 20 20 2f 2f 0a  lem..        //.
7dd0: 20 20 20 20 20 20 20 20 2f 2f 20 4e 6f 74 65 2c          // Note,
7de0: 20 69 74 20 6d 61 79 20 61 6c 73 6f 20 76 65 72   it may also ver
7df0: 79 20 77 65 6c 6c 20 62 65 20 74 72 61 6e 73 66  y well be transf
7e00: 6f 72 6d 65 64 20 74 6f 3a 0a 20 20 20 20 20 20  ormed to:.      
7e10: 20 20 2f 2f 0a 20 20 20 20 20 20 20 20 2f 2f 20    //.        // 
7e20: 20 20 20 20 20 6d 61 74 63 68 20 61 72 67 30 20       match arg0 
7e30: 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20  {.        //    
7e40: 20 20 20 20 20 20 72 65 66 20 74 6d 70 30 20 3d        ref tmp0 =
7e50: 3e 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 20  > {.        //  
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63              matc
7e70: 68 20 61 72 67 31 20 3d 3e 20 7b 0a 20 20 20 20  h arg1 => {.    
7e80: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 20 20      //          
7e90: 20 20 20 20 20 20 20 20 72 65 66 20 74 6d 70 31          ref tmp1
7ea0: 20 3d 3e 20 61 72 67 73 5f 61 72 72 61 79 20 7d   => args_array }
7eb0: 20 7d 20 7d 0a 20 20 20 20 20 20 20 20 2f 2f 0a   } }.        //.
7ec0: 20 20 20 20 20 20 20 20 2f 2f 20 42 75 74 20 74          // But t
7ed0: 68 65 20 6e 65 73 74 65 64 20 6d 61 74 63 68 20  he nested match 
7ee0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 70 72  expression is pr
7ef0: 6f 76 65 64 20 74 6f 20 70 65 72 66 6f 72 6d 20  oved to perform 
7f00: 6e 6f 74 20 61 73 20 77 65 6c 6c 0a 20 20 20 20  not as well.    
7f10: 20 20 20 20 2f 2f 20 61 73 20 73 65 72 69 65 73      // as series
7f20: 20 6f 66 20 6c 65 74 27 73 3b 20 74 68 65 20 66   of let's; the f
7f30: 69 72 73 74 20 61 70 70 72 6f 61 63 68 20 64 6f  irst approach do
7f40: 65 73 2e 0a 20 20 20 20 20 20 20 20 6c 65 74 20  es..        let 
7f50: 70 61 74 20 3d 20 73 65 6c 66 2e 65 63 78 2e 70  pat = self.ecx.p
7f60: 61 74 5f 74 75 70 6c 65 28 73 65 6c 66 2e 6d 61  at_tuple(self.ma
7f70: 63 73 70 2c 20 70 61 74 73 29 3b 0a 20 20 20 20  csp, pats);.    
7f80: 20 20 20 20 6c 65 74 20 61 72 6d 20 3d 20 73 65      let arm = se
7f90: 6c 66 2e 65 63 78 2e 61 72 6d 28 73 65 6c 66 2e  lf.ecx.arm(self.
7fa0: 6d 61 63 73 70 2c 20 70 61 74 2c 20 61 72 67 73  macsp, pat, args
7fb0: 5f 61 72 72 61 79 29 3b 0a 20 20 20 20 20 20 20  _array);.       
7fc0: 20 6c 65 74 20 68 65 61 64 20 3d 20 73 65 6c 66   let head = self
7fd0: 2e 65 63 78 2e 65 78 70 72 28 73 65 6c 66 2e 6d  .ecx.expr(self.m
7fe0: 61 63 73 70 2c 20 61 73 74 3a 3a 45 78 70 72 4b  acsp, ast::ExprK
7ff0: 69 6e 64 3a 3a 54 75 70 28 68 65 61 64 73 29 29  ind::Tup(heads))
8000: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72 65  ;.        let re
8010: 73 75 6c 74 20 3d 20 73 65 6c 66 2e 65 63 78 2e  sult = self.ecx.
8020: 65 78 70 72 5f 6d 61 74 63 68 28 73 65 6c 66 2e  expr_match(self.
8030: 6d 61 63 73 70 2c 20 68 65 61 64 2c 20 76 65 63  macsp, head, vec
8040: 21 5b 61 72 6d 5d 29 3b 0a 0a 20 20 20 20 20 20  ![arm]);..      
8050: 20 20 6c 65 74 20 61 72 67 73 5f 73 6c 69 63 65    let args_slice
8060: 20 3d 20 73 65 6c 66 2e 65 63 78 2e 65 78 70 72   = self.ecx.expr
8070: 5f 61 64 64 72 5f 6f 66 28 73 65 6c 66 2e 6d 61  _addr_of(self.ma
8080: 63 73 70 2c 20 72 65 73 75 6c 74 29 3b 0a 0a 20  csp, result);.. 
8090: 20 20 20 20 20 20 20 2f 2f 20 4e 6f 77 20 63 72         // Now cr
80a0: 65 61 74 65 20 74 68 65 20 66 6d 74 3a 3a 41 72  eate the fmt::Ar
80b0: 67 75 6d 65 6e 74 73 20 73 74 72 75 63 74 20 77  guments struct w
80c0: 69 74 68 20 61 6c 6c 20 6f 75 72 20 6c 6f 63 61  ith all our loca
80d0: 6c 73 20 77 65 20 63 72 65 61 74 65 64 2e 0a 20  ls we created.. 
80e0: 20 20 20 20 20 20 20 6c 65 74 20 28 66 6e 5f 6e         let (fn_n
80f0: 61 6d 65 2c 20 66 6e 5f 61 72 67 73 29 20 3d 20  ame, fn_args) = 
8100: 69 66 20 73 65 6c 66 2e 61 6c 6c 5f 70 69 65 63  if self.all_piec
8110: 65 73 5f 73 69 6d 70 6c 65 20 7b 0a 20 20 20 20  es_simple {.    
8120: 20 20 20 20 20 20 20 20 28 22 6e 65 77 5f 76 31          ("new_v1
8130: 22 2c 20 76 65 63 21 5b 70 69 65 63 65 73 2c 20  ", vec![pieces, 
8140: 61 72 67 73 5f 73 6c 69 63 65 5d 29 0a 20 20 20  args_slice]).   
8150: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
8160: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 42 75 69            // Bui
8170: 6c 64 20 75 70 20 74 68 65 20 73 74 61 74 69 63  ld up the static
8180: 20 61 72 72 61 79 20 77 68 69 63 68 20 77 69 6c   array which wil
8190: 6c 20 73 74 6f 72 65 20 6f 75 72 20 70 72 65 63  l store our prec
81a0: 6f 6d 70 69 6c 65 64 0a 20 20 20 20 20 20 20 20  ompiled.        
81b0: 20 20 20 20 2f 2f 20 6e 6f 6e 73 74 61 6e 64 61      // nonstanda
81c0: 72 64 20 70 6c 61 63 65 68 6f 6c 64 65 72 73 2c  rd placeholders,
81d0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
81e0: 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  y..            l
81f0: 65 74 20 66 6d 74 20 3d 20 73 65 6c 66 2e 65 63  et fmt = self.ec
8200: 78 2e 65 78 70 72 5f 76 65 63 5f 73 6c 69 63 65  x.expr_vec_slice
8210: 28 73 65 6c 66 2e 6d 61 63 73 70 2c 20 73 65 6c  (self.macsp, sel
8220: 66 2e 70 69 65 63 65 73 29 3b 0a 0a 20 20 20 20  f.pieces);..    
8230: 20 20 20 20 20 20 20 20 28 22 6e 65 77 5f 76 31          ("new_v1
8240: 5f 66 6f 72 6d 61 74 74 65 64 22 2c 20 76 65 63  _formatted", vec
8250: 21 5b 70 69 65 63 65 73 2c 20 61 72 67 73 5f 73  ![pieces, args_s
8260: 6c 69 63 65 2c 20 66 6d 74 5d 29 0a 20 20 20 20  lice, fmt]).    
8270: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
8280: 6c 65 74 20 70 61 74 68 20 3d 20 73 65 6c 66 2e  let path = self.
8290: 65 63 78 2e 73 74 64 5f 70 61 74 68 28 26 5b 73  ecx.std_path(&[s
82a0: 79 6d 3a 3a 66 6d 74 2c 20 73 79 6d 3a 3a 41 72  ym::fmt, sym::Ar
82b0: 67 75 6d 65 6e 74 73 2c 20 53 79 6d 62 6f 6c 3a  guments, Symbol:
82c0: 3a 69 6e 74 65 72 6e 28 66 6e 5f 6e 61 6d 65 29  :intern(fn_name)
82d0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66  ]);.        self
82e0: 2e 65 63 78 2e 65 78 70 72 5f 63 61 6c 6c 5f 67  .ecx.expr_call_g
82f0: 6c 6f 62 61 6c 28 73 65 6c 66 2e 6d 61 63 73 70  lobal(self.macsp
8300: 2c 20 70 61 74 68 2c 20 66 6e 5f 61 72 67 73 29  , path, fn_args)
8310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6e 20 66  .    }..    fn f
8320: 6f 72 6d 61 74 5f 61 72 67 28 0a 20 20 20 20 20  ormat_arg(.     
8330: 20 20 20 65 63 78 3a 20 26 45 78 74 43 74 78 74     ecx: &ExtCtxt
8340: 3c 27 5f 3e 2c 0a 20 20 20 20 20 20 20 20 6d 61  <'_>,.        ma
8350: 63 73 70 3a 20 53 70 61 6e 2c 0a 20 20 20 20 20  csp: Span,.     
8360: 20 20 20 6d 75 74 20 73 70 3a 20 53 70 61 6e 2c     mut sp: Span,
8370: 0a 20 20 20 20 20 20 20 20 74 79 3a 20 26 41 72  .        ty: &Ar
8380: 67 75 6d 65 6e 74 54 79 70 65 2c 0a 20 20 20 20  gumentType,.    
8390: 20 20 20 20 61 72 67 3a 20 61 73 74 3a 3a 49 64      arg: ast::Id
83a0: 65 6e 74 2c 0a 20 20 20 20 29 20 2d 3e 20 50 3c  ent,.    ) -> P<
83b0: 61 73 74 3a 3a 45 78 70 72 3e 20 7b 0a 20 20 20  ast::Expr> {.   
83c0: 20 20 20 20 20 73 70 20 3d 20 65 63 78 2e 77 69       sp = ecx.wi
83d0: 74 68 5f 64 65 66 5f 73 69 74 65 5f 63 74 78 74  th_def_site_ctxt
83e0: 28 73 70 29 3b 0a 20 20 20 20 20 20 20 20 6c 65  (sp);.        le
83f0: 74 20 61 72 67 20 3d 20 65 63 78 2e 65 78 70 72  t arg = ecx.expr
8400: 5f 69 64 65 6e 74 28 73 70 2c 20 61 72 67 29 3b  _ident(sp, arg);
8410: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 74 72 61  .        let tra
8420: 69 74 5f 20 3d 20 6d 61 74 63 68 20 2a 74 79 20  it_ = match *ty 
8430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 50 6c  {.            Pl
8440: 61 63 65 68 6f 6c 64 65 72 28 74 72 61 69 74 5f  aceholder(trait_
8450: 29 20 69 66 20 74 72 61 69 74 5f 20 3d 3d 20 22  ) if trait_ == "
8460: 3c 69 6e 76 61 6c 69 64 3e 22 20 3d 3e 20 72 65  <invalid>" => re
8470: 74 75 72 6e 20 44 75 6d 6d 79 52 65 73 75 6c 74  turn DummyResult
8480: 3a 3a 72 61 77 5f 65 78 70 72 28 73 70 2c 20 74  ::raw_expr(sp, t
8490: 72 75 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  rue),.          
84a0: 20 20 50 6c 61 63 65 68 6f 6c 64 65 72 28 74 72    Placeholder(tr
84b0: 61 69 74 5f 29 20 3d 3e 20 74 72 61 69 74 5f 2c  ait_) => trait_,
84c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 6f 75  .            Cou
84d0: 6e 74 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  nt => {.        
84e0: 20 20 20 20 20 20 20 20 6c 65 74 20 70 61 74 68          let path
84f0: 20 3d 20 65 63 78 2e 73 74 64 5f 70 61 74 68 28   = ecx.std_path(
8500: 26 5b 73 79 6d 3a 3a 66 6d 74 2c 20 73 79 6d 3a  &[sym::fmt, sym:
8510: 3a 41 72 67 75 6d 65 6e 74 56 31 2c 20 73 79 6d  :ArgumentV1, sym
8520: 3a 3a 66 72 6f 6d 5f 75 73 69 7a 65 5d 29 3b 0a  ::from_usize]);.
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 72 65 74 75 72 6e 20 65 63 78 2e 65 78 70 72 5f  return ecx.expr_
8550: 63 61 6c 6c 5f 67 6c 6f 62 61 6c 28 6d 61 63 73  call_global(macs
8560: 70 2c 20 70 61 74 68 2c 20 76 65 63 21 5b 61 72  p, path, vec![ar
8570: 67 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  g]);.           
8580: 20 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20   }.        };.. 
8590: 20 20 20 20 20 20 20 6c 65 74 20 70 61 74 68 20         let path 
85a0: 3d 20 65 63 78 2e 73 74 64 5f 70 61 74 68 28 26  = ecx.std_path(&
85b0: 5b 73 79 6d 3a 3a 66 6d 74 2c 20 53 79 6d 62 6f  [sym::fmt, Symbo
85c0: 6c 3a 3a 69 6e 74 65 72 6e 28 74 72 61 69 74 5f  l::intern(trait_
85d0: 29 2c 20 73 79 6d 3a 3a 66 6d 74 5d 29 3b 0a 20  ), sym::fmt]);. 
85e0: 20 20 20 20 20 20 20 6c 65 74 20 66 6f 72 6d 61         let forma
85f0: 74 5f 66 6e 20 3d 20 65 63 78 2e 70 61 74 68 5f  t_fn = ecx.path_
8600: 67 6c 6f 62 61 6c 28 73 70 2c 20 70 61 74 68 29  global(sp, path)
8610: 3b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 70 61  ;.        let pa
8620: 74 68 20 3d 20 65 63 78 2e 73 74 64 5f 70 61 74  th = ecx.std_pat
8630: 68 28 26 5b 73 79 6d 3a 3a 66 6d 74 2c 20 73 79  h(&[sym::fmt, sy
8640: 6d 3a 3a 41 72 67 75 6d 65 6e 74 56 31 2c 20 73  m::ArgumentV1, s
8650: 79 6d 3a 3a 6e 65 77 5d 29 3b 0a 20 20 20 20 20  ym::new]);.     
8660: 20 20 20 65 63 78 2e 65 78 70 72 5f 63 61 6c 6c     ecx.expr_call
8670: 5f 67 6c 6f 62 61 6c 28 6d 61 63 73 70 2c 20 70  _global(macsp, p
8680: 61 74 68 2c 20 76 65 63 21 5b 61 72 67 2c 20 65  ath, vec![arg, e
8690: 63 78 2e 65 78 70 72 5f 70 61 74 68 28 66 6f 72  cx.expr_path(for
86a0: 6d 61 74 5f 66 6e 29 5d 29 0a 20 20 20 20 7d 0a  mat_fn)]).    }.
86b0: 7d 0a 0a 66 6e 20 65 78 70 61 6e 64 5f 66 6f 72  }..fn expand_for
86c0: 6d 61 74 5f 61 72 67 73 5f 69 6d 70 6c 3c 27 63  mat_args_impl<'c
86d0: 78 3e 28 0a 20 20 20 20 65 63 78 3a 20 26 27 63  x>(.    ecx: &'c
86e0: 78 20 6d 75 74 20 45 78 74 43 74 78 74 3c 27 5f  x mut ExtCtxt<'_
86f0: 3e 2c 0a 20 20 20 20 6d 75 74 20 73 70 3a 20 53  >,.    mut sp: S
8700: 70 61 6e 2c 0a 20 20 20 20 74 74 73 3a 20 54 6f  pan,.    tts: To
8710: 6b 65 6e 53 74 72 65 61 6d 2c 0a 20 20 20 20 6e  kenStream,.    n
8720: 6c 3a 20 62 6f 6f 6c 2c 0a 29 20 2d 3e 20 42 6f  l: bool,.) -> Bo
8730: 78 3c 64 79 6e 20 62 61 73 65 3a 3a 4d 61 63 52  x<dyn base::MacR
8740: 65 73 75 6c 74 20 2b 20 27 63 78 3e 20 7b 0a 20  esult + 'cx> {. 
8750: 20 20 20 73 70 20 3d 20 65 63 78 2e 77 69 74 68     sp = ecx.with
8760: 5f 64 65 66 5f 73 69 74 65 5f 63 74 78 74 28 73  _def_site_ctxt(s
8770: 70 29 3b 0a 20 20 20 20 6d 61 74 63 68 20 70 61  p);.    match pa
8780: 72 73 65 5f 61 72 67 73 28 65 63 78 2c 20 73 70  rse_args(ecx, sp
8790: 2c 20 74 74 73 29 20 7b 0a 20 20 20 20 20 20 20  , tts) {.       
87a0: 20 4f 6b 28 28 65 66 6d 74 2c 20 61 72 67 73 2c   Ok((efmt, args,
87b0: 20 6e 61 6d 65 73 29 29 20 3d 3e 20 7b 0a 20 20   names)) => {.  
87c0: 20 20 20 20 20 20 20 20 20 20 4d 61 63 45 61 67            MacEag
87d0: 65 72 3a 3a 65 78 70 72 28 65 78 70 61 6e 64 5f  er::expr(expand_
87e0: 70 72 65 70 61 72 73 65 64 5f 66 6f 72 6d 61 74  preparsed_format
87f0: 5f 61 72 67 73 28 65 63 78 2c 20 73 70 2c 20 65  _args(ecx, sp, e
8800: 66 6d 74 2c 20 61 72 67 73 2c 20 6e 61 6d 65 73  fmt, args, names
8810: 2c 20 6e 6c 29 29 0a 20 20 20 20 20 20 20 20 7d  , nl)).        }
8820: 0a 20 20 20 20 20 20 20 20 45 72 72 28 6d 75 74  .        Err(mut
8830: 20 65 72 72 29 20 3d 3e 20 7b 0a 20 20 20 20 20   err) => {.     
8840: 20 20 20 20 20 20 20 65 72 72 2e 65 6d 69 74 28         err.emit(
8850: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 44  );.            D
8860: 75 6d 6d 79 52 65 73 75 6c 74 3a 3a 61 6e 79 28  ummyResult::any(
8870: 73 70 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp).        }.  
8880: 20 20 7d 0a 7d 0a 0a 70 75 62 20 66 6e 20 65 78    }.}..pub fn ex
8890: 70 61 6e 64 5f 66 6f 72 6d 61 74 5f 61 72 67 73  pand_format_args
88a0: 3c 27 63 78 3e 28 0a 20 20 20 20 65 63 78 3a 20  <'cx>(.    ecx: 
88b0: 26 27 63 78 20 6d 75 74 20 45 78 74 43 74 78 74  &'cx mut ExtCtxt
88c0: 3c 27 5f 3e 2c 0a 20 20 20 20 73 70 3a 20 53 70  <'_>,.    sp: Sp
88d0: 61 6e 2c 0a 20 20 20 20 74 74 73 3a 20 54 6f 6b  an,.    tts: Tok
88e0: 65 6e 53 74 72 65 61 6d 2c 0a 29 20 2d 3e 20 42  enStream,.) -> B
88f0: 6f 78 3c 64 79 6e 20 62 61 73 65 3a 3a 4d 61 63  ox<dyn base::Mac
8900: 52 65 73 75 6c 74 20 2b 20 27 63 78 3e 20 7b 0a  Result + 'cx> {.
8910: 20 20 20 20 65 78 70 61 6e 64 5f 66 6f 72 6d 61      expand_forma
8920: 74 5f 61 72 67 73 5f 69 6d 70 6c 28 65 63 78 2c  t_args_impl(ecx,
8930: 20 73 70 2c 20 74 74 73 2c 20 66 61 6c 73 65 29   sp, tts, false)
8940: 0a 7d 0a 0a 70 75 62 20 66 6e 20 65 78 70 61 6e  .}..pub fn expan
8950: 64 5f 66 6f 72 6d 61 74 5f 61 72 67 73 5f 6e 6c  d_format_args_nl
8960: 3c 27 63 78 3e 28 0a 20 20 20 20 65 63 78 3a 20  <'cx>(.    ecx: 
8970: 26 27 63 78 20 6d 75 74 20 45 78 74 43 74 78 74  &'cx mut ExtCtxt
8980: 3c 27 5f 3e 2c 0a 20 20 20 20 73 70 3a 20 53 70  <'_>,.    sp: Sp
8990: 61 6e 2c 0a 20 20 20 20 74 74 73 3a 20 54 6f 6b  an,.    tts: Tok
89a0: 65 6e 53 74 72 65 61 6d 2c 0a 29 20 2d 3e 20 42  enStream,.) -> B
89b0: 6f 78 3c 64 79 6e 20 62 61 73 65 3a 3a 4d 61 63  ox<dyn base::Mac
89c0: 52 65 73 75 6c 74 20 2b 20 27 63 78 3e 20 7b 0a  Result + 'cx> {.
89d0: 20 20 20 20 65 78 70 61 6e 64 5f 66 6f 72 6d 61      expand_forma
89e0: 74 5f 61 72 67 73 5f 69 6d 70 6c 28 65 63 78 2c  t_args_impl(ecx,
89f0: 20 73 70 2c 20 74 74 73 2c 20 74 72 75 65 29 0a   sp, tts, true).
8a00: 7d 0a 0a 2f 2f 2f 20 54 61 6b 65 20 74 68 65 20  }../// Take the 
8a10: 76 61 72 69 6f 75 73 20 70 61 72 74 73 20 6f 66  various parts of
8a20: 20 60 66 6f 72 6d 61 74 5f 61 72 67 73 21 28 65   `format_args!(e
8a30: 66 6d 74 2c 20 61 72 67 73 2e 2e 2e 2c 20 6e 61  fmt, args..., na
8a40: 6d 65 3d 6e 61 6d 65 73 2e 2e 2e 29 60 0a 2f 2f  me=names...)`.//
8a50: 2f 20 61 6e 64 20 63 6f 6e 73 74 72 75 63 74 20  / and construct 
8a60: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8a70: 66 6f 72 6d 61 74 74 69 6e 67 20 65 78 70 72 65  formatting expre
8a80: 73 73 69 6f 6e 2e 0a 70 75 62 20 66 6e 20 65 78  ssion..pub fn ex
8a90: 70 61 6e 64 5f 70 72 65 70 61 72 73 65 64 5f 66  pand_preparsed_f
8aa0: 6f 72 6d 61 74 5f 61 72 67 73 28 0a 20 20 20 20  ormat_args(.    
8ab0: 65 63 78 3a 20 26 6d 75 74 20 45 78 74 43 74 78  ecx: &mut ExtCtx
8ac0: 74 3c 27 5f 3e 2c 0a 20 20 20 20 73 70 3a 20 53  t<'_>,.    sp: S
8ad0: 70 61 6e 2c 0a 20 20 20 20 65 66 6d 74 3a 20 50  pan,.    efmt: P
8ae0: 3c 61 73 74 3a 3a 45 78 70 72 3e 2c 0a 20 20 20  <ast::Expr>,.   
8af0: 20 61 72 67 73 3a 20 56 65 63 3c 50 3c 61 73 74   args: Vec<P<ast
8b00: 3a 3a 45 78 70 72 3e 3e 2c 0a 20 20 20 20 6e 61  ::Expr>>,.    na
8b10: 6d 65 73 3a 20 46 78 48 61 73 68 4d 61 70 3c 53  mes: FxHashMap<S
8b20: 79 6d 62 6f 6c 2c 20 75 73 69 7a 65 3e 2c 0a 20  ymbol, usize>,. 
8b30: 20 20 20 61 70 70 65 6e 64 5f 6e 65 77 6c 69 6e     append_newlin
8b40: 65 3a 20 62 6f 6f 6c 2c 0a 29 20 2d 3e 20 50 3c  e: bool,.) -> P<
8b50: 61 73 74 3a 3a 45 78 70 72 3e 20 7b 0a 20 20 20  ast::Expr> {.   
8b60: 20 2f 2f 20 4e 4f 54 45 3a 20 74 68 69 73 20 76   // NOTE: this v
8b70: 65 72 62 6f 73 65 20 77 61 79 20 6f 66 20 69 6e  erbose way of in
8b80: 69 74 69 61 6c 69 7a 69 6e 67 20 60 56 65 63 3c  itializing `Vec<
8b90: 56 65 63 3c 41 72 67 75 6d 65 6e 74 54 79 70 65  Vec<ArgumentType
8ba0: 3e 3e 60 20 69 73 20 62 65 63 61 75 73 65 0a 20  >>` is because. 
8bb0: 20 20 20 2f 2f 20 60 41 72 67 75 6d 65 6e 74 54     // `ArgumentT
8bc0: 79 70 65 60 20 64 6f 65 73 20 6e 6f 74 20 64 65  ype` does not de
8bd0: 72 69 76 65 20 60 43 6c 6f 6e 65 60 2e 0a 20 20  rive `Clone`..  
8be0: 20 20 6c 65 74 20 61 72 67 5f 74 79 70 65 73 3a    let arg_types:
8bf0: 20 56 65 63 3c 5f 3e 20 3d 20 28 30 2e 2e 61 72   Vec<_> = (0..ar
8c00: 67 73 2e 6c 65 6e 28 29 29 2e 6d 61 70 28 7c 5f  gs.len()).map(|_
8c10: 7c 20 56 65 63 3a 3a 6e 65 77 28 29 29 2e 63 6f  | Vec::new()).co
8c20: 6c 6c 65 63 74 28 29 3b 0a 20 20 20 20 6c 65 74  llect();.    let
8c30: 20 61 72 67 5f 75 6e 69 71 75 65 5f 74 79 70 65   arg_unique_type
8c40: 73 3a 20 56 65 63 3c 5f 3e 20 3d 20 28 30 2e 2e  s: Vec<_> = (0..
8c50: 61 72 67 73 2e 6c 65 6e 28 29 29 2e 6d 61 70 28  args.len()).map(
8c60: 7c 5f 7c 20 56 65 63 3a 3a 6e 65 77 28 29 29 2e  |_| Vec::new()).
8c70: 63 6f 6c 6c 65 63 74 28 29 3b 0a 0a 20 20 20 20  collect();..    
8c80: 6c 65 74 20 6d 75 74 20 6d 61 63 73 70 20 3d 20  let mut macsp = 
8c90: 65 63 78 2e 63 61 6c 6c 5f 73 69 74 65 28 29 3b  ecx.call_site();
8ca0: 0a 20 20 20 20 6d 61 63 73 70 20 3d 20 65 63 78  .    macsp = ecx
8cb0: 2e 77 69 74 68 5f 64 65 66 5f 73 69 74 65 5f 63  .with_def_site_c
8cc0: 74 78 74 28 6d 61 63 73 70 29 3b 0a 0a 20 20 20  txt(macsp);..   
8cd0: 20 6c 65 74 20 6d 73 67 20 3d 20 22 66 6f 72 6d   let msg = "form
8ce0: 61 74 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  at argument must
8cf0: 20 62 65 20 61 20 73 74 72 69 6e 67 20 6c 69 74   be a string lit
8d00: 65 72 61 6c 22 3b 0a 20 20 20 20 6c 65 74 20 66  eral";.    let f
8d10: 6d 74 5f 73 70 20 3d 20 65 66 6d 74 2e 73 70 61  mt_sp = efmt.spa
8d20: 6e 3b 0a 20 20 20 20 6c 65 74 20 28 66 6d 74 5f  n;.    let (fmt_
8d30: 73 74 72 2c 20 66 6d 74 5f 73 74 79 6c 65 2c 20  str, fmt_style, 
8d40: 66 6d 74 5f 73 70 61 6e 29 20 3d 20 6d 61 74 63  fmt_span) = matc
8d50: 68 20 65 78 70 72 5f 74 6f 5f 73 70 61 6e 6e 65  h expr_to_spanne
8d60: 64 5f 73 74 72 69 6e 67 28 65 63 78 2c 20 65 66  d_string(ecx, ef
8d70: 6d 74 2c 20 6d 73 67 29 20 7b 0a 20 20 20 20 20  mt, msg) {.     
8d80: 20 20 20 4f 6b 28 6d 75 74 20 66 6d 74 29 20 69     Ok(mut fmt) i
8d90: 66 20 61 70 70 65 6e 64 5f 6e 65 77 6c 69 6e 65  f append_newline
8da0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
8db0: 20 20 66 6d 74 2e 30 20 3d 20 53 79 6d 62 6f 6c    fmt.0 = Symbol
8dc0: 3a 3a 69 6e 74 65 72 6e 28 26 66 6f 72 6d 61 74  ::intern(&format
8dd0: 21 28 22 7b 7d 5c 6e 22 2c 20 66 6d 74 2e 30 29  !("{}\n", fmt.0)
8de0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
8df0: 6d 74 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  mt.        }.   
8e00: 20 20 20 20 20 4f 6b 28 66 6d 74 29 20 3d 3e 20       Ok(fmt) => 
8e10: 66 6d 74 2c 0a 20 20 20 20 20 20 20 20 45 72 72  fmt,.        Err
8e20: 28 65 72 72 29 20 3d 3e 20 7b 0a 20 20 20 20 20  (err) => {.     
8e30: 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f         if let So
8e40: 6d 65 28 6d 75 74 20 65 72 72 29 20 3d 20 65 72  me(mut err) = er
8e50: 72 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r {.            
8e60: 20 20 20 20 6c 65 74 20 73 75 67 67 5f 66 6d 74      let sugg_fmt
8e70: 20 3d 20 6d 61 74 63 68 20 61 72 67 73 2e 6c 65   = match args.le
8e80: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
8e90: 20 20 20 20 20 20 20 20 20 20 30 20 3d 3e 20 22            0 => "
8ea0: 7b 7d 22 2e 74 6f 5f 73 74 72 69 6e 67 28 29 2c  {}".to_string(),
8eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8ec0: 20 20 20 20 20 5f 20 3d 3e 20 66 6f 72 6d 61 74       _ => format
8ed0: 21 28 22 7b 7d 7b 7b 7d 7d 22 2c 20 22 7b 7d 20  !("{}{{}}", "{} 
8ee0: 22 2e 72 65 70 65 61 74 28 61 72 67 73 2e 6c 65  ".repeat(args.le
8ef0: 6e 28 29 29 29 2c 0a 20 20 20 20 20 20 20 20 20  n())),.         
8f00: 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20         };.      
8f10: 20 20 20 20 20 20 20 20 20 20 65 72 72 2e 73 70            err.sp
8f20: 61 6e 5f 73 75 67 67 65 73 74 69 6f 6e 28 0a 20  an_suggestion(. 
8f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f40: 20 20 20 66 6d 74 5f 73 70 2e 73 68 72 69 6e 6b     fmt_sp.shrink
8f50: 5f 74 6f 5f 6c 6f 28 29 2c 0a 20 20 20 20 20 20  _to_lo(),.      
8f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 79                "y
8f70: 6f 75 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73  ou might be miss
8f80: 69 6e 67 20 61 20 73 74 72 69 6e 67 20 6c 69 74  ing a string lit
8f90: 65 72 61 6c 20 74 6f 20 66 6f 72 6d 61 74 20 77  eral to format w
8fa0: 69 74 68 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ith",.          
8fb0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61 74            format
8fc0: 21 28 22 5c 22 7b 7d 5c 22 2c 20 22 2c 20 73 75  !("\"{}\", ", su
8fd0: 67 67 5f 66 6d 74 29 2c 0a 20 20 20 20 20 20 20  gg_fmt),.       
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 70 70               App
8ff0: 6c 69 63 61 62 69 6c 69 74 79 3a 3a 4d 61 79 62  licability::Mayb
9000: 65 49 6e 63 6f 72 72 65 63 74 2c 0a 20 20 20 20  eIncorrect,.    
9010: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
9020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
9030: 72 72 2e 65 6d 69 74 28 29 3b 0a 20 20 20 20 20  rr.emit();.     
9040: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9050: 20 20 20 20 20 72 65 74 75 72 6e 20 44 75 6d 6d       return Dumm
9060: 79 52 65 73 75 6c 74 3a 3a 72 61 77 5f 65 78 70  yResult::raw_exp
9070: 72 28 73 70 2c 20 74 72 75 65 29 3b 0a 20 20 20  r(sp, true);.   
9080: 20 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a 0a 20       }.    };.. 
9090: 20 20 20 6c 65 74 20 28 69 73 5f 6c 69 74 65 72     let (is_liter
90a0: 61 6c 2c 20 66 6d 74 5f 73 6e 69 70 70 65 74 29  al, fmt_snippet)
90b0: 20 3d 20 6d 61 74 63 68 20 65 63 78 2e 73 6f 75   = match ecx.sou
90c0: 72 63 65 5f 6d 61 70 28 29 2e 73 70 61 6e 5f 74  rce_map().span_t
90d0: 6f 5f 73 6e 69 70 70 65 74 28 66 6d 74 5f 73 70  o_snippet(fmt_sp
90e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 4f 6b 28 73  ) {.        Ok(s
90f0: 29 20 3d 3e 20 28 73 2e 73 74 61 72 74 73 5f 77  ) => (s.starts_w
9100: 69 74 68 28 22 5c 22 22 29 20 7c 7c 20 73 2e 73  ith("\"") || s.s
9110: 74 61 72 74 73 5f 77 69 74 68 28 22 72 23 22 29  tarts_with("r#")
9120: 2c 20 53 6f 6d 65 28 73 29 29 2c 0a 20 20 20 20  , Some(s)),.    
9130: 20 20 20 20 5f 20 3d 3e 20 28 66 61 6c 73 65 2c      _ => (false,
9140: 20 4e 6f 6e 65 29 2c 0a 20 20 20 20 7d 3b 0a 0a   None),.    };..
9150: 20 20 20 20 6c 65 74 20 73 74 72 5f 73 74 79 6c      let str_styl
9160: 65 20 3d 20 6d 61 74 63 68 20 66 6d 74 5f 73 74  e = match fmt_st
9170: 79 6c 65 20 7b 0a 20 20 20 20 20 20 20 20 61 73  yle {.        as
9180: 74 3a 3a 53 74 72 53 74 79 6c 65 3a 3a 43 6f 6f  t::StrStyle::Coo
9190: 6b 65 64 20 3d 3e 20 4e 6f 6e 65 2c 0a 20 20 20  ked => None,.   
91a0: 20 20 20 20 20 61 73 74 3a 3a 53 74 72 53 74 79       ast::StrSty
91b0: 6c 65 3a 3a 52 61 77 28 72 61 77 29 20 3d 3e 20  le::Raw(raw) => 
91c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 6f  {.            So
91d0: 6d 65 28 72 61 77 20 61 73 20 75 73 69 7a 65 29  me(raw as usize)
91e0: 0a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  .        },.    
91f0: 7d 3b 0a 0a 20 20 20 20 2f 2f 2f 20 46 69 6e 64  };..    /// Find
9200: 73 20 74 68 65 20 69 6e 64 69 63 65 73 20 6f 66  s the indices of
9210: 20 61 6c 6c 20 63 68 61 72 61 63 74 65 72 73 20   all characters 
9220: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 70  that have been p
9230: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 64 69 66  rocessed and dif
9240: 66 65 72 20 62 65 74 77 65 65 6e 20 74 68 65 20  fer between the 
9250: 61 63 74 75 61 6c 0a 20 20 20 20 2f 2f 2f 20 77  actual.    /// w
9260: 72 69 74 74 65 6e 20 63 6f 64 65 20 28 63 6f 64  ritten code (cod
9270: 65 20 73 6e 69 70 70 65 74 29 20 61 6e 64 20 74  e snippet) and t
9280: 68 65 20 60 49 6e 74 65 72 6e 65 64 53 74 72 69  he `InternedStri
9290: 6e 67 60 20 74 68 61 74 20 67 65 74 27 73 20 70  ng` that get's p
92a0: 72 6f 63 65 73 73 65 64 20 69 6e 20 74 68 65 20  rocessed in the 
92b0: 60 50 61 72 73 65 72 60 0a 20 20 20 20 2f 2f 2f  `Parser`.    ///
92c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72 6f   in order to pro
92d0: 70 65 72 6c 79 20 73 79 6e 74 68 65 74 68 69 73  perly synthethis
92e0: 65 20 74 68 65 20 69 6e 74 72 61 2d 73 74 72 69  e the intra-stri
92f0: 6e 67 20 60 53 70 61 6e 60 73 20 66 6f 72 20 65  ng `Span`s for e
9300: 72 72 6f 72 20 64 69 61 67 6e 6f 73 74 69 63 73  rror diagnostics
9310: 2e 0a 20 20 20 20 66 6e 20 66 69 6e 64 5f 73 6b  ..    fn find_sk
9320: 69 70 73 28 73 6e 69 70 70 65 74 3a 20 26 73 74  ips(snippet: &st
9330: 72 2c 20 69 73 5f 72 61 77 3a 20 62 6f 6f 6c 29  r, is_raw: bool)
9340: 20 2d 3e 20 56 65 63 3c 75 73 69 7a 65 3e 20 7b   -> Vec<usize> {
9350: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
9360: 20 65 61 74 5f 77 73 20 3d 20 66 61 6c 73 65 3b   eat_ws = false;
9370: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74  .        let mut
9380: 20 73 20 3d 20 73 6e 69 70 70 65 74 2e 63 68 61   s = snippet.cha
9390: 72 73 28 29 2e 65 6e 75 6d 65 72 61 74 65 28 29  rs().enumerate()
93a0: 2e 70 65 65 6b 61 62 6c 65 28 29 3b 0a 20 20 20  .peekable();.   
93b0: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 73 6b 69       let mut ski
93c0: 70 73 20 3d 20 76 65 63 21 5b 5d 3b 0a 20 20 20  ps = vec![];.   
93d0: 20 20 20 20 20 77 68 69 6c 65 20 6c 65 74 20 53       while let S
93e0: 6f 6d 65 28 28 70 6f 73 2c 20 63 29 29 20 3d 20  ome((pos, c)) = 
93f0: 73 2e 6e 65 78 74 28 29 20 7b 0a 20 20 20 20 20  s.next() {.     
9400: 20 20 20 20 20 20 20 6d 61 74 63 68 20 28 63 2c         match (c,
9410: 20 73 2e 70 65 65 6b 28 29 29 20 7b 0a 20 20 20   s.peek()) {.   
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
9430: 73 6b 69 70 20 77 68 69 74 65 73 70 61 63 65 20  skip whitespace 
9440: 61 6e 64 20 65 6d 70 74 79 20 6c 69 6e 65 73 20  and empty lines 
9450: 65 6e 64 69 6e 67 20 69 6e 20 27 5c 5c 27 0a 20  ending in '\\'. 
9460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9470: 27 5c 5c 27 2c 20 53 6f 6d 65 28 28 6e 65 78 74  '\\', Some((next
9480: 5f 70 6f 73 2c 20 27 5c 6e 27 29 29 29 20 69 66  _pos, '\n'))) if
9490: 20 21 69 73 5f 72 61 77 20 3d 3e 20 7b 0a 20 20   !is_raw => {.  
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 65 61 74 5f 77 73 20 3d 20 74 72 75 65 3b    eat_ws = true;
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
94d0: 20 20 20 20 20 73 6b 69 70 73 2e 70 75 73 68 28       skips.push(
94e0: 70 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pos);.          
94f0: 20 20 20 20 20 20 20 20 20 20 73 6b 69 70 73 2e            skips.
9500: 70 75 73 68 28 2a 6e 65 78 74 5f 70 6f 73 29 3b  push(*next_pos);
9510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9520: 20 20 20 20 20 6c 65 74 20 5f 20 3d 20 73 2e 6e       let _ = s.n
9530: 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ext();.         
9540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9550: 20 20 20 20 20 20 20 20 20 28 27 5c 5c 27 2c 20           ('\\', 
9560: 53 6f 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20  Some((next_pos, 
9570: 27 5c 6e 27 29 29 29 20 7c 0a 20 20 20 20 20 20  '\n'))) |.      
9580: 20 20 20 20 20 20 20 20 20 20 28 27 5c 5c 27 2c            ('\\',
9590: 20 53 6f 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c   Some((next_pos,
95a0: 20 27 6e 27 29 29 29 20 7c 0a 20 20 20 20 20 20   'n'))) |.      
95b0: 20 20 20 20 20 20 20 20 20 20 28 27 5c 5c 27 2c            ('\\',
95c0: 20 53 6f 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c   Some((next_pos,
95d0: 20 27 74 27 29 29 29 20 69 66 20 65 61 74 5f 77   't'))) if eat_w
95e0: 73 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  s => {.         
95f0: 20 20 20 20 20 20 20 20 20 20 20 73 6b 69 70 73             skips
9600: 2e 70 75 73 68 28 70 6f 73 29 3b 0a 20 20 20 20  .push(pos);.    
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 73 6b 69 70 73 2e 70 75 73 68 28 2a 6e 65 78 74  skips.push(*next
9630: 5f 70 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  _pos);.         
9640: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f             let _
9650: 20 3d 20 73 2e 6e 65 78 74 28 29 3b 0a 20 20 20   = s.next();.   
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9680: 27 20 27 2c 20 5f 29 20 7c 0a 20 20 20 20 20 20  ' ', _) |.      
9690: 20 20 20 20 20 20 20 20 20 20 28 27 5c 6e 27 2c            ('\n',
96a0: 20 5f 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20   _) |.          
96b0: 20 20 20 20 20 20 28 27 5c 74 27 2c 20 5f 29 20        ('\t', _) 
96c0: 69 66 20 65 61 74 5f 77 73 20 3d 3e 20 7b 0a 20  if eat_ws => {. 
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96e0: 20 20 20 73 6b 69 70 73 2e 70 75 73 68 28 70 6f     skips.push(po
96f0: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
9700: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
9710: 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53 6f 6d        ('\\', Som
9720: 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27 6e 27  e((next_pos, 'n'
9730: 29 29 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ))) |.          
9740: 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53 6f 6d        ('\\', Som
9750: 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27 74 27  e((next_pos, 't'
9760: 29 29 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ))) |.          
9770: 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53 6f 6d        ('\\', Som
9780: 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27 30 27  e((next_pos, '0'
9790: 29 29 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ))) |.          
97a0: 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53 6f 6d        ('\\', Som
97b0: 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27 5c 5c  e((next_pos, '\\
97c0: 27 29 29 29 20 7c 0a 20 20 20 20 20 20 20 20 20  '))) |.         
97d0: 20 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53 6f         ('\\', So
97e0: 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27 5c  me((next_pos, '\
97f0: 27 27 29 29 29 20 7c 0a 20 20 20 20 20 20 20 20  ''))) |.        
9800: 20 20 20 20 20 20 20 20 28 27 5c 5c 27 2c 20 53          ('\\', S
9810: 6f 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 27  ome((next_pos, '
9820: 5c 22 27 29 29 29 20 3d 3e 20 7b 0a 20 20 20 20  \"'))) => {.    
9830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9840: 73 6b 69 70 73 2e 70 75 73 68 28 2a 6e 65 78 74  skips.push(*next
9850: 5f 70 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 20  _pos);.         
9860: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 5f             let _
9870: 20 3d 20 73 2e 6e 65 78 74 28 29 3b 0a 20 20 20   = s.next();.   
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
98a0: 27 5c 5c 27 2c 20 53 6f 6d 65 28 28 5f 2c 20 27  '\\', Some((_, '
98b0: 78 27 29 29 29 20 69 66 20 21 69 73 5f 72 61 77  x'))) if !is_raw
98c0: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
98d0: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 5f 20            for _ 
98e0: 69 6e 20 30 2e 2e 33 20 7b 20 20 2f 2f 20 63 6f  in 0..3 {  // co
98f0: 6e 73 75 6d 65 20 60 5c 78 41 42 60 20 6c 69 74  nsume `\xAB` lit
9900: 65 72 61 6c 0a 20 20 20 20 20 20 20 20 20 20 20  eral.           
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9920: 6c 65 74 20 53 6f 6d 65 28 28 70 6f 73 2c 20 5f  let Some((pos, _
9930: 29 29 20 3d 20 73 2e 6e 65 78 74 28 29 20 7b 0a  )) = s.next() {.
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 20 20 20 20 20 20 20 20 20 20 20 20 73 6b 69 70              skip
9960: 73 2e 70 75 73 68 28 70 6f 73 29 3b 0a 20 20 20  s.push(pos);.   
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
99b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
99e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
9a00: 20 20 20 28 27 5c 5c 27 2c 20 53 6f 6d 65 28 28     ('\\', Some((
9a10: 5f 2c 20 27 75 27 29 29 29 20 69 66 20 21 69 73  _, 'u'))) if !is
9a20: 5f 72 61 77 20 3d 3e 20 7b 0a 20 20 20 20 20 20  _raw => {.      
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
9a40: 20 6c 65 74 20 53 6f 6d 65 28 28 70 6f 73 2c 20   let Some((pos, 
9a50: 5f 29 29 20 3d 20 73 2e 6e 65 78 74 28 29 20 7b  _)) = s.next() {
9a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9a70: 20 20 20 20 20 20 20 20 20 73 6b 69 70 73 2e 70           skips.p
9a80: 75 73 68 28 70 6f 73 29 3b 0a 20 20 20 20 20 20  ush(pos);.      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28      if let Some(
9ac0: 28 6e 65 78 74 5f 70 6f 73 2c 20 6e 65 78 74 5f  (next_pos, next_
9ad0: 63 29 29 20 3d 20 73 2e 6e 65 78 74 28 29 20 7b  c)) = s.next() {
9ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9af0: 20 20 20 20 20 20 20 20 20 69 66 20 6e 65 78 74           if next
9b00: 5f 63 20 3d 3d 20 27 7b 27 20 7b 0a 20 20 20 20  _c == '{' {.    
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b20: 20 20 20 20 20 20 20 20 73 6b 69 70 73 2e 70 75          skips.pu
9b30: 73 68 28 6e 65 78 74 5f 70 6f 73 29 3b 0a 20 20  sh(next_pos);.  
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b50: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
9b60: 74 20 69 20 3d 20 30 3b 20 20 2f 2f 20 63 6f 6e  t i = 0;  // con
9b70: 73 75 6d 65 20 75 70 20 74 6f 20 36 20 68 65 78  sume up to 6 hex
9b80: 61 6e 75 6d 65 72 69 63 20 63 68 61 72 73 20 2b  anumeric chars +
9b90: 20 63 6c 6f 73 69 6e 67 20 60 7d 60 0a 20 20 20   closing `}`.   
9ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9bb0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20 6c           while l
9bc0: 65 74 20 28 53 6f 6d 65 28 28 6e 65 78 74 5f 70  et (Some((next_p
9bd0: 6f 73 2c 20 63 29 29 2c 20 74 72 75 65 29 20 3d  os, c)), true) =
9be0: 20 28 73 2e 6e 65 78 74 28 29 2c 20 69 20 3c 20   (s.next(), i < 
9bf0: 37 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  7) {.           
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 20 20 20 69 66 20 63 2e 69 73 5f 64 69 67       if c.is_dig
9c20: 69 74 28 31 36 29 20 7b 0a 20 20 20 20 20 20 20  it(16) {.       
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6b 69               ski
9c50: 70 73 2e 70 75 73 68 28 6e 65 78 74 5f 70 6f 73  ps.push(next_pos
9c60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c80: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 63 20 3d     } else if c =
9c90: 3d 20 27 7d 27 20 7b 0a 20 20 20 20 20 20 20 20  = '}' {.        
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 73 6b 69 70              skip
9cc0: 73 2e 70 75 73 68 28 6e 65 78 74 5f 70 6f 73 29  s.push(next_pos)
9cd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
9d20: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d90: 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20     i += 1;.     
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 7d 20 65 6c 73 65 20 69 66 20 6e 65 78 74 5f   } else if next_
9de0: 63 2e 69 73 5f 64 69 67 69 74 28 31 36 29 20 7b  c.is_digit(16) {
9df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6b 69               ski
9e10: 70 73 2e 70 75 73 68 28 6e 65 78 74 5f 70 6f 73  ps.push(next_pos
9e20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9e40: 2f 20 57 65 20 73 75 67 67 65 73 74 20 61 64 64  / We suggest add
9e50: 69 6e 67 20 60 7b 60 20 61 6e 64 20 60 7d 60 20  ing `{` and `}` 
9e60: 77 68 65 6e 20 61 70 70 72 6f 70 72 69 61 74 65  when appropriate
9e70: 2c 20 61 63 63 65 70 74 20 69 74 20 68 65 72 65  , accept it here
9e80: 20 61 73 20 69 66 0a 20 20 20 20 20 20 20 20 20   as if.         
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ea0: 20 20 20 2f 2f 20 69 74 20 77 65 72 65 20 63 6f     // it were co
9eb0: 72 72 65 63 74 0a 20 20 20 20 20 20 20 20 20 20  rrect.          
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 6c 65 74 20 6d 75 74 20 69 20 3d 20 30 3b    let mut i = 0;
9ee0: 20 20 2f 2f 20 63 6f 6e 73 75 6d 65 20 75 70 20    // consume up 
9ef0: 74 6f 20 36 20 68 65 78 61 6e 75 6d 65 72 69 63  to 6 hexanumeric
9f00: 20 63 68 61 72 73 0a 20 20 20 20 20 20 20 20 20   chars.         
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f20: 20 20 20 77 68 69 6c 65 20 6c 65 74 20 28 53 6f     while let (So
9f30: 6d 65 28 28 6e 65 78 74 5f 70 6f 73 2c 20 63 29  me((next_pos, c)
9f40: 29 2c 20 5f 29 20 3d 20 28 73 2e 6e 65 78 74 28  ), _) = (s.next(
9f50: 29 2c 20 69 20 3c 20 36 29 20 7b 0a 20 20 20 20  ), i < 6) {.    
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 63              if c
9f80: 2e 69 73 5f 64 69 67 69 74 28 31 36 29 20 7b 0a  .is_digit(16) {.
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 73 6b 69 70 73 2e 70 75 73 68 28 6e      skips.push(n
9fc0: 65 78 74 5f 70 6f 73 29 3b 0a 20 20 20 20 20 20  ext_pos);.      
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
9ff0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
a040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a060: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a080: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a0c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a0d0: 20 20 20 20 20 20 20 20 5f 20 69 66 20 65 61 74          _ if eat
a0e0: 5f 77 73 20 3d 3e 20 7b 20 20 2f 2f 20 60 74 61  _ws => {  // `ta
a0f0: 6b 65 5f 77 68 69 6c 65 28 7c 63 7c 20 63 2e 69  ke_while(|c| c.i
a100: 73 5f 77 68 69 74 65 73 70 61 63 65 28 29 29 60  s_whitespace())`
a110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a120: 20 20 20 20 20 65 61 74 5f 77 73 20 3d 20 66 61       eat_ws = fa
a130: 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
a140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a150: 20 20 20 20 20 20 20 5f 20 3d 3e 20 7b 7d 0a 20         _ => {}. 
a160: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
a170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
a180: 6b 69 70 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  kips.    }..    
a190: 6c 65 74 20 73 6b 69 70 73 20 3d 20 69 66 20 6c  let skips = if l
a1a0: 65 74 20 28 74 72 75 65 2c 20 53 6f 6d 65 28 72  et (true, Some(r
a1b0: 65 66 20 73 6e 69 70 70 65 74 29 29 20 3d 20 28  ef snippet)) = (
a1c0: 69 73 5f 6c 69 74 65 72 61 6c 2c 20 66 6d 74 5f  is_literal, fmt_
a1d0: 73 6e 69 70 70 65 74 2e 61 73 5f 72 65 66 28 29  snippet.as_ref()
a1e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
a1f0: 72 5f 73 74 61 72 74 20 3d 20 73 74 72 5f 73 74  r_start = str_st
a200: 79 6c 65 2e 6d 61 70 28 7c 72 7c 20 72 20 2b 20  yle.map(|r| r + 
a210: 31 29 2e 75 6e 77 72 61 70 5f 6f 72 28 30 29 3b  1).unwrap_or(0);
a220: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 72 5f 65  .        let r_e
a230: 6e 64 20 3d 20 73 74 72 5f 73 74 79 6c 65 2e 6d  nd = str_style.m
a240: 61 70 28 7c 72 7c 20 72 29 2e 75 6e 77 72 61 70  ap(|r| r).unwrap
a250: 5f 6f 72 28 30 29 3b 0a 20 20 20 20 20 20 20 20  _or(0);.        
a260: 6c 65 74 20 73 20 3d 20 26 73 6e 69 70 70 65 74  let s = &snippet
a270: 5b 72 5f 73 74 61 72 74 20 2b 20 31 2e 2e 73 6e  [r_start + 1..sn
a280: 69 70 70 65 74 2e 6c 65 6e 28 29 20 2d 20 72 5f  ippet.len() - r_
a290: 65 6e 64 20 2d 20 31 5d 3b 0a 20 20 20 20 20 20  end - 1];.      
a2a0: 20 20 66 69 6e 64 5f 73 6b 69 70 73 28 73 2c 20    find_skips(s, 
a2b0: 73 74 72 5f 73 74 79 6c 65 2e 69 73 5f 73 6f 6d  str_style.is_som
a2c0: 65 28 29 29 0a 20 20 20 20 7d 20 65 6c 73 65 20  e()).    } else 
a2d0: 7b 0a 20 20 20 20 20 20 20 20 76 65 63 21 5b 5d  {.        vec![]
a2e0: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 6c 65 74  .    };..    let
a2f0: 20 66 6d 74 5f 73 74 72 20 3d 20 26 66 6d 74 5f   fmt_str = &fmt_
a300: 73 74 72 2e 61 73 5f 73 74 72 28 29 3b 20 20 2f  str.as_str();  /
a310: 2f 20 66 6f 72 20 74 68 65 20 73 75 67 67 65 73  / for the sugges
a320: 74 69 6f 6e 73 20 62 65 6c 6f 77 0a 20 20 20 20  tions below.    
a330: 6c 65 74 20 6d 75 74 20 70 61 72 73 65 72 20 3d  let mut parser =
a340: 20 70 61 72 73 65 3a 3a 50 61 72 73 65 72 3a 3a   parse::Parser::
a350: 6e 65 77 28 66 6d 74 5f 73 74 72 2c 20 73 74 72  new(fmt_str, str
a360: 5f 73 74 79 6c 65 2c 20 73 6b 69 70 73 2c 20 61  _style, skips, a
a370: 70 70 65 6e 64 5f 6e 65 77 6c 69 6e 65 29 3b 0a  ppend_newline);.
a380: 0a 20 20 20 20 6c 65 74 20 6d 75 74 20 75 6e 76  .    let mut unv
a390: 65 72 69 66 69 65 64 5f 70 69 65 63 65 73 20 3d  erified_pieces =
a3a0: 20 56 65 63 3a 3a 6e 65 77 28 29 3b 0a 20 20 20   Vec::new();.   
a3b0: 20 77 68 69 6c 65 20 6c 65 74 20 53 6f 6d 65 28   while let Some(
a3c0: 70 69 65 63 65 29 20 3d 20 70 61 72 73 65 72 2e  piece) = parser.
a3d0: 6e 65 78 74 28 29 20 7b 0a 20 20 20 20 20 20 20  next() {.       
a3e0: 20 69 66 20 21 70 61 72 73 65 72 2e 65 72 72 6f   if !parser.erro
a3f0: 72 73 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b 0a  rs.is_empty() {.
a400: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
a410: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  k;.        } els
a420: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
a430: 75 6e 76 65 72 69 66 69 65 64 5f 70 69 65 63 65  unverified_piece
a440: 73 2e 70 75 73 68 28 70 69 65 63 65 29 3b 0a 20  s.push(piece);. 
a450: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
a460: 20 20 20 20 69 66 20 21 70 61 72 73 65 72 2e 65      if !parser.e
a470: 72 72 6f 72 73 2e 69 73 5f 65 6d 70 74 79 28 29  rrors.is_empty()
a480: 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20 65   {.        let e
a490: 72 72 20 3d 20 70 61 72 73 65 72 2e 65 72 72 6f  rr = parser.erro
a4a0: 72 73 2e 72 65 6d 6f 76 65 28 30 29 3b 0a 20 20  rs.remove(0);.  
a4b0: 20 20 20 20 20 20 6c 65 74 20 73 70 20 3d 20 66        let sp = f
a4c0: 6d 74 5f 73 70 61 6e 2e 66 72 6f 6d 5f 69 6e 6e  mt_span.from_inn
a4d0: 65 72 28 65 72 72 2e 73 70 61 6e 29 3b 0a 20 20  er(err.span);.  
a4e0: 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 65 20        let mut e 
a4f0: 3d 20 65 63 78 2e 73 74 72 75 63 74 5f 73 70 61  = ecx.struct_spa
a500: 6e 5f 65 72 72 28 73 70 2c 20 26 66 6f 72 6d 61  n_err(sp, &forma
a510: 74 21 28 22 69 6e 76 61 6c 69 64 20 66 6f 72 6d  t!("invalid form
a520: 61 74 20 73 74 72 69 6e 67 3a 20 7b 7d 22 2c 0a  at string: {}",.
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 20 20 20 20 20 65 72 72 2e 64 65 73 63 72 69 70       err.descrip
a570: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  tion));.        
a580: 65 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 73 70 2c  e.span_label(sp,
a590: 20 65 72 72 2e 6c 61 62 65 6c 20 2b 20 22 20 69   err.label + " i
a5a0: 6e 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 22  n format string"
a5b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 6c 65  );.        if le
a5c0: 74 20 53 6f 6d 65 28 6e 6f 74 65 29 20 3d 20 65  t Some(note) = e
a5d0: 72 72 2e 6e 6f 74 65 20 7b 0a 20 20 20 20 20 20  rr.note {.      
a5e0: 20 20 20 20 20 20 65 2e 6e 6f 74 65 28 26 6e 6f        e.note(&no
a5f0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  te);.        }. 
a600: 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f         if let So
a610: 6d 65 28 28 6c 61 62 65 6c 2c 20 73 70 61 6e 29  me((label, span)
a620: 29 20 3d 20 65 72 72 2e 73 65 63 6f 6e 64 61 72  ) = err.secondar
a630: 79 5f 6c 61 62 65 6c 20 7b 0a 20 20 20 20 20 20  y_label {.      
a640: 20 20 20 20 20 20 6c 65 74 20 73 70 20 3d 20 66        let sp = f
a650: 6d 74 5f 73 70 61 6e 2e 66 72 6f 6d 5f 69 6e 6e  mt_span.from_inn
a660: 65 72 28 73 70 61 6e 29 3b 0a 20 20 20 20 20 20  er(span);.      
a670: 20 20 20 20 20 20 65 2e 73 70 61 6e 5f 6c 61 62        e.span_lab
a680: 65 6c 28 73 70 2c 20 6c 61 62 65 6c 29 3b 0a 20  el(sp, label);. 
a690: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a6a0: 20 65 2e 65 6d 69 74 28 29 3b 0a 20 20 20 20 20   e.emit();.     
a6b0: 20 20 20 72 65 74 75 72 6e 20 44 75 6d 6d 79 52     return DummyR
a6c0: 65 73 75 6c 74 3a 3a 72 61 77 5f 65 78 70 72 28  esult::raw_expr(
a6d0: 73 70 2c 20 74 72 75 65 29 3b 0a 20 20 20 20 7d  sp, true);.    }
a6e0: 0a 0a 20 20 20 20 6c 65 74 20 61 72 67 5f 73 70  ..    let arg_sp
a6f0: 61 6e 73 20 3d 20 70 61 72 73 65 72 2e 61 72 67  ans = parser.arg
a700: 5f 70 6c 61 63 65 73 2e 69 74 65 72 28 29 0a 20  _places.iter(). 
a710: 20 20 20 20 20 20 20 2e 6d 61 70 28 7c 73 70 61         .map(|spa
a720: 6e 7c 20 66 6d 74 5f 73 70 61 6e 2e 66 72 6f 6d  n| fmt_span.from
a730: 5f 69 6e 6e 65 72 28 2a 73 70 61 6e 29 29 0a 20  _inner(*span)). 
a740: 20 20 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 28         .collect(
a750: 29 3b 0a 0a 20 20 20 20 6c 65 74 20 6e 61 6d 65  );..    let name
a760: 64 5f 70 6f 73 3a 20 46 78 48 61 73 68 53 65 74  d_pos: FxHashSet
a770: 3c 75 73 69 7a 65 3e 20 3d 20 6e 61 6d 65 73 2e  <usize> = names.
a780: 76 61 6c 75 65 73 28 29 2e 63 6c 6f 6e 65 64 28  values().cloned(
a790: 29 2e 63 6f 6c 6c 65 63 74 28 29 3b 0a 0a 20 20  ).collect();..  
a7a0: 20 20 6c 65 74 20 6d 75 74 20 63 78 20 3d 20 43    let mut cx = C
a7b0: 6f 6e 74 65 78 74 20 7b 0a 20 20 20 20 20 20 20  ontext {.       
a7c0: 20 65 63 78 2c 0a 20 20 20 20 20 20 20 20 61 72   ecx,.        ar
a7d0: 67 73 2c 0a 20 20 20 20 20 20 20 20 61 72 67 5f  gs,.        arg_
a7e0: 74 79 70 65 73 2c 0a 20 20 20 20 20 20 20 20 61  types,.        a
a7f0: 72 67 5f 75 6e 69 71 75 65 5f 74 79 70 65 73 2c  rg_unique_types,
a800: 0a 20 20 20 20 20 20 20 20 6e 61 6d 65 73 2c 0a  .        names,.
a810: 20 20 20 20 20 20 20 20 63 75 72 61 72 67 3a 20          curarg: 
a820: 30 2c 0a 20 20 20 20 20 20 20 20 63 75 72 70 69  0,.        curpi
a830: 65 63 65 3a 20 30 2c 0a 20 20 20 20 20 20 20 20  ece: 0,.        
a840: 61 72 67 5f 69 6e 64 65 78 5f 6d 61 70 3a 20 56  arg_index_map: V
a850: 65 63 3a 3a 6e 65 77 28 29 2c 0a 20 20 20 20 20  ec::new(),.     
a860: 20 20 20 63 6f 75 6e 74 5f 61 72 67 73 3a 20 56     count_args: V
a870: 65 63 3a 3a 6e 65 77 28 29 2c 0a 20 20 20 20 20  ec::new(),.     
a880: 20 20 20 63 6f 75 6e 74 5f 70 6f 73 69 74 69 6f     count_positio
a890: 6e 73 3a 20 46 78 48 61 73 68 4d 61 70 3a 3a 64  ns: FxHashMap::d
a8a0: 65 66 61 75 6c 74 28 29 2c 0a 20 20 20 20 20 20  efault(),.      
a8b0: 20 20 63 6f 75 6e 74 5f 70 6f 73 69 74 69 6f 6e    count_position
a8c0: 73 5f 63 6f 75 6e 74 3a 20 30 2c 0a 20 20 20 20  s_count: 0,.    
a8d0: 20 20 20 20 63 6f 75 6e 74 5f 61 72 67 73 5f 69      count_args_i
a8e0: 6e 64 65 78 5f 6f 66 66 73 65 74 3a 20 30 2c 0a  ndex_offset: 0,.
a8f0: 20 20 20 20 20 20 20 20 6c 69 74 65 72 61 6c 3a          literal:
a900: 20 53 74 72 69 6e 67 3a 3a 6e 65 77 28 29 2c 0a   String::new(),.
a910: 20 20 20 20 20 20 20 20 70 69 65 63 65 73 3a 20          pieces: 
a920: 56 65 63 3a 3a 77 69 74 68 5f 63 61 70 61 63 69  Vec::with_capaci
a930: 74 79 28 75 6e 76 65 72 69 66 69 65 64 5f 70 69  ty(unverified_pi
a940: 65 63 65 73 2e 6c 65 6e 28 29 29 2c 0a 20 20 20  eces.len()),.   
a950: 20 20 20 20 20 73 74 72 5f 70 69 65 63 65 73 3a       str_pieces:
a960: 20 56 65 63 3a 3a 77 69 74 68 5f 63 61 70 61 63   Vec::with_capac
a970: 69 74 79 28 75 6e 76 65 72 69 66 69 65 64 5f 70  ity(unverified_p
a980: 69 65 63 65 73 2e 6c 65 6e 28 29 29 2c 0a 20 20  ieces.len()),.  
a990: 20 20 20 20 20 20 61 6c 6c 5f 70 69 65 63 65 73        all_pieces
a9a0: 5f 73 69 6d 70 6c 65 3a 20 74 72 75 65 2c 0a 20  _simple: true,. 
a9b0: 20 20 20 20 20 20 20 6d 61 63 73 70 2c 0a 20 20         macsp,.  
a9c0: 20 20 20 20 20 20 66 6d 74 73 70 3a 20 66 6d 74        fmtsp: fmt
a9d0: 5f 73 70 61 6e 2c 0a 20 20 20 20 20 20 20 20 69  _span,.        i
a9e0: 6e 76 61 6c 69 64 5f 72 65 66 73 3a 20 56 65 63  nvalid_refs: Vec
a9f0: 3a 3a 6e 65 77 28 29 2c 0a 20 20 20 20 20 20 20  ::new(),.       
aa00: 20 61 72 67 5f 73 70 61 6e 73 2c 0a 20 20 20 20   arg_spans,.    
aa10: 20 20 20 20 61 72 67 5f 77 69 74 68 5f 66 6f 72      arg_with_for
aa20: 6d 61 74 74 69 6e 67 3a 20 56 65 63 3a 3a 6e 65  matting: Vec::ne
aa30: 77 28 29 2c 0a 20 20 20 20 20 20 20 20 69 73 5f  w(),.        is_
aa40: 6c 69 74 65 72 61 6c 2c 0a 20 20 20 20 7d 3b 0a  literal,.    };.
aa50: 0a 20 20 20 20 2f 2f 20 54 68 69 73 20 6e 65 65  .    // This nee
aa60: 64 73 20 74 6f 20 68 61 70 70 65 6e 20 2a 61 66  ds to happen *af
aa70: 74 65 72 2a 20 74 68 65 20 50 61 72 73 65 72 20  ter* the Parser 
aa80: 68 61 73 20 63 6f 6e 73 75 6d 65 64 20 61 6c 6c  has consumed all
aa90: 20 70 69 65 63 65 73 20 74 6f 20 63 72 65 61 74   pieces to creat
aaa0: 65 20 61 6c 6c 20 74 68 65 20 73 70 61 6e 73 0a  e all the spans.
aab0: 20 20 20 20 6c 65 74 20 70 69 65 63 65 73 20 3d      let pieces =
aac0: 20 75 6e 76 65 72 69 66 69 65 64 5f 70 69 65 63   unverified_piec
aad0: 65 73 2e 69 6e 74 6f 5f 69 74 65 72 28 29 2e 6d  es.into_iter().m
aae0: 61 70 28 7c 6d 75 74 20 70 69 65 63 65 7c 20 7b  ap(|mut piece| {
aaf0: 0a 20 20 20 20 20 20 20 20 63 78 2e 76 65 72 69  .        cx.veri
ab00: 66 79 5f 70 69 65 63 65 28 26 70 69 65 63 65 29  fy_piece(&piece)
ab10: 3b 0a 20 20 20 20 20 20 20 20 63 78 2e 72 65 73  ;.        cx.res
ab20: 6f 6c 76 65 5f 6e 61 6d 65 5f 69 6e 70 6c 61 63  olve_name_inplac
ab30: 65 28 26 6d 75 74 20 70 69 65 63 65 29 3b 0a 20  e(&mut piece);. 
ab40: 20 20 20 20 20 20 20 70 69 65 63 65 0a 20 20 20         piece.   
ab50: 20 7d 29 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65   }).collect::<Ve
ab60: 63 3c 5f 3e 3e 28 29 3b 0a 0a 20 20 20 20 6c 65  c<_>>();..    le
ab70: 74 20 6e 75 6d 62 65 72 65 64 5f 70 6f 73 69 74  t numbered_posit
ab80: 69 6f 6e 5f 61 72 67 73 20 3d 20 70 69 65 63 65  ion_args = piece
ab90: 73 2e 69 74 65 72 28 29 2e 61 6e 79 28 7c 61 72  s.iter().any(|ar
aba0: 67 3a 20 26 70 61 72 73 65 3a 3a 50 69 65 63 65  g: &parse::Piece
abb0: 3c 27 5f 3e 7c 20 7b 0a 20 20 20 20 20 20 20 20  <'_>| {.        
abc0: 6d 61 74 63 68 20 2a 61 72 67 20 7b 0a 20 20 20  match *arg {.   
abd0: 20 20 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a           parse::
abe0: 53 74 72 69 6e 67 28 5f 29 20 3d 3e 20 66 61 6c  String(_) => fal
abf0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
ac00: 70 61 72 73 65 3a 3a 4e 65 78 74 41 72 67 75 6d  parse::NextArgum
ac10: 65 6e 74 28 61 72 67 29 20 3d 3e 20 7b 0a 20 20  ent(arg) => {.  
ac20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61                ma
ac30: 74 63 68 20 61 72 67 2e 70 6f 73 69 74 69 6f 6e  tch arg.position
ac40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
ac50: 20 20 20 20 20 20 20 70 61 72 73 65 3a 3a 50 6f         parse::Po
ac60: 73 69 74 69 6f 6e 3a 3a 41 72 67 75 6d 65 6e 74  sition::Argument
ac70: 49 73 28 5f 29 20 3d 3e 20 74 72 75 65 2c 0a 20  Is(_) => true,. 
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 5f 20 3d 3e 20 66 61 6c 73 65 2c 0a 20     _ => false,. 
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
acb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
acc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 3b         }.    });
acd0: 0a 0a 20 20 20 20 63 78 2e 62 75 69 6c 64 5f 69  ..    cx.build_i
ace0: 6e 64 65 78 5f 6d 61 70 28 29 3b 0a 0a 20 20 20  ndex_map();..   
acf0: 20 6c 65 74 20 6d 75 74 20 61 72 67 5f 69 6e 64   let mut arg_ind
ad00: 65 78 5f 63 6f 6e 73 75 6d 65 64 20 3d 20 76 65  ex_consumed = ve
ad10: 63 21 5b 30 75 73 69 7a 65 3b 20 63 78 2e 61 72  c![0usize; cx.ar
ad20: 67 5f 69 6e 64 65 78 5f 6d 61 70 2e 6c 65 6e 28  g_index_map.len(
ad30: 29 5d 3b 0a 0a 20 20 20 20 66 6f 72 20 70 69 65  )];..    for pie
ad40: 63 65 20 69 6e 20 70 69 65 63 65 73 20 7b 0a 20  ce in pieces {. 
ad50: 20 20 20 20 20 20 20 69 66 20 6c 65 74 20 53 6f         if let So
ad60: 6d 65 28 70 69 65 63 65 29 20 3d 20 63 78 2e 62  me(piece) = cx.b
ad70: 75 69 6c 64 5f 70 69 65 63 65 28 26 70 69 65 63  uild_piece(&piec
ad80: 65 2c 20 26 6d 75 74 20 61 72 67 5f 69 6e 64 65  e, &mut arg_inde
ad90: 78 5f 63 6f 6e 73 75 6d 65 64 29 20 7b 0a 20 20  x_consumed) {.  
ada0: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 73 20            let s 
adb0: 3d 20 63 78 2e 62 75 69 6c 64 5f 6c 69 74 65 72  = cx.build_liter
adc0: 61 6c 5f 73 74 72 69 6e 67 28 29 3b 0a 20 20 20  al_string();.   
add0: 20 20 20 20 20 20 20 20 20 63 78 2e 73 74 72 5f           cx.str_
ade0: 70 69 65 63 65 73 2e 70 75 73 68 28 73 29 3b 0a  pieces.push(s);.
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 63 78 2e 70              cx.p
ae00: 69 65 63 65 73 2e 70 75 73 68 28 70 69 65 63 65  ieces.push(piece
ae10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
ae20: 20 7d 0a 0a 20 20 20 20 69 66 20 21 63 78 2e 6c   }..    if !cx.l
ae30: 69 74 65 72 61 6c 2e 69 73 5f 65 6d 70 74 79 28  iteral.is_empty(
ae40: 29 20 7b 0a 20 20 20 20 20 20 20 20 6c 65 74 20  ) {.        let 
ae50: 73 20 3d 20 63 78 2e 62 75 69 6c 64 5f 6c 69 74  s = cx.build_lit
ae60: 65 72 61 6c 5f 73 74 72 69 6e 67 28 29 3b 0a 20  eral_string();. 
ae70: 20 20 20 20 20 20 20 63 78 2e 73 74 72 5f 70 69         cx.str_pi
ae80: 65 63 65 73 2e 70 75 73 68 28 73 29 3b 0a 20 20  eces.push(s);.  
ae90: 20 20 7d 0a 0a 20 20 20 20 69 66 20 63 78 2e 69    }..    if cx.i
aea0: 6e 76 61 6c 69 64 5f 72 65 66 73 2e 6c 65 6e 28  nvalid_refs.len(
aeb0: 29 20 3e 3d 20 31 20 7b 0a 20 20 20 20 20 20 20  ) >= 1 {.       
aec0: 20 63 78 2e 72 65 70 6f 72 74 5f 69 6e 76 61 6c   cx.report_inval
aed0: 69 64 5f 72 65 66 65 72 65 6e 63 65 73 28 6e 75  id_references(nu
aee0: 6d 62 65 72 65 64 5f 70 6f 73 69 74 69 6f 6e 5f  mbered_position_
aef0: 61 72 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  args);.    }..  
af00: 20 20 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 74    // Make sure t
af10: 68 61 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74  hat all argument
af20: 73 20 77 65 72 65 20 75 73 65 64 20 61 6e 64 20  s were used and 
af30: 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 68 61  all arguments ha
af40: 76 65 20 74 79 70 65 73 2e 0a 20 20 20 20 6c 65  ve types..    le
af50: 74 20 65 72 72 73 20 3d 20 63 78 2e 61 72 67 5f  t errs = cx.arg_
af60: 74 79 70 65 73 0a 20 20 20 20 20 20 20 20 20 20  types.          
af70: 20 20 20 20 20 20 20 2e 69 74 65 72 28 29 0a 20         .iter(). 
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af90: 2e 65 6e 75 6d 65 72 61 74 65 28 29 0a 20 20 20  .enumerate().   
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e 66                .f
afb0: 69 6c 74 65 72 28 7c 28 69 2c 20 74 79 29 7c 20  ilter(|(i, ty)| 
afc0: 74 79 2e 69 73 5f 65 6d 70 74 79 28 29 20 26 26  ty.is_empty() &&
afd0: 20 21 63 78 2e 63 6f 75 6e 74 5f 70 6f 73 69 74   !cx.count_posit
afe0: 69 6f 6e 73 2e 63 6f 6e 74 61 69 6e 73 5f 6b 65  ions.contains_ke
aff0: 79 28 26 69 29 29 0a 20 20 20 20 20 20 20 20 20  y(&i)).         
b000: 20 20 20 20 20 20 20 20 2e 6d 61 70 28 7c 28 69          .map(|(i
b010: 2c 20 5f 29 7c 20 7b 0a 20 20 20 20 20 20 20 20  , _)| {.        
b020: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
b030: 6d 73 67 20 3d 20 69 66 20 6e 61 6d 65 64 5f 70  msg = if named_p
b040: 6f 73 2e 63 6f 6e 74 61 69 6e 73 28 26 69 29 20  os.contains(&i) 
b050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
b060: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6e 61 6d            // nam
b070: 65 64 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  ed argument.    
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 20 20 22 6e 61 6d 65 64 20 61 72 67 75 6d      "named argum
b0a0: 65 6e 74 20 6e 65 76 65 72 20 75 73 65 64 22 0a  ent never used".
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0e0: 20 20 20 20 20 2f 2f 20 70 6f 73 69 74 69 6f 6e       // position
b0f0: 61 6c 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20  al argument.    
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 20 20 22 61 72 67 75 6d 65 6e 74 20 6e 65      "argument ne
b120: 76 65 72 20 75 73 65 64 22 0a 20 20 20 20 20 20  ver used".      
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 3b                };
b140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b150: 20 20 20 20 20 28 63 78 2e 61 72 67 73 5b 69 5d       (cx.args[i]
b160: 2e 73 70 61 6e 2c 20 6d 73 67 29 0a 20 20 20 20  .span, msg).    
b170: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 0a               }).
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56 65 63 3c   .collect::<Vec<
b1a0: 5f 3e 3e 28 29 3b 0a 0a 20 20 20 20 6c 65 74 20  _>>();..    let 
b1b0: 65 72 72 73 5f 6c 65 6e 20 3d 20 65 72 72 73 2e  errs_len = errs.
b1c0: 6c 65 6e 28 29 3b 0a 20 20 20 20 69 66 20 21 65  len();.    if !e
b1d0: 72 72 73 2e 69 73 5f 65 6d 70 74 79 28 29 20 7b  rrs.is_empty() {
b1e0: 0a 20 20 20 20 20 20 20 20 6c 65 74 20 61 72 67  .        let arg
b1f0: 73 5f 75 73 65 64 20 3d 20 63 78 2e 61 72 67 5f  s_used = cx.arg_
b200: 74 79 70 65 73 2e 6c 65 6e 28 29 20 2d 20 65 72  types.len() - er
b210: 72 73 5f 6c 65 6e 3b 0a 20 20 20 20 20 20 20 20  rs_len;.        
b220: 6c 65 74 20 61 72 67 73 5f 75 6e 75 73 65 64 20  let args_unused 
b230: 3d 20 65 72 72 73 5f 6c 65 6e 3b 0a 0a 20 20 20  = errs_len;..   
b240: 20 20 20 20 20 6c 65 74 20 6d 75 74 20 64 69 61       let mut dia
b250: 67 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  g = {.          
b260: 20 20 69 66 20 65 72 72 73 5f 6c 65 6e 20 3d 3d    if errs_len ==
b270: 20 31 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   1 {.           
b280: 20 20 20 20 20 6c 65 74 20 28 73 70 2c 20 6d 73       let (sp, ms
b290: 67 29 20 3d 20 65 72 72 73 2e 69 6e 74 6f 5f 69  g) = errs.into_i
b2a0: 74 65 72 28 29 2e 6e 65 78 74 28 29 2e 75 6e 77  ter().next().unw
b2b0: 72 61 70 28 29 3b 0a 20 20 20 20 20 20 20 20 20  rap();.         
b2c0: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 64         let mut d
b2d0: 69 61 67 20 3d 20 63 78 2e 65 63 78 2e 73 74 72  iag = cx.ecx.str
b2e0: 75 63 74 5f 73 70 61 6e 5f 65 72 72 28 73 70 2c  uct_span_err(sp,
b2f0: 20 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20   msg);.         
b300: 20 20 20 20 20 20 20 64 69 61 67 2e 73 70 61 6e         diag.span
b310: 5f 6c 61 62 65 6c 28 73 70 2c 20 6d 73 67 29 3b  _label(sp, msg);
b320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b330: 20 64 69 61 67 0a 20 20 20 20 20 20 20 20 20 20   diag.          
b340: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
b350: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
b360: 75 74 20 64 69 61 67 20 3d 20 63 78 2e 65 63 78  ut diag = cx.ecx
b370: 2e 73 74 72 75 63 74 5f 73 70 61 6e 5f 65 72 72  .struct_span_err
b380: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
b390: 20 20 20 20 20 20 65 72 72 73 2e 69 74 65 72 28        errs.iter(
b3a0: 29 2e 6d 61 70 28 7c 26 28 73 70 2c 20 5f 29 7c  ).map(|&(sp, _)|
b3b0: 20 73 70 29 2e 63 6f 6c 6c 65 63 74 3a 3a 3c 56   sp).collect::<V
b3c0: 65 63 3c 53 70 61 6e 3e 3e 28 29 2c 0a 20 20 20  ec<Span>>(),.   
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 22 6d 75 6c 74 69 70 6c 65 20 75 6e 75 73 65   "multiple unuse
b3f0: 64 20 66 6f 72 6d 61 74 74 69 6e 67 20 61 72 67  d formatting arg
b400: 75 6d 65 6e 74 73 22 2c 0a 20 20 20 20 20 20 20  uments",.       
b410: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
b420: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 61 67              diag
b430: 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 63 78 2e 66  .span_label(cx.f
b440: 6d 74 73 70 2c 20 22 6d 75 6c 74 69 70 6c 65 20  mtsp, "multiple 
b450: 6d 69 73 73 69 6e 67 20 66 6f 72 6d 61 74 74 69  missing formatti
b460: 6e 67 20 73 70 65 63 69 66 69 65 72 73 22 29 3b  ng specifiers");
b470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b480: 20 66 6f 72 20 28 73 70 2c 20 6d 73 67 29 20 69   for (sp, msg) i
b490: 6e 20 65 72 72 73 20 7b 0a 20 20 20 20 20 20 20  n errs {.       
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 61               dia
b4b0: 67 2e 73 70 61 6e 5f 6c 61 62 65 6c 28 73 70 2c  g.span_label(sp,
b4c0: 20 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20   msg);.         
b4d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b4e0: 20 20 20 20 20 20 20 20 20 64 69 61 67 0a 20 20           diag.  
b4f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
b500: 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20      };..        
b510: 2f 2f 20 55 73 65 64 20 74 6f 20 65 6e 73 75 72  // Used to ensur
b520: 65 20 77 65 20 6f 6e 6c 79 20 72 65 70 6f 72 74  e we only report
b530: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 73 20 66 6f   translations fo
b540: 72 20 2a 6f 6e 65 2a 20 6b 69 6e 64 20 6f 66 20  r *one* kind of 
b550: 66 6f 72 65 69 67 6e 20 66 6f 72 6d 61 74 2e 0a  foreign format..
b560: 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20          let mut 
b570: 66 6f 75 6e 64 5f 66 6f 72 65 69 67 6e 20 3d 20  found_foreign = 
b580: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 2f  false;.        /
b590: 2f 20 44 65 63 69 64 65 20 69 66 20 77 65 20 77  / Decide if we w
b5a0: 61 6e 74 20 74 6f 20 6c 6f 6f 6b 20 66 6f 72 20  ant to look for 
b5b0: 66 6f 72 65 69 67 6e 20 66 6f 72 6d 61 74 74 69  foreign formatti
b5c0: 6e 67 20 64 69 72 65 63 74 69 76 65 73 2e 0a 20  ng directives.. 
b5d0: 20 20 20 20 20 20 20 69 66 20 61 72 67 73 5f 75         if args_u
b5e0: 73 65 64 20 3c 20 61 72 67 73 5f 75 6e 75 73 65  sed < args_unuse
b5f0: 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d {.            
b600: 75 73 65 20 73 75 70 65 72 3a 3a 66 6f 72 6d 61  use super::forma
b610: 74 5f 66 6f 72 65 69 67 6e 20 61 73 20 66 6f 72  t_foreign as for
b620: 65 69 67 6e 3b 0a 0a 20 20 20 20 20 20 20 20 20  eign;..         
b630: 20 20 20 2f 2f 20 54 68 65 20 73 65 74 20 6f 66     // The set of
b640: 20 66 6f 72 65 69 67 6e 20 73 75 62 73 74 69 74   foreign substit
b650: 75 74 69 6f 6e 73 20 77 65 27 76 65 20 65 78 70  utions we've exp
b660: 6c 61 69 6e 65 64 2e 20 20 54 68 69 73 20 70 72  lained.  This pr
b670: 65 76 65 6e 74 73 20 73 70 61 6d 6d 69 6e 67 20  events spamming 
b680: 74 68 65 20 75 73 65 72 0a 20 20 20 20 20 20 20  the user.       
b690: 20 20 20 20 20 2f 2f 20 77 69 74 68 20 60 25 64       // with `%d
b6a0: 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
b6b0: 65 6e 20 61 73 20 7b 7d 60 20 6f 76 65 72 20 61  en as {}` over a
b6c0: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 2e 0a 20  nd over again.. 
b6d0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
b6e0: 75 74 20 65 78 70 6c 61 69 6e 65 64 20 3d 20 46  ut explained = F
b6f0: 78 48 61 73 68 53 65 74 3a 3a 64 65 66 61 75 6c  xHashSet::defaul
b700: 74 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  t();..          
b710: 20 20 6d 61 63 72 6f 5f 72 75 6c 65 73 21 20 63    macro_rules! c
b720: 68 65 63 6b 5f 66 6f 72 65 69 67 6e 20 7b 0a 20  heck_foreign {. 
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
b740: 24 6b 69 6e 64 3a 69 64 65 6e 74 29 20 3d 3e 20  $kind:ident) => 
b750: 7b 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  {{.             
b760: 20 20 20 20 20 20 20 6c 65 74 20 6d 75 74 20 73         let mut s
b770: 68 6f 77 5f 64 6f 63 5f 6e 6f 74 65 20 3d 20 66  how_doc_note = f
b780: 61 6c 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 20  alse;..         
b790: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d             let m
b7a0: 75 74 20 73 75 67 67 65 73 74 69 6f 6e 73 20 3d  ut suggestions =
b7b0: 20 76 65 63 21 5b 5d 3b 0a 20 20 20 20 20 20 20   vec![];.       
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
b7d0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 60 22 60 20  account for `"` 
b7e0: 61 6e 64 20 61 63 63 6f 75 6e 74 20 66 6f 72 20  and account for 
b7f0: 72 61 77 20 73 74 72 69 6e 67 73 20 60 72 23 60  raw strings `r#`
b800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b810: 20 20 20 20 20 6c 65 74 20 70 61 64 64 69 6e 67       let padding
b820: 20 3d 20 73 74 72 5f 73 74 79 6c 65 2e 6d 61 70   = str_style.map
b830: 28 7c 69 7c 20 69 20 2b 20 32 29 2e 75 6e 77 72  (|i| i + 2).unwr
b840: 61 70 5f 6f 72 28 31 29 3b 0a 20 20 20 20 20 20  ap_or(1);.      
b850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f                fo
b860: 72 20 73 75 62 20 69 6e 20 66 6f 72 65 69 67 6e  r sub in foreign
b870: 3a 3a 24 6b 69 6e 64 3a 3a 69 74 65 72 5f 73 75  ::$kind::iter_su
b880: 62 73 28 66 6d 74 5f 73 74 72 2c 20 70 61 64 64  bs(fmt_str, padd
b890: 69 6e 67 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ing) {.         
b8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
b8b0: 65 74 20 74 72 6e 20 3d 20 6d 61 74 63 68 20 73  et trn = match s
b8c0: 75 62 2e 74 72 61 6e 73 6c 61 74 65 28 29 20 7b  ub.translate() {
b8d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 6f 6d               Som
b8f0: 65 28 74 72 6e 29 20 3d 3e 20 74 72 6e 2c 0a 0a  e(trn) => trn,..
b900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b910: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 49              // I
b920: 66 20 69 74 20 68 61 73 20 6e 6f 20 74 72 61 6e  f it has no tran
b930: 73 6c 61 74 69 6f 6e 2c 20 64 6f 6e 27 74 20 63  slation, don't c
b940: 61 6c 6c 20 69 74 20 6f 75 74 20 73 70 65 63 69  all it out speci
b950: 66 69 63 61 6c 6c 79 2e 0a 20 20 20 20 20 20 20  fically..       
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b970: 20 20 20 20 20 4e 6f 6e 65 20 3d 3e 20 63 6f 6e       None => con
b980: 74 69 6e 75 65 2c 0a 20 20 20 20 20 20 20 20 20  tinue,.         
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
b9a0: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
b9b0: 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 70             let p
b9c0: 6f 73 20 3d 20 73 75 62 2e 70 6f 73 69 74 69 6f  os = sub.positio
b9d0: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n();.           
b9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
b9f0: 20 73 75 62 20 3d 20 53 74 72 69 6e 67 3a 3a 66   sub = String::f
ba00: 72 6f 6d 28 73 75 62 2e 61 73 5f 73 74 72 28 29  rom(sub.as_str()
ba10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
ba20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 65 78             if ex
ba30: 70 6c 61 69 6e 65 64 2e 63 6f 6e 74 61 69 6e 73  plained.contains
ba40: 28 26 73 75 62 29 20 7b 0a 20 20 20 20 20 20 20  (&sub) {.       
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
ba70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
baa0: 20 65 78 70 6c 61 69 6e 65 64 2e 69 6e 73 65 72   explained.inser
bab0: 74 28 73 75 62 2e 63 6c 6f 6e 65 28 29 29 3b 0a  t(sub.clone());.
bac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bad0: 20 20 20 20 20 20 20 20 20 69 66 20 21 66 6f 75           if !fou
bae0: 6e 64 5f 66 6f 72 65 69 67 6e 20 7b 0a 20 20 20  nd_foreign {.   
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb00: 20 20 20 20 20 20 20 20 20 66 6f 75 6e 64 5f 66           found_f
bb10: 6f 72 65 69 67 6e 20 3d 20 74 72 75 65 3b 0a 20  oreign = true;. 
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb30: 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77 5f             show_
bb40: 64 6f 63 5f 6e 6f 74 65 20 3d 20 74 72 75 65 3b  doc_note = true;
bb50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bb60: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 69 66 20 6c 65 74 20 53 6f 6d 65 28      if let Some(
bb90: 69 6e 6e 65 72 5f 73 70 29 20 3d 20 70 6f 73 20  inner_sp) = pos 
bba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65                le
bbc0: 74 20 73 70 20 3d 20 66 6d 74 5f 73 70 2e 66 72  t sp = fmt_sp.fr
bbd0: 6f 6d 5f 69 6e 6e 65 72 28 69 6e 6e 65 72 5f 73  om_inner(inner_s
bbe0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc00: 73 75 67 67 65 73 74 69 6f 6e 73 2e 70 75 73 68  suggestions.push
bc10: 28 28 73 70 2c 20 74 72 6e 29 29 3b 0a 20 20 20  ((sp, trn));.   
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 20 20 20 20 20 20 64 69 61 67 2e 68            diag.h
bc60: 65 6c 70 28 26 66 6f 72 6d 61 74 21 28 22 60 7b  elp(&format!("`{
bc70: 7d 60 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  }` should be wri
bc80: 74 74 65 6e 20 61 73 20 60 7b 7d 60 22 2c 20 73  tten as `{}`", s
bc90: 75 62 2c 20 74 72 6e 29 29 3b 0a 20 20 20 20 20  ub, trn));.     
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
bcc0: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 69 66 20 73 68 6f 77 5f 64 6f 63 5f 6e 6f 74 65  if show_doc_note
bcf0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
bd00: 20 20 20 20 20 20 20 20 20 20 20 64 69 61 67 2e             diag.
bd10: 6e 6f 74 65 28 63 6f 6e 63 61 74 21 28 0a 20 20  note(concat!(.  
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 20 20 20 20 20 20 20 73 74 72 69 6e 67            string
bd40: 69 66 79 21 28 24 6b 69 6e 64 29 2c 0a 20 20 20  ify!($kind),.   
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd60: 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 6d 61           " forma
bd70: 74 74 69 6e 67 20 6e 6f 74 20 73 75 70 70 6f 72  tting not suppor
bd80: 74 65 64 3b 20 73 65 65 20 74 68 65 20 64 6f 63  ted; see the doc
bd90: 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 60  umentation for `
bda0: 73 74 64 3a 3a 66 6d 74 60 22 2c 0a 20 20 20 20  std::fmt`",.    
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20      ));.        
bdd0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdf0: 20 20 69 66 20 73 75 67 67 65 73 74 69 6f 6e 73    if suggestions
be00: 2e 6c 65 6e 28 29 20 3e 20 30 20 7b 0a 20 20 20  .len() > 0 {.   
be10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be20: 20 20 20 20 20 64 69 61 67 2e 6d 75 6c 74 69 70       diag.multip
be30: 61 72 74 5f 73 75 67 67 65 73 74 69 6f 6e 28 0a  art_suggestion(.
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 22 66 6f 72              "for
be60: 6d 61 74 20 73 70 65 63 69 66 69 65 72 73 20 75  mat specifiers u
be70: 73 65 20 63 75 72 6c 79 20 62 72 61 63 65 73 22  se curly braces"
be80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 75                su
bea0: 67 67 65 73 74 69 6f 6e 73 2c 0a 20 20 20 20 20  ggestions,.     
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bec0: 20 20 20 20 20 20 20 41 70 70 6c 69 63 61 62 69         Applicabi
bed0: 6c 69 74 79 3a 3a 4d 61 63 68 69 6e 65 41 70 70  lity::MachineApp
bee0: 6c 69 63 61 62 6c 65 2c 0a 20 20 20 20 20 20 20  licable,.       
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
bf10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
bf20: 20 20 20 20 20 20 20 20 20 20 7d 7d 3b 0a 20 20            }};.  
bf30: 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
bf40: 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 5f 66           check_f
bf50: 6f 72 65 69 67 6e 21 28 70 72 69 6e 74 66 29 3b  oreign!(printf);
bf60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
bf70: 21 66 6f 75 6e 64 5f 66 6f 72 65 69 67 6e 20 7b  !found_foreign {
bf80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf90: 20 63 68 65 63 6b 5f 66 6f 72 65 69 67 6e 21 28   check_foreign!(
bfa0: 73 68 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  shell);.        
bfb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
bfc0: 20 20 20 20 20 20 20 20 69 66 20 21 66 6f 75 6e          if !foun
bfd0: 64 5f 66 6f 72 65 69 67 6e 20 26 26 20 65 72 72  d_foreign && err
bfe0: 73 5f 6c 65 6e 20 3d 3d 20 31 20 7b 0a 20 20 20  s_len == 1 {.   
bff0: 20 20 20 20 20 20 20 20 20 64 69 61 67 2e 73 70           diag.sp
c000: 61 6e 5f 6c 61 62 65 6c 28 63 78 2e 66 6d 74 73  an_label(cx.fmts
c010: 70 2c 20 22 66 6f 72 6d 61 74 74 69 6e 67 20 73  p, "formatting s
c020: 70 65 63 69 66 69 65 72 20 6d 69 73 73 69 6e 67  pecifier missing
c030: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ");.        }.. 
c040: 20 20 20 20 20 20 20 64 69 61 67 2e 65 6d 69 74         diag.emit
c050: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ();.    }..    c
c060: 78 2e 69 6e 74 6f 5f 65 78 70 72 28 29 0a 7d 0a  x.into_expr().}.