Hex Artifact Content
Not logged in

Artifact 9fccdbf96a67453b315961c62ca7be7caee0daaa:

Unrecognized artifact
0000: 2f 2f 20 43 6f 70 79 72 69 67 68 74 20 32 30 31  // Copyright 201
0010: 34 20 54 68 65 20 52 75 73 74 20 50 72 6f 6a 65  4 The Rust Proje
0020: 63 74 20 44 65 76 65 6c 6f 70 65 72 73 2e 20 53  ct Developers. S
0030: 65 65 20 74 68 65 20 43 4f 50 59 52 49 47 48 54  ee the COPYRIGHT
0040: 0a 2f 2f 20 66 69 6c 65 20 61 74 20 74 68 65 20  .// file at the 
0050: 74 6f 70 2d 6c 65 76 65 6c 20 64 69 72 65 63 74  top-level direct
0060: 6f 72 79 20 6f 66 20 74 68 69 73 20 64 69 73 74  ory of this dist
0070: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 61 74 0a  ribution and at.
0080: 2f 2f 20 68 74 74 70 3a 2f 2f 72 75 73 74 2d 6c  // http://rust-l
0090: 61 6e 67 2e 6f 72 67 2f 43 4f 50 59 52 49 47 48  ang.org/COPYRIGH
00a0: 54 2e 0a 2f 2f 0a 2f 2f 20 4c 69 63 65 6e 73 65  T..//.// License
00b0: 64 20 75 6e 64 65 72 20 74 68 65 20 41 70 61 63  d under the Apac
00c0: 68 65 20 4c 69 63 65 6e 73 65 2c 20 56 65 72 73  he License, Vers
00d0: 69 6f 6e 20 32 2e 30 20 3c 4c 49 43 45 4e 53 45  ion 2.0 <LICENSE
00e0: 2d 41 50 41 43 48 45 20 6f 72 0a 2f 2f 20 68 74  -APACHE or.// ht
00f0: 74 70 3a 2f 2f 77 77 77 2e 61 70 61 63 68 65 2e  tp://www.apache.
0100: 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4c 49 43  org/licenses/LIC
0110: 45 4e 53 45 2d 32 2e 30 3e 20 6f 72 20 74 68 65  ENSE-2.0> or the
0120: 20 4d 49 54 20 6c 69 63 65 6e 73 65 0a 2f 2f 20   MIT license.// 
0130: 3c 4c 49 43 45 4e 53 45 2d 4d 49 54 20 6f 72 20  <LICENSE-MIT or 
0140: 68 74 74 70 3a 2f 2f 6f 70 65 6e 73 6f 75 72 63  http://opensourc
0150: 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4d  e.org/licenses/M
0160: 49 54 3e 2c 20 61 74 20 79 6f 75 72 0a 2f 2f 20  IT>, at your.// 
0170: 6f 70 74 69 6f 6e 2e 20 54 68 69 73 20 66 69 6c  option. This fil
0180: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 63 6f 70  e may not be cop
0190: 69 65 64 2c 20 6d 6f 64 69 66 69 65 64 2c 20 6f  ied, modified, o
01a0: 72 20 64 69 73 74 72 69 62 75 74 65 64 0a 2f 2f  r distributed.//
01b0: 20 65 78 63 65 70 74 20 61 63 63 6f 72 64 69 6e   except accordin
01c0: 67 20 74 6f 20 74 68 6f 73 65 20 74 65 72 6d 73  g to those terms
01d0: 2e 0a 0a 75 73 65 20 64 65 72 69 76 69 6e 67 3a  ...use deriving:
01e0: 3a 70 61 74 68 5f 73 74 64 3b 0a 75 73 65 20 64  :path_std;.use d
01f0: 65 72 69 76 69 6e 67 3a 3a 67 65 6e 65 72 69 63  eriving::generic
0200: 3a 3a 2a 3b 0a 75 73 65 20 64 65 72 69 76 69 6e  ::*;.use derivin
0210: 67 3a 3a 67 65 6e 65 72 69 63 3a 3a 74 79 3a 3a  g::generic::ty::
0220: 2a 3b 0a 0a 75 73 65 20 73 79 6e 74 61 78 3a 3a  *;..use syntax::
0230: 61 73 74 3a 3a 7b 73 65 6c 66 2c 20 49 64 65 6e  ast::{self, Iden
0240: 74 7d 3b 0a 75 73 65 20 73 79 6e 74 61 78 3a 3a  t};.use syntax::
0250: 61 73 74 3a 3a 7b 45 78 70 72 2c 20 4d 65 74 61  ast::{Expr, Meta
0260: 49 74 65 6d 7d 3b 0a 75 73 65 20 73 79 6e 74 61  Item};.use synta
0270: 78 3a 3a 65 78 74 3a 3a 62 61 73 65 3a 3a 7b 41  x::ext::base::{A
0280: 6e 6e 6f 74 61 74 61 62 6c 65 2c 20 45 78 74 43  nnotatable, ExtC
0290: 74 78 74 7d 3b 0a 75 73 65 20 73 79 6e 74 61 78  txt};.use syntax
02a0: 3a 3a 65 78 74 3a 3a 62 75 69 6c 64 3a 3a 41 73  ::ext::build::As
02b0: 74 42 75 69 6c 64 65 72 3b 0a 75 73 65 20 73 79  tBuilder;.use sy
02c0: 6e 74 61 78 3a 3a 70 74 72 3a 3a 50 3b 0a 75 73  ntax::ptr::P;.us
02d0: 65 20 73 79 6e 74 61 78 5f 70 6f 73 3a 3a 7b 44  e syntax_pos::{D
02e0: 55 4d 4d 59 5f 53 50 2c 20 53 70 61 6e 7d 3b 0a  UMMY_SP, Span};.
02f0: 0a 70 75 62 20 66 6e 20 65 78 70 61 6e 64 5f 64  .pub fn expand_d
0300: 65 72 69 76 69 6e 67 5f 64 65 62 75 67 28 63 78  eriving_debug(cx
0310: 3a 20 26 6d 75 74 20 45 78 74 43 74 78 74 2c 0a  : &mut ExtCtxt,.
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70 61               spa
0340: 6e 3a 20 53 70 61 6e 2c 0a 20 20 20 20 20 20 20  n: Span,.       
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 20 20 20 20 20 20 6d 69 74 65 6d 3a 20 26 4d 65        mitem: &Me
0370: 74 61 49 74 65 6d 2c 0a 20 20 20 20 20 20 20 20  taItem,.        
0380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0390: 20 20 20 20 20 69 74 65 6d 3a 20 26 41 6e 6e 6f       item: &Anno
03a0: 74 61 74 61 62 6c 65 2c 0a 20 20 20 20 20 20 20  tatable,.       
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03c0: 20 20 20 20 20 20 70 75 73 68 3a 20 26 6d 75 74        push: &mut
03d0: 20 46 6e 4d 75 74 28 41 6e 6e 6f 74 61 74 61 62   FnMut(Annotatab
03e0: 6c 65 29 29 20 7b 0a 20 20 20 20 2f 2f 20 26 6d  le)) {.    // &m
03f0: 75 74 20 3a 3a 73 74 64 3a 3a 66 6d 74 3a 3a 46  ut ::std::fmt::F
0400: 6f 72 6d 61 74 74 65 72 0a 20 20 20 20 6c 65 74  ormatter.    let
0410: 20 66 6d 74 72 20 3d 20 50 74 72 28 42 6f 78 3a   fmtr = Ptr(Box:
0420: 3a 6e 65 77 28 4c 69 74 65 72 61 6c 28 70 61 74  :new(Literal(pat
0430: 68 5f 73 74 64 21 28 63 78 2c 20 66 6d 74 3a 3a  h_std!(cx, fmt::
0440: 46 6f 72 6d 61 74 74 65 72 29 29 29 2c 0a 20 20  Formatter))),.  
0450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0460: 20 42 6f 72 72 6f 77 65 64 28 4e 6f 6e 65 2c 20   Borrowed(None, 
0470: 61 73 74 3a 3a 4d 75 74 61 62 69 6c 69 74 79 3a  ast::Mutability:
0480: 3a 4d 75 74 61 62 6c 65 29 29 3b 0a 0a 20 20 20  :Mutable));..   
0490: 20 6c 65 74 20 74 72 61 69 74 5f 64 65 66 20 3d   let trait_def =
04a0: 20 54 72 61 69 74 44 65 66 20 7b 0a 20 20 20 20   TraitDef {.    
04b0: 20 20 20 20 73 70 61 6e 2c 0a 20 20 20 20 20 20      span,.      
04c0: 20 20 61 74 74 72 69 62 75 74 65 73 3a 20 56 65    attributes: Ve
04d0: 63 3a 3a 6e 65 77 28 29 2c 0a 20 20 20 20 20 20  c::new(),.      
04e0: 20 20 70 61 74 68 3a 20 70 61 74 68 5f 73 74 64    path: path_std
04f0: 21 28 63 78 2c 20 66 6d 74 3a 3a 44 65 62 75 67  !(cx, fmt::Debug
0500: 29 2c 0a 20 20 20 20 20 20 20 20 61 64 64 69 74  ),.        addit
0510: 69 6f 6e 61 6c 5f 62 6f 75 6e 64 73 3a 20 56 65  ional_bounds: Ve
0520: 63 3a 3a 6e 65 77 28 29 2c 0a 20 20 20 20 20 20  c::new(),.      
0530: 20 20 67 65 6e 65 72 69 63 73 3a 20 4c 69 66 65    generics: Life
0540: 74 69 6d 65 42 6f 75 6e 64 73 3a 3a 65 6d 70 74  timeBounds::empt
0550: 79 28 29 2c 0a 20 20 20 20 20 20 20 20 69 73 5f  y(),.        is_
0560: 75 6e 73 61 66 65 3a 20 66 61 6c 73 65 2c 0a 20  unsafe: false,. 
0570: 20 20 20 20 20 20 20 73 75 70 70 6f 72 74 73 5f         supports_
0580: 75 6e 69 6f 6e 73 3a 20 66 61 6c 73 65 2c 0a 20  unions: false,. 
0590: 20 20 20 20 20 20 20 6d 65 74 68 6f 64 73 3a 20         methods: 
05a0: 76 65 63 21 5b 4d 65 74 68 6f 64 44 65 66 20 7b  vec![MethodDef {
05b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
05c0: 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 3a             name:
05d0: 20 22 66 6d 74 22 2c 0a 20 20 20 20 20 20 20 20   "fmt",.        
05e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05f0: 20 20 67 65 6e 65 72 69 63 73 3a 20 4c 69 66 65    generics: Life
0600: 74 69 6d 65 42 6f 75 6e 64 73 3a 3a 65 6d 70 74  timeBounds::empt
0610: 79 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  y(),.           
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
0630: 78 70 6c 69 63 69 74 5f 73 65 6c 66 3a 20 62 6f  xplicit_self: bo
0640: 72 72 6f 77 65 64 5f 65 78 70 6c 69 63 69 74 5f  rrowed_explicit_
0650: 73 65 6c 66 28 29 2c 0a 20 20 20 20 20 20 20 20  self(),.        
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0670: 20 20 61 72 67 73 3a 20 76 65 63 21 5b 66 6d 74    args: vec![fmt
0680: 72 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  r],.            
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
06a0: 74 5f 74 79 3a 20 4c 69 74 65 72 61 6c 28 70 61  t_ty: Literal(pa
06b0: 74 68 5f 73 74 64 21 28 63 78 2c 20 66 6d 74 3a  th_std!(cx, fmt:
06c0: 3a 52 65 73 75 6c 74 29 29 2c 0a 20 20 20 20 20  :Result)),.     
06d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06e0: 20 20 20 20 20 61 74 74 72 69 62 75 74 65 73 3a       attributes:
06f0: 20 56 65 63 3a 3a 6e 65 77 28 29 2c 0a 20 20 20   Vec::new(),.   
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 20 20 20 20 20 20 20 69 73 5f 75 6e 73 61 66 65         is_unsafe
0720: 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  : false,.       
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 75 6e 69 66 79 5f 66 69 65 6c 64 6c 65     unify_fieldle
0750: 73 73 5f 76 61 72 69 61 6e 74 73 3a 20 66 61 6c  ss_variants: fal
0760: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
0770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0780: 6d 62 69 6e 65 5f 73 75 62 73 74 72 75 63 74 75  mbine_substructu
0790: 72 65 3a 20 63 6f 6d 62 69 6e 65 5f 73 75 62 73  re: combine_subs
07a0: 74 72 75 63 74 75 72 65 28 42 6f 78 3a 3a 6e 65  tructure(Box::ne
07b0: 77 28 7c 61 2c 20 62 2c 20 63 7c 20 7b 0a 20 20  w(|a, b, c| {.  
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
07e0: 5f 73 75 62 73 74 72 75 63 74 75 72 65 28 61 2c  _substructure(a,
07f0: 20 62 2c 20 63 29 0a 20 20 20 20 20 20 20 20 20   b, c).         
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 7d 29 29 2c 0a 20 20 20 20 20 20 20 20 20 20   })),.          
0820: 20 20 20 20 20 20 20 20 20 20 20 20 7d 5d 2c 0a              }],.
0830: 20 20 20 20 20 20 20 20 61 73 73 6f 63 69 61 74          associat
0840: 65 64 5f 74 79 70 65 73 3a 20 56 65 63 3a 3a 6e  ed_types: Vec::n
0850: 65 77 28 29 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  ew(),.    };.   
0860: 20 74 72 61 69 74 5f 64 65 66 2e 65 78 70 61 6e   trait_def.expan
0870: 64 28 63 78 2c 20 6d 69 74 65 6d 2c 20 69 74 65  d(cx, mitem, ite
0880: 6d 2c 20 70 75 73 68 29 0a 7d 0a 0a 2f 2f 2f 20  m, push).}../// 
0890: 57 65 20 75 73 65 20 74 68 65 20 64 65 62 75 67  We use the debug
08a0: 20 62 75 69 6c 64 65 72 73 20 74 6f 20 64 6f 20   builders to do 
08b0: 74 68 65 20 68 65 61 76 79 20 6c 69 66 74 69 6e  the heavy liftin
08c0: 67 20 68 65 72 65 0a 66 6e 20 73 68 6f 77 5f 73  g here.fn show_s
08d0: 75 62 73 74 72 75 63 74 75 72 65 28 63 78 3a 20  ubstructure(cx: 
08e0: 26 6d 75 74 20 45 78 74 43 74 78 74 2c 20 73 70  &mut ExtCtxt, sp
08f0: 61 6e 3a 20 53 70 61 6e 2c 20 73 75 62 73 74 72  an: Span, substr
0900: 3a 20 26 53 75 62 73 74 72 75 63 74 75 72 65 29  : &Substructure)
0910: 20 2d 3e 20 50 3c 45 78 70 72 3e 20 7b 0a 20 20   -> P<Expr> {.  
0920: 20 20 2f 2f 20 62 75 69 6c 64 20 66 6d 74 2e 64    // build fmt.d
0930: 65 62 75 67 5f 73 74 72 75 63 74 28 3c 6e 61 6d  ebug_struct(<nam
0940: 65 3e 29 2e 66 69 65 6c 64 28 3c 66 69 65 6c 64  e>).field(<field
0950: 6e 61 6d 65 3e 2c 20 26 3c 66 69 65 6c 64 76 61  name>, &<fieldva
0960: 6c 3e 29 2e 2e 2e 2e 62 75 69 6c 64 28 29 0a 20  l>)....build(). 
0970: 20 20 20 2f 2f 20 6f 72 20 66 6d 74 2e 64 65 62     // or fmt.deb
0980: 75 67 5f 74 75 70 6c 65 28 3c 6e 61 6d 65 3e 29  ug_tuple(<name>)
0990: 2e 66 69 65 6c 64 28 26 3c 66 69 65 6c 64 76 61  .field(&<fieldva
09a0: 6c 3e 29 2e 2e 2e 2e 62 75 69 6c 64 28 29 0a 20  l>)....build(). 
09b0: 20 20 20 2f 2f 20 62 61 73 65 64 20 6f 6e 20 74     // based on t
09c0: 68 65 20 22 73 68 61 70 65 22 2e 0a 20 20 20 20  he "shape"..    
09d0: 6c 65 74 20 28 69 64 65 6e 74 2c 20 69 73 5f 73  let (ident, is_s
09e0: 74 72 75 63 74 29 20 3d 20 6d 61 74 63 68 20 2a  truct) = match *
09f0: 73 75 62 73 74 72 2e 66 69 65 6c 64 73 20 7b 0a  substr.fields {.
0a00: 20 20 20 20 20 20 20 20 53 74 72 75 63 74 28 76          Struct(v
0a10: 64 61 74 61 2c 20 5f 29 20 3d 3e 20 28 73 75 62  data, _) => (sub
0a20: 73 74 72 2e 74 79 70 65 5f 69 64 65 6e 74 2c 20  str.type_ident, 
0a30: 76 64 61 74 61 2e 69 73 5f 73 74 72 75 63 74 28  vdata.is_struct(
0a40: 29 29 2c 0a 20 20 20 20 20 20 20 20 45 6e 75 6d  )),.        Enum
0a50: 4d 61 74 63 68 69 6e 67 28 5f 2c 20 5f 2c 20 76  Matching(_, _, v
0a60: 2c 20 5f 29 20 3d 3e 20 28 76 2e 6e 6f 64 65 2e  , _) => (v.node.
0a70: 6e 61 6d 65 2c 20 76 2e 6e 6f 64 65 2e 64 61 74  name, v.node.dat
0a80: 61 2e 69 73 5f 73 74 72 75 63 74 28 29 29 2c 0a  a.is_struct()),.
0a90: 20 20 20 20 20 20 20 20 45 6e 75 6d 4e 6f 6e 4d          EnumNonM
0aa0: 61 74 63 68 69 6e 67 43 6f 6c 6c 61 70 73 65 64  atchingCollapsed
0ab0: 28 2e 2e 29 20 7c 0a 20 20 20 20 20 20 20 20 53  (..) |.        S
0ac0: 74 61 74 69 63 53 74 72 75 63 74 28 2e 2e 29 20  taticStruct(..) 
0ad0: 7c 0a 20 20 20 20 20 20 20 20 53 74 61 74 69 63  |.        Static
0ae0: 45 6e 75 6d 28 2e 2e 29 20 3d 3e 20 63 78 2e 73  Enum(..) => cx.s
0af0: 70 61 6e 5f 62 75 67 28 73 70 61 6e 2c 20 22 6e  pan_bug(span, "n
0b00: 6f 6e 73 65 6e 73 69 63 61 6c 20 2e 66 69 65 6c  onsensical .fiel
0b10: 64 73 20 69 6e 20 60 23 5b 64 65 72 69 76 65 28  ds in `#[derive(
0b20: 44 65 62 75 67 29 5d 60 22 29 2c 0a 20 20 20 20  Debug)]`"),.    
0b30: 7d 3b 0a 0a 20 20 20 20 2f 2f 20 57 65 20 77 61  };..    // We wa
0b40: 6e 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  nt to make sure 
0b50: 77 65 20 68 61 76 65 20 74 68 65 20 63 74 78 74  we have the ctxt
0b60: 20 73 65 74 20 73 6f 20 74 68 61 74 20 77 65 20   set so that we 
0b70: 63 61 6e 20 75 73 65 20 75 6e 73 74 61 62 6c 65  can use unstable
0b80: 20 6d 65 74 68 6f 64 73 0a 20 20 20 20 6c 65 74   methods.    let
0b90: 20 73 70 61 6e 20 3d 20 73 70 61 6e 2e 77 69 74   span = span.wit
0ba0: 68 5f 63 74 78 74 28 63 78 2e 62 61 63 6b 74 72  h_ctxt(cx.backtr
0bb0: 61 63 65 28 29 29 3b 0a 20 20 20 20 6c 65 74 20  ace());.    let 
0bc0: 6e 61 6d 65 20 3d 20 63 78 2e 65 78 70 72 5f 6c  name = cx.expr_l
0bd0: 69 74 28 73 70 61 6e 2c 20 61 73 74 3a 3a 4c 69  it(span, ast::Li
0be0: 74 4b 69 6e 64 3a 3a 53 74 72 28 69 64 65 6e 74  tKind::Str(ident
0bf0: 2e 6e 61 6d 65 2c 20 61 73 74 3a 3a 53 74 72 53  .name, ast::StrS
0c00: 74 79 6c 65 3a 3a 43 6f 6f 6b 65 64 29 29 3b 0a  tyle::Cooked));.
0c10: 20 20 20 20 6c 65 74 20 62 75 69 6c 64 65 72 20      let builder 
0c20: 3d 20 49 64 65 6e 74 3a 3a 66 72 6f 6d 5f 73 74  = Ident::from_st
0c30: 72 28 22 5f 5f 64 65 62 75 67 5f 74 72 61 69 74  r("__debug_trait
0c40: 5f 62 75 69 6c 64 65 72 22 29 3b 0a 20 20 20 20  _builder");.    
0c50: 6c 65 74 20 62 75 69 6c 64 65 72 5f 65 78 70 72  let builder_expr
0c60: 20 3d 20 63 78 2e 65 78 70 72 5f 69 64 65 6e 74   = cx.expr_ident
0c70: 28 73 70 61 6e 2c 20 62 75 69 6c 64 65 72 2e 63  (span, builder.c
0c80: 6c 6f 6e 65 28 29 29 3b 0a 0a 20 20 20 20 6c 65  lone());..    le
0c90: 74 20 66 6d 74 20 3d 20 73 75 62 73 74 72 2e 6e  t fmt = substr.n
0ca0: 6f 6e 73 65 6c 66 5f 61 72 67 73 5b 30 5d 2e 63  onself_args[0].c
0cb0: 6c 6f 6e 65 28 29 3b 0a 0a 20 20 20 20 6c 65 74  lone();..    let
0cc0: 20 6d 75 74 20 73 74 6d 74 73 20 3d 20 6d 61 74   mut stmts = mat
0cd0: 63 68 20 2a 73 75 62 73 74 72 2e 66 69 65 6c 64  ch *substr.field
0ce0: 73 20 7b 0a 20 20 20 20 20 20 20 20 53 74 72 75  s {.        Stru
0cf0: 63 74 28 5f 2c 20 72 65 66 20 66 69 65 6c 64 73  ct(_, ref fields
0d00: 29 20 7c 0a 20 20 20 20 20 20 20 20 45 6e 75 6d  ) |.        Enum
0d10: 4d 61 74 63 68 69 6e 67 28 2e 2e 2c 20 72 65 66  Matching(.., ref
0d20: 20 66 69 65 6c 64 73 29 20 3d 3e 20 7b 0a 20 20   fields) => {.  
0d30: 20 20 20 20 20 20 20 20 20 20 6c 65 74 20 6d 75            let mu
0d40: 74 20 73 74 6d 74 73 20 3d 20 76 65 63 21 5b 5d  t stmts = vec![]
0d50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
0d60: 20 21 69 73 5f 73 74 72 75 63 74 20 7b 0a 20 20   !is_struct {.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
0d80: 20 74 75 70 6c 65 20 73 74 72 75 63 74 2f 22 6e   tuple struct/"n
0d90: 6f 72 6d 61 6c 22 20 76 61 72 69 61 6e 74 0a 20  ormal" variant. 
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
0db0: 65 74 20 65 78 70 72 20 3d 0a 20 20 20 20 20 20  et expr =.      
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 78                cx
0dd0: 2e 65 78 70 72 5f 6d 65 74 68 6f 64 5f 63 61 6c  .expr_method_cal
0de0: 6c 28 73 70 61 6e 2c 20 66 6d 74 2c 20 49 64 65  l(span, fmt, Ide
0df0: 6e 74 3a 3a 66 72 6f 6d 5f 73 74 72 28 22 64 65  nt::from_str("de
0e00: 62 75 67 5f 74 75 70 6c 65 22 29 2c 20 76 65 63  bug_tuple"), vec
0e10: 21 5b 6e 61 6d 65 5d 29 3b 0a 20 20 20 20 20 20  ![name]);.      
0e20: 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 73 2e            stmts.
0e30: 70 75 73 68 28 63 78 2e 73 74 6d 74 5f 6c 65 74  push(cx.stmt_let
0e40: 28 44 55 4d 4d 59 5f 53 50 2c 20 74 72 75 65 2c  (DUMMY_SP, true,
0e50: 20 62 75 69 6c 64 65 72 2c 20 65 78 70 72 29 29   builder, expr))
0e60: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
0e70: 20 20 20 66 6f 72 20 66 69 65 6c 64 20 69 6e 20     for field in 
0e80: 66 69 65 6c 64 73 20 7b 0a 20 20 20 20 20 20 20  fields {.       
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
0ea0: 55 73 65 20 64 6f 75 62 6c 65 20 69 6e 64 69 72  Use double indir
0eb0: 65 63 74 69 6f 6e 20 74 6f 20 6d 61 6b 65 20 73  ection to make s
0ec0: 75 72 65 20 74 68 69 73 20 77 6f 72 6b 73 20 66  ure this works f
0ed0: 6f 72 20 75 6e 73 69 7a 65 64 20 74 79 70 65 73  or unsized types
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ef0: 20 20 20 20 20 6c 65 74 20 66 69 65 6c 64 20 3d       let field =
0f00: 20 63 78 2e 65 78 70 72 5f 61 64 64 72 5f 6f 66   cx.expr_addr_of
0f10: 28 66 69 65 6c 64 2e 73 70 61 6e 2c 20 66 69 65  (field.span, fie
0f20: 6c 64 2e 73 65 6c 66 5f 2e 63 6c 6f 6e 65 28 29  ld.self_.clone()
0f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0f40: 20 20 20 20 20 20 20 6c 65 74 20 66 69 65 6c 64         let field
0f50: 20 3d 20 63 78 2e 65 78 70 72 5f 61 64 64 72 5f   = cx.expr_addr_
0f60: 6f 66 28 66 69 65 6c 64 2e 73 70 61 6e 2c 20 66  of(field.span, f
0f70: 69 65 6c 64 29 3b 0a 0a 20 20 20 20 20 20 20 20  ield);..        
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74 20              let 
0f90: 65 78 70 72 20 3d 20 63 78 2e 65 78 70 72 5f 6d  expr = cx.expr_m
0fa0: 65 74 68 6f 64 5f 63 61 6c 6c 28 73 70 61 6e 2c  ethod_call(span,
0fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fe0: 20 20 20 20 62 75 69 6c 64 65 72 5f 65 78 70 72      builder_expr
0ff0: 2e 63 6c 6f 6e 65 28 29 2c 0a 20 20 20 20 20 20  .clone(),.      
1000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 49 64 65               Ide
1030: 6e 74 3a 3a 66 72 6f 6d 5f 73 74 72 28 22 66 69  nt::from_str("fi
1040: 65 6c 64 22 29 2c 0a 20 20 20 20 20 20 20 20 20  eld"),.         
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 20 20 20 20 20 20 20 20 20 20 76 65 63 21 5b 66            vec![f
1080: 69 65 6c 64 5d 29 3b 0a 0a 20 20 20 20 20 20 20  ield]);..       
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
10a0: 55 73 65 20 60 6c 65 74 20 5f 20 3d 20 65 78 70  Use `let _ = exp
10b0: 72 3b 60 20 74 6f 20 61 76 6f 69 64 20 74 72 69  r;` to avoid tri
10c0: 67 67 65 72 69 6e 67 20 74 68 65 0a 20 20 20 20  ggering the.    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 2f 2f 20 75 6e 75 73 65 64 5f 72 65 73 75 6c 74  // unused_result
10f0: 73 20 6c 69 6e 74 2e 0a 20 20 20 20 20 20 20 20  s lint..        
1100: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6d 74              stmt
1110: 73 2e 70 75 73 68 28 73 74 6d 74 5f 6c 65 74 5f  s.push(stmt_let_
1120: 75 6e 64 65 73 63 6f 72 65 28 63 78 2c 20 73 70  undescore(cx, sp
1130: 61 6e 2c 20 65 78 70 72 29 29 3b 0a 20 20 20 20  an, expr));.    
1140: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1150: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
1160: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
1170: 20 20 20 2f 2f 20 6e 6f 72 6d 61 6c 20 73 74 72     // normal str
1180: 75 63 74 2f 73 74 72 75 63 74 20 76 61 72 69 61  uct/struct varia
1190: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nt.             
11a0: 20 20 20 6c 65 74 20 65 78 70 72 20 3d 0a 20 20     let expr =.  
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 63 78 2e 65 78 70 72 5f 6d 65 74 68 6f 64    cx.expr_method
11d0: 5f 63 61 6c 6c 28 73 70 61 6e 2c 20 66 6d 74 2c  _call(span, fmt,
11e0: 20 49 64 65 6e 74 3a 3a 66 72 6f 6d 5f 73 74 72   Ident::from_str
11f0: 28 22 64 65 62 75 67 5f 73 74 72 75 63 74 22 29  ("debug_struct")
1200: 2c 20 76 65 63 21 5b 6e 61 6d 65 5d 29 3b 0a 20  , vec![name]);. 
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1220: 74 6d 74 73 2e 70 75 73 68 28 63 78 2e 73 74 6d  tmts.push(cx.stm
1230: 74 5f 6c 65 74 28 44 55 4d 4d 59 5f 53 50 2c 20  t_let(DUMMY_SP, 
1240: 74 72 75 65 2c 20 62 75 69 6c 64 65 72 2c 20 65  true, builder, e
1250: 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20  xpr));..        
1260: 20 20 20 20 20 20 20 20 66 6f 72 20 66 69 65 6c          for fiel
1270: 64 20 69 6e 20 66 69 65 6c 64 73 20 7b 0a 20 20  d in fields {.  
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 6c 65 74 20 6e 61 6d 65 20 3d 20 63 78 2e    let name = cx.
12a0: 65 78 70 72 5f 6c 69 74 28 66 69 65 6c 64 2e 73  expr_lit(field.s
12b0: 70 61 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pan,.           
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 61 73 74 3a 3a 4c 69 74 4b 69 6e 64 3a 3a 53 74  ast::LitKind::St
12f0: 72 28 66 69 65 6c 64 2e 6e 61 6d 65 2e 75 6e 77  r(field.name.unw
1300: 72 61 70 28 29 2e 6e 61 6d 65 2c 0a 20 20 20 20  rap().name,.    
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 20 20 20 20 20 20 20 20 20 61 73 74 3a 3a 53 74           ast::St
1350: 72 53 74 79 6c 65 3a 3a 43 6f 6f 6b 65 64 29 29  rStyle::Cooked))
1360: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
1370: 20 20 20 20 20 20 20 2f 2f 20 55 73 65 20 64 6f         // Use do
1380: 75 62 6c 65 20 69 6e 64 69 72 65 63 74 69 6f 6e  uble indirection
1390: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
13a0: 69 73 20 77 6f 72 6b 73 20 66 6f 72 20 75 6e 73  is works for uns
13b0: 69 7a 65 64 20 74 79 70 65 73 0a 20 20 20 20 20  ized types.     
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
13d0: 65 74 20 66 69 65 6c 64 20 3d 20 63 78 2e 65 78  et field = cx.ex
13e0: 70 72 5f 61 64 64 72 5f 6f 66 28 66 69 65 6c 64  pr_addr_of(field
13f0: 2e 73 70 61 6e 2c 20 66 69 65 6c 64 2e 73 65 6c  .span, field.sel
1400: 66 5f 2e 63 6c 6f 6e 65 28 29 29 3b 0a 20 20 20  f_.clone());.   
1410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1420: 20 6c 65 74 20 66 69 65 6c 64 20 3d 20 63 78 2e   let field = cx.
1430: 65 78 70 72 5f 61 64 64 72 5f 6f 66 28 66 69 65  expr_addr_of(fie
1440: 6c 64 2e 73 70 61 6e 2c 20 66 69 65 6c 64 29 3b  ld.span, field);
1450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1460: 20 20 20 20 20 6c 65 74 20 65 78 70 72 20 3d 20       let expr = 
1470: 63 78 2e 65 78 70 72 5f 6d 65 74 68 6f 64 5f 63  cx.expr_method_c
1480: 61 6c 6c 28 73 70 61 6e 2c 0a 20 20 20 20 20 20  all(span,.      
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 69               bui
14c0: 6c 64 65 72 5f 65 78 70 72 2e 63 6c 6f 6e 65 28  lder_expr.clone(
14d0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1500: 20 20 20 20 20 20 49 64 65 6e 74 3a 3a 66 72 6f        Ident::fro
1510: 6d 5f 73 74 72 28 22 66 69 65 6c 64 22 29 2c 0a  m_str("field"),.
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 76 65 63 21 5b 6e 61 6d 65 2c 20 66 69     vec![name, fi
1560: 65 6c 64 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  eld]);.         
1570: 20 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 73             stmts
1580: 2e 70 75 73 68 28 73 74 6d 74 5f 6c 65 74 5f 75  .push(stmt_let_u
1590: 6e 64 65 73 63 6f 72 65 28 63 78 2c 20 73 70 61  ndescore(cx, spa
15a0: 6e 2c 20 65 78 70 72 29 29 3b 0a 20 20 20 20 20  n, expr));.     
15b0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15d0: 20 20 20 20 20 20 20 73 74 6d 74 73 0a 20 20 20         stmts.   
15e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 5f       }.        _
15f0: 20 3d 3e 20 75 6e 72 65 61 63 68 61 62 6c 65 21   => unreachable!
1600: 28 29 2c 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  (),.    };..    
1610: 6c 65 74 20 65 78 70 72 20 3d 20 63 78 2e 65 78  let expr = cx.ex
1620: 70 72 5f 6d 65 74 68 6f 64 5f 63 61 6c 6c 28 73  pr_method_call(s
1630: 70 61 6e 2c 20 62 75 69 6c 64 65 72 5f 65 78 70  pan, builder_exp
1640: 72 2c 20 49 64 65 6e 74 3a 3a 66 72 6f 6d 5f 73  r, Ident::from_s
1650: 74 72 28 22 66 69 6e 69 73 68 22 29 2c 20 76 65  tr("finish"), ve
1660: 63 21 5b 5d 29 3b 0a 0a 20 20 20 20 73 74 6d 74  c![]);..    stmt
1670: 73 2e 70 75 73 68 28 63 78 2e 73 74 6d 74 5f 65  s.push(cx.stmt_e
1680: 78 70 72 28 65 78 70 72 29 29 3b 0a 20 20 20 20  xpr(expr));.    
1690: 6c 65 74 20 62 6c 6f 63 6b 20 3d 20 63 78 2e 62  let block = cx.b
16a0: 6c 6f 63 6b 28 73 70 61 6e 2c 20 73 74 6d 74 73  lock(span, stmts
16b0: 29 3b 0a 20 20 20 20 63 78 2e 65 78 70 72 5f 62  );.    cx.expr_b
16c0: 6c 6f 63 6b 28 62 6c 6f 63 6b 29 0a 7d 0a 0a 66  lock(block).}..f
16d0: 6e 20 73 74 6d 74 5f 6c 65 74 5f 75 6e 64 65 73  n stmt_let_undes
16e0: 63 6f 72 65 28 63 78 3a 20 26 6d 75 74 20 45 78  core(cx: &mut Ex
16f0: 74 43 74 78 74 2c 20 73 70 3a 20 53 70 61 6e 2c  tCtxt, sp: Span,
1700: 20 65 78 70 72 3a 20 50 3c 61 73 74 3a 3a 45 78   expr: P<ast::Ex
1710: 70 72 3e 29 20 2d 3e 20 61 73 74 3a 3a 53 74 6d  pr>) -> ast::Stm
1720: 74 20 7b 0a 20 20 20 20 6c 65 74 20 6c 6f 63 61  t {.    let loca
1730: 6c 20 3d 20 50 28 61 73 74 3a 3a 4c 6f 63 61 6c  l = P(ast::Local
1740: 20 7b 0a 20 20 20 20 20 20 20 20 70 61 74 3a 20   {.        pat: 
1750: 63 78 2e 70 61 74 5f 77 69 6c 64 28 73 70 29 2c  cx.pat_wild(sp),
1760: 0a 20 20 20 20 20 20 20 20 74 79 3a 20 4e 6f 6e  .        ty: Non
1770: 65 2c 0a 20 20 20 20 20 20 20 20 69 6e 69 74 3a  e,.        init:
1780: 20 53 6f 6d 65 28 65 78 70 72 29 2c 0a 20 20 20   Some(expr),.   
1790: 20 20 20 20 20 69 64 3a 20 61 73 74 3a 3a 44 55       id: ast::DU
17a0: 4d 4d 59 5f 4e 4f 44 45 5f 49 44 2c 0a 20 20 20  MMY_NODE_ID,.   
17b0: 20 20 20 20 20 73 70 61 6e 3a 20 73 70 2c 0a 20       span: sp,. 
17c0: 20 20 20 20 20 20 20 61 74 74 72 73 3a 20 61 73         attrs: as
17d0: 74 3a 3a 54 68 69 6e 56 65 63 3a 3a 6e 65 77 28  t::ThinVec::new(
17e0: 29 2c 0a 20 20 20 20 7d 29 3b 0a 20 20 20 20 61  ),.    });.    a
17f0: 73 74 3a 3a 53 74 6d 74 20 7b 0a 20 20 20 20 20  st::Stmt {.     
1800: 20 20 20 69 64 3a 20 61 73 74 3a 3a 44 55 4d 4d     id: ast::DUMM
1810: 59 5f 4e 4f 44 45 5f 49 44 2c 0a 20 20 20 20 20  Y_NODE_ID,.     
1820: 20 20 20 6e 6f 64 65 3a 20 61 73 74 3a 3a 53 74     node: ast::St
1830: 6d 74 4b 69 6e 64 3a 3a 4c 6f 63 61 6c 28 6c 6f  mtKind::Local(lo
1840: 63 61 6c 29 2c 0a 20 20 20 20 20 20 20 20 73 70  cal),.        sp
1850: 61 6e 3a 20 73 70 2c 0a 20 20 20 20 7d 0a 7d 0a  an: sp,.    }.}.