Hex Artifact Content
Not logged in

Artifact 2ca6cbd8c9bfc5b490debb19158e98280f6a73f5:


0000: 2f 2f 21 20 54 68 69 73 20 6d 6f 64 75 6c 65 20  //! This module 
0010: 63 6f 6e 74 61 69 6e 73 20 60 48 61 73 68 53 74  contains `HashSt
0020: 61 62 6c 65 60 20 69 6d 70 6c 65 6d 65 6e 74 61  able` implementa
0030: 74 69 6f 6e 73 20 66 6f 72 20 76 61 72 69 6f 75  tions for variou
0040: 73 20 64 61 74 61 20 74 79 70 65 73 0a 2f 2f 21  s data types.//!
0050: 20 66 72 6f 6d 20 6c 69 62 73 79 6e 74 61 78 20   from libsyntax 
0060: 69 6e 20 6e 6f 20 70 61 72 74 69 63 75 6c 61 72  in no particular
0070: 20 6f 72 64 65 72 2e 0a 0a 75 73 65 20 63 72 61   order...use cra
0080: 74 65 3a 3a 69 63 68 3a 3a 53 74 61 62 6c 65 48  te::ich::StableH
0090: 61 73 68 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 0a  ashingContext;..
00a0: 75 73 65 20 73 79 6e 74 61 78 3a 3a 61 73 74 3b  use syntax::ast;
00b0: 0a 75 73 65 20 73 79 6e 74 61 78 5f 70 6f 73 3a  .use syntax_pos:
00c0: 3a 53 6f 75 72 63 65 46 69 6c 65 3b 0a 0a 75 73  :SourceFile;..us
00d0: 65 20 63 72 61 74 65 3a 3a 68 69 72 3a 3a 64 65  e crate::hir::de
00e0: 66 5f 69 64 3a 3a 7b 44 65 66 49 64 2c 20 43 72  f_id::{DefId, Cr
00f0: 61 74 65 4e 75 6d 2c 20 43 52 41 54 45 5f 44 45  ateNum, CRATE_DE
0100: 46 5f 49 4e 44 45 58 7d 3b 0a 0a 75 73 65 20 73  F_INDEX};..use s
0110: 6d 61 6c 6c 76 65 63 3a 3a 53 6d 61 6c 6c 56 65  mallvec::SmallVe
0120: 63 3b 0a 75 73 65 20 72 75 73 74 63 5f 64 61 74  c;.use rustc_dat
0130: 61 5f 73 74 72 75 63 74 75 72 65 73 3a 3a 73 74  a_structures::st
0140: 61 62 6c 65 5f 68 61 73 68 65 72 3a 3a 7b 48 61  able_hasher::{Ha
0150: 73 68 53 74 61 62 6c 65 2c 20 53 74 61 62 6c 65  shStable, Stable
0160: 48 61 73 68 65 72 7d 3b 0a 0a 69 6d 70 6c 3c 27  Hasher};..impl<'
0170: 63 74 78 3e 20 72 75 73 74 63 5f 74 61 72 67 65  ctx> rustc_targe
0180: 74 3a 3a 48 61 73 68 53 74 61 62 6c 65 43 6f 6e  t::HashStableCon
0190: 74 65 78 74 20 66 6f 72 20 53 74 61 62 6c 65 48  text for StableH
01a0: 61 73 68 69 6e 67 43 6f 6e 74 65 78 74 3c 27 63  ashingContext<'c
01b0: 74 78 3e 20 7b 7d 0a 0a 69 6d 70 6c 3c 27 61 3e  tx> {}..impl<'a>
01c0: 20 48 61 73 68 53 74 61 62 6c 65 3c 53 74 61 62   HashStable<Stab
01d0: 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65 78 74  leHashingContext
01e0: 3c 27 61 3e 3e 20 66 6f 72 20 61 73 74 3a 3a 4c  <'a>> for ast::L
01f0: 69 66 65 74 69 6d 65 20 7b 0a 20 20 20 20 66 6e  ifetime {.    fn
0200: 20 68 61 73 68 5f 73 74 61 62 6c 65 28 26 73 65   hash_stable(&se
0210: 6c 66 2c 20 68 63 78 3a 20 26 6d 75 74 20 53 74  lf, hcx: &mut St
0220: 61 62 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65  ableHashingConte
0230: 78 74 3c 27 61 3e 2c 20 68 61 73 68 65 72 3a 20  xt<'a>, hasher: 
0240: 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 65  &mut StableHashe
0250: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 73 65 6c  r) {.        sel
0260: 66 2e 69 64 2e 68 61 73 68 5f 73 74 61 62 6c 65  f.id.hash_stable
0270: 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 20  (hcx, hasher);. 
0280: 20 20 20 20 20 20 20 73 65 6c 66 2e 69 64 65 6e         self.iden
0290: 74 2e 68 61 73 68 5f 73 74 61 62 6c 65 28 68 63  t.hash_stable(hc
02a0: 78 2c 20 68 61 73 68 65 72 29 3b 0a 20 20 20 20  x, hasher);.    
02b0: 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27 61 3e 20 48 61  }.}..impl<'a> Ha
02c0: 73 68 53 74 61 62 6c 65 3c 53 74 61 62 6c 65 48  shStable<StableH
02d0: 61 73 68 69 6e 67 43 6f 6e 74 65 78 74 3c 27 61  ashingContext<'a
02e0: 3e 3e 20 66 6f 72 20 5b 61 73 74 3a 3a 41 74 74  >> for [ast::Att
02f0: 72 69 62 75 74 65 5d 20 7b 0a 20 20 20 20 66 6e  ribute] {.    fn
0300: 20 68 61 73 68 5f 73 74 61 62 6c 65 28 26 73 65   hash_stable(&se
0310: 6c 66 2c 20 68 63 78 3a 20 26 6d 75 74 20 53 74  lf, hcx: &mut St
0320: 61 62 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65  ableHashingConte
0330: 78 74 3c 27 61 3e 2c 20 68 61 73 68 65 72 3a 20  xt<'a>, hasher: 
0340: 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 65  &mut StableHashe
0350: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  r) {.        if 
0360: 73 65 6c 66 2e 6c 65 6e 28 29 20 3d 3d 20 30 20  self.len() == 0 
0370: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  {.            se
0380: 6c 66 2e 6c 65 6e 28 29 2e 68 61 73 68 5f 73 74  lf.len().hash_st
0390: 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72  able(hcx, hasher
03a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
03b0: 65 74 75 72 6e 0a 20 20 20 20 20 20 20 20 7d 0a  eturn.        }.
03c0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 53 6f 6d 65  .        // Some
03d0: 20 61 74 74 72 69 62 75 74 65 73 20 61 72 65 20   attributes are 
03e0: 61 6c 77 61 79 73 20 69 67 6e 6f 72 65 64 20 64  always ignored d
03f0: 75 72 69 6e 67 20 68 61 73 68 69 6e 67 2e 0a 20  uring hashing.. 
0400: 20 20 20 20 20 20 20 6c 65 74 20 66 69 6c 74 65         let filte
0410: 72 65 64 3a 20 53 6d 61 6c 6c 56 65 63 3c 5b 26  red: SmallVec<[&
0420: 61 73 74 3a 3a 41 74 74 72 69 62 75 74 65 3b 20  ast::Attribute; 
0430: 38 5d 3e 20 3d 20 73 65 6c 66 0a 20 20 20 20 20  8]> = self.     
0440: 20 20 20 20 20 20 20 2e 69 74 65 72 28 29 0a 20         .iter(). 
0450: 20 20 20 20 20 20 20 20 20 20 20 2e 66 69 6c 74             .filt
0460: 65 72 28 7c 61 74 74 72 7c 20 7b 0a 20 20 20 20  er(|attr| {.    
0470: 20 20 20 20 20 20 20 20 20 20 20 20 21 61 74 74              !att
0480: 72 2e 69 73 5f 64 6f 63 5f 63 6f 6d 6d 65 6e 74  r.is_doc_comment
0490: 28 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  () &&.          
04a0: 20 20 20 20 20 20 21 61 74 74 72 2e 69 64 65 6e        !attr.iden
04b0: 74 28 29 2e 6d 61 70 5f 6f 72 28 66 61 6c 73 65  t().map_or(false
04c0: 2c 20 7c 69 64 65 6e 74 7c 20 68 63 78 2e 69 73  , |ident| hcx.is
04d0: 5f 69 67 6e 6f 72 65 64 5f 61 74 74 72 28 69 64  _ignored_attr(id
04e0: 65 6e 74 2e 6e 61 6d 65 29 29 0a 20 20 20 20 20  ent.name)).     
04f0: 20 20 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20         }).      
0500: 20 20 20 20 20 20 2e 63 6f 6c 6c 65 63 74 28 29        .collect()
0510: 3b 0a 0a 20 20 20 20 20 20 20 20 66 69 6c 74 65  ;..        filte
0520: 72 65 64 2e 6c 65 6e 28 29 2e 68 61 73 68 5f 73  red.len().hash_s
0530: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
0540: 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  r);.        for 
0550: 61 74 74 72 20 69 6e 20 66 69 6c 74 65 72 65 64  attr in filtered
0560: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61   {.            a
0570: 74 74 72 2e 68 61 73 68 5f 73 74 61 62 6c 65 28  ttr.hash_stable(
0580: 68 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 20 20  hcx, hasher);.  
0590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
05a0: 0a 69 6d 70 6c 3c 27 61 3e 20 48 61 73 68 53 74  .impl<'a> HashSt
05b0: 61 62 6c 65 3c 53 74 61 62 6c 65 48 61 73 68 69  able<StableHashi
05c0: 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 3e 20 66  ngContext<'a>> f
05d0: 6f 72 20 61 73 74 3a 3a 41 74 74 72 69 62 75 74  or ast::Attribut
05e0: 65 20 7b 0a 20 20 20 20 66 6e 20 68 61 73 68 5f  e {.    fn hash_
05f0: 73 74 61 62 6c 65 28 26 73 65 6c 66 2c 20 68 63  stable(&self, hc
0600: 78 3a 20 26 6d 75 74 20 53 74 61 62 6c 65 48 61  x: &mut StableHa
0610: 73 68 69 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e  shingContext<'a>
0620: 2c 20 68 61 73 68 65 72 3a 20 26 6d 75 74 20 53  , hasher: &mut S
0630: 74 61 62 6c 65 48 61 73 68 65 72 29 20 7b 0a 20  tableHasher) {. 
0640: 20 20 20 20 20 20 20 2f 2f 20 4d 61 6b 65 20 73         // Make s
0650: 75 72 65 20 74 68 61 74 20 74 68 65 73 65 20 68  ure that these h
0660: 61 76 65 20 62 65 65 6e 20 66 69 6c 74 65 72 65  ave been filtere
0670: 64 20 6f 75 74 2e 0a 20 20 20 20 20 20 20 20 64  d out..        d
0680: 65 62 75 67 5f 61 73 73 65 72 74 21 28 21 73 65  ebug_assert!(!se
0690: 6c 66 2e 69 64 65 6e 74 28 29 2e 6d 61 70 5f 6f  lf.ident().map_o
06a0: 72 28 66 61 6c 73 65 2c 20 7c 69 64 65 6e 74 7c  r(false, |ident|
06b0: 20 68 63 78 2e 69 73 5f 69 67 6e 6f 72 65 64 5f   hcx.is_ignored_
06c0: 61 74 74 72 28 69 64 65 6e 74 2e 6e 61 6d 65 29  attr(ident.name)
06d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 64 65 62 75  ));.        debu
06e0: 67 5f 61 73 73 65 72 74 21 28 21 73 65 6c 66 2e  g_assert!(!self.
06f0: 69 73 5f 64 6f 63 5f 63 6f 6d 6d 65 6e 74 28 29  is_doc_comment()
0700: 29 3b 0a 0a 20 20 20 20 20 20 20 20 6c 65 74 20  );..        let 
0710: 61 73 74 3a 3a 41 74 74 72 69 62 75 74 65 20 7b  ast::Attribute {
0720: 20 6b 69 6e 64 2c 20 69 64 3a 20 5f 2c 20 73 74   kind, id: _, st
0730: 79 6c 65 2c 20 73 70 61 6e 20 7d 20 3d 20 73 65  yle, span } = se
0740: 6c 66 3b 0a 20 20 20 20 20 20 20 20 69 66 20 6c  lf;.        if l
0750: 65 74 20 61 73 74 3a 3a 41 74 74 72 4b 69 6e 64  et ast::AttrKind
0760: 3a 3a 4e 6f 72 6d 61 6c 28 69 74 65 6d 29 20 3d  ::Normal(item) =
0770: 20 6b 69 6e 64 20 7b 0a 20 20 20 20 20 20 20 20   kind {.        
0780: 20 20 20 20 69 74 65 6d 2e 68 61 73 68 5f 73 74      item.hash_st
0790: 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72  able(hcx, hasher
07a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
07b0: 74 79 6c 65 2e 68 61 73 68 5f 73 74 61 62 6c 65  tyle.hash_stable
07c0: 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 20  (hcx, hasher);. 
07d0: 20 20 20 20 20 20 20 20 20 20 20 73 70 61 6e 2e             span.
07e0: 68 61 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c  hash_stable(hcx,
07f0: 20 68 61 73 68 65 72 29 3b 0a 20 20 20 20 20 20   hasher);.      
0800: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
0810: 20 20 20 20 20 20 20 75 6e 72 65 61 63 68 61 62         unreachab
0820: 6c 65 21 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  le!();.        }
0830: 0a 20 20 20 20 7d 0a 7d 0a 0a 69 6d 70 6c 3c 27  .    }.}..impl<'
0840: 63 74 78 3e 20 73 79 6e 74 61 78 3a 3a 48 61 73  ctx> syntax::Has
0850: 68 53 74 61 62 6c 65 43 6f 6e 74 65 78 74 20 66  hStableContext f
0860: 6f 72 20 53 74 61 62 6c 65 48 61 73 68 69 6e 67  or StableHashing
0870: 43 6f 6e 74 65 78 74 3c 27 63 74 78 3e 20 7b 7d  Context<'ctx> {}
0880: 0a 0a 69 6d 70 6c 3c 27 61 3e 20 48 61 73 68 53  ..impl<'a> HashS
0890: 74 61 62 6c 65 3c 53 74 61 62 6c 65 48 61 73 68  table<StableHash
08a0: 69 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 3e 20  ingContext<'a>> 
08b0: 66 6f 72 20 53 6f 75 72 63 65 46 69 6c 65 20 7b  for SourceFile {
08c0: 0a 20 20 20 20 66 6e 20 68 61 73 68 5f 73 74 61  .    fn hash_sta
08d0: 62 6c 65 28 26 73 65 6c 66 2c 20 68 63 78 3a 20  ble(&self, hcx: 
08e0: 26 6d 75 74 20 53 74 61 62 6c 65 48 61 73 68 69  &mut StableHashi
08f0: 6e 67 43 6f 6e 74 65 78 74 3c 27 61 3e 2c 20 68  ngContext<'a>, h
0900: 61 73 68 65 72 3a 20 26 6d 75 74 20 53 74 61 62  asher: &mut Stab
0910: 6c 65 48 61 73 68 65 72 29 20 7b 0a 20 20 20 20  leHasher) {.    
0920: 20 20 20 20 6c 65 74 20 53 6f 75 72 63 65 46 69      let SourceFi
0930: 6c 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  le {.           
0940: 20 6e 61 6d 65 3a 20 5f 2c 20 2f 2f 20 57 65 20   name: _, // We 
0950: 68 61 73 68 20 74 68 65 20 73 6d 61 6c 6c 65 72  hash the smaller
0960: 20 6e 61 6d 65 5f 68 61 73 68 20 69 6e 73 74 65   name_hash inste
0970: 61 64 20 6f 66 20 74 68 69 73 0a 20 20 20 20 20  ad of this.     
0980: 20 20 20 20 20 20 20 6e 61 6d 65 5f 68 61 73 68         name_hash
0990: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 61  ,.            na
09a0: 6d 65 5f 77 61 73 5f 72 65 6d 61 70 70 65 64 2c  me_was_remapped,
09b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 6d  .            unm
09c0: 61 70 70 65 64 5f 70 61 74 68 3a 20 5f 2c 0a 20  apped_path: _,. 
09d0: 20 20 20 20 20 20 20 20 20 20 20 63 72 61 74 65             crate
09e0: 5f 6f 66 5f 6f 72 69 67 69 6e 2c 0a 20 20 20 20  _of_origin,.    
09f0: 20 20 20 20 20 20 20 20 2f 2f 20 44 6f 20 6e 6f          // Do no
0a00: 74 20 68 61 73 68 20 74 68 65 20 73 6f 75 72 63  t hash the sourc
0a10: 65 20 61 73 20 69 74 20 69 73 20 6e 6f 74 20 65  e as it is not e
0a20: 6e 63 6f 64 65 64 0a 20 20 20 20 20 20 20 20 20  ncoded.         
0a30: 20 20 20 73 72 63 3a 20 5f 2c 0a 20 20 20 20 20     src: _,.     
0a40: 20 20 20 20 20 20 20 73 72 63 5f 68 61 73 68 2c         src_hash,
0a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78 74  .            ext
0a60: 65 72 6e 61 6c 5f 73 72 63 3a 20 5f 2c 0a 20 20  ernal_src: _,.  
0a70: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 5f            start_
0a80: 70 6f 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pos,.           
0a90: 20 65 6e 64 5f 70 6f 73 3a 20 5f 2c 0a 20 20 20   end_pos: _,.   
0aa0: 20 20 20 20 20 20 20 20 20 72 65 66 20 6c 69 6e           ref lin
0ab0: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
0ac0: 72 65 66 20 6d 75 6c 74 69 62 79 74 65 5f 63 68  ref multibyte_ch
0ad0: 61 72 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ars,.           
0ae0: 20 72 65 66 20 6e 6f 6e 5f 6e 61 72 72 6f 77 5f   ref non_narrow_
0af0: 63 68 61 72 73 2c 0a 20 20 20 20 20 20 20 20 20  chars,.         
0b00: 20 20 20 72 65 66 20 6e 6f 72 6d 61 6c 69 7a 65     ref normalize
0b10: 64 5f 70 6f 73 2c 0a 20 20 20 20 20 20 20 20 7d  d_pos,.        }
0b20: 20 3d 20 2a 73 65 6c 66 3b 0a 0a 20 20 20 20 20   = *self;..     
0b30: 20 20 20 28 6e 61 6d 65 5f 68 61 73 68 20 61 73     (name_hash as
0b40: 20 75 36 34 29 2e 68 61 73 68 5f 73 74 61 62 6c   u64).hash_stabl
0b50: 65 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b 0a  e(hcx, hasher);.
0b60: 20 20 20 20 20 20 20 20 6e 61 6d 65 5f 77 61 73          name_was
0b70: 5f 72 65 6d 61 70 70 65 64 2e 68 61 73 68 5f 73  _remapped.hash_s
0b80: 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65  table(hcx, hashe
0b90: 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 44 65 66  r);..        Def
0ba0: 49 64 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Id {.           
0bb0: 20 6b 72 61 74 65 3a 20 43 72 61 74 65 4e 75 6d   krate: CrateNum
0bc0: 3a 3a 66 72 6f 6d 5f 75 33 32 28 63 72 61 74 65  ::from_u32(crate
0bd0: 5f 6f 66 5f 6f 72 69 67 69 6e 29 2c 0a 20 20 20  _of_origin),.   
0be0: 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 3a 20           index: 
0bf0: 43 52 41 54 45 5f 44 45 46 5f 49 4e 44 45 58 2c  CRATE_DEF_INDEX,
0c00: 0a 20 20 20 20 20 20 20 20 7d 2e 68 61 73 68 5f  .        }.hash_
0c10: 73 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68  stable(hcx, hash
0c20: 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 72  er);..        sr
0c30: 63 5f 68 61 73 68 2e 68 61 73 68 5f 73 74 61 62  c_hash.hash_stab
0c40: 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b  le(hcx, hasher);
0c50: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20  ..        // We 
0c60: 6f 6e 6c 79 20 68 61 73 68 20 74 68 65 20 72 65  only hash the re
0c70: 6c 61 74 69 76 65 20 70 6f 73 69 74 69 6f 6e 20  lative position 
0c80: 77 69 74 68 69 6e 20 74 68 69 73 20 73 6f 75 72  within this sour
0c90: 63 65 5f 66 69 6c 65 0a 20 20 20 20 20 20 20 20  ce_file.        
0ca0: 6c 69 6e 65 73 2e 6c 65 6e 28 29 2e 68 61 73 68  lines.len().hash
0cb0: 5f 73 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73  _stable(hcx, has
0cc0: 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  her);.        fo
0cd0: 72 20 26 6c 69 6e 65 20 69 6e 20 6c 69 6e 65 73  r &line in lines
0ce0: 2e 69 74 65 72 28 29 20 7b 0a 20 20 20 20 20 20  .iter() {.      
0cf0: 20 20 20 20 20 20 73 74 61 62 6c 65 5f 62 79 74        stable_byt
0d00: 65 5f 70 6f 73 28 6c 69 6e 65 2c 20 73 74 61 72  e_pos(line, star
0d10: 74 5f 70 6f 73 29 2e 68 61 73 68 5f 73 74 61 62  t_pos).hash_stab
0d20: 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b  le(hcx, hasher);
0d30: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
0d40: 20 20 20 20 2f 2f 20 57 65 20 6f 6e 6c 79 20 68      // We only h
0d50: 61 73 68 20 74 68 65 20 72 65 6c 61 74 69 76 65  ash the relative
0d60: 20 70 6f 73 69 74 69 6f 6e 20 77 69 74 68 69 6e   position within
0d70: 20 74 68 69 73 20 73 6f 75 72 63 65 5f 66 69 6c   this source_fil
0d80: 65 0a 20 20 20 20 20 20 20 20 6d 75 6c 74 69 62  e.        multib
0d90: 79 74 65 5f 63 68 61 72 73 2e 6c 65 6e 28 29 2e  yte_chars.len().
0da0: 68 61 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c  hash_stable(hcx,
0db0: 20 68 61 73 68 65 72 29 3b 0a 20 20 20 20 20 20   hasher);.      
0dc0: 20 20 66 6f 72 20 26 63 68 61 72 5f 70 6f 73 20    for &char_pos 
0dd0: 69 6e 20 6d 75 6c 74 69 62 79 74 65 5f 63 68 61  in multibyte_cha
0de0: 72 73 2e 69 74 65 72 28 29 20 7b 0a 20 20 20 20  rs.iter() {.    
0df0: 20 20 20 20 20 20 20 20 73 74 61 62 6c 65 5f 6d          stable_m
0e00: 75 6c 74 69 62 79 74 65 5f 63 68 61 72 28 63 68  ultibyte_char(ch
0e10: 61 72 5f 70 6f 73 2c 20 73 74 61 72 74 5f 70 6f  ar_pos, start_po
0e20: 73 29 2e 68 61 73 68 5f 73 74 61 62 6c 65 28 68  s).hash_stable(h
0e30: 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 20 20 20  cx, hasher);.   
0e40: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
0e50: 6e 6f 6e 5f 6e 61 72 72 6f 77 5f 63 68 61 72 73  non_narrow_chars
0e60: 2e 6c 65 6e 28 29 2e 68 61 73 68 5f 73 74 61 62  .len().hash_stab
0e70: 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b  le(hcx, hasher);
0e80: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 26 63 68  .        for &ch
0e90: 61 72 5f 70 6f 73 20 69 6e 20 6e 6f 6e 5f 6e 61  ar_pos in non_na
0ea0: 72 72 6f 77 5f 63 68 61 72 73 2e 69 74 65 72 28  rrow_chars.iter(
0eb0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0ec0: 73 74 61 62 6c 65 5f 6e 6f 6e 5f 6e 61 72 72 6f  stable_non_narro
0ed0: 77 5f 63 68 61 72 28 63 68 61 72 5f 70 6f 73 2c  w_char(char_pos,
0ee0: 20 73 74 61 72 74 5f 70 6f 73 29 2e 68 61 73 68   start_pos).hash
0ef0: 5f 73 74 61 62 6c 65 28 68 63 78 2c 20 68 61 73  _stable(hcx, has
0f00: 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  her);.        }.
0f10: 0a 20 20 20 20 20 20 20 20 6e 6f 72 6d 61 6c 69  .        normali
0f20: 7a 65 64 5f 70 6f 73 2e 6c 65 6e 28 29 2e 68 61  zed_pos.len().ha
0f30: 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c 20 68  sh_stable(hcx, h
0f40: 61 73 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20  asher);.        
0f50: 66 6f 72 20 26 63 68 61 72 5f 70 6f 73 20 69 6e  for &char_pos in
0f60: 20 6e 6f 72 6d 61 6c 69 7a 65 64 5f 70 6f 73 2e   normalized_pos.
0f70: 69 74 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20  iter() {.       
0f80: 20 20 20 20 20 73 74 61 62 6c 65 5f 6e 6f 72 6d       stable_norm
0f90: 61 6c 69 7a 65 64 5f 70 6f 73 28 63 68 61 72 5f  alized_pos(char_
0fa0: 70 6f 73 2c 20 73 74 61 72 74 5f 70 6f 73 29 2e  pos, start_pos).
0fb0: 68 61 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c  hash_stable(hcx,
0fc0: 20 68 61 73 68 65 72 29 3b 0a 20 20 20 20 20 20   hasher);.      
0fd0: 20 20 7d 0a 0a 20 20 20 20 7d 0a 7d 0a 0a 66 6e    }..    }.}..fn
0fe0: 20 73 74 61 62 6c 65 5f 62 79 74 65 5f 70 6f 73   stable_byte_pos
0ff0: 28 70 6f 73 3a 20 3a 3a 73 79 6e 74 61 78 5f 70  (pos: ::syntax_p
1000: 6f 73 3a 3a 42 79 74 65 50 6f 73 2c 0a 20 20 20  os::BytePos,.   
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 73 6f 75 72 63 65 5f 66 69 6c 65 5f 73 74 61 72  source_file_star
1030: 74 3a 20 3a 3a 73 79 6e 74 61 78 5f 70 6f 73 3a  t: ::syntax_pos:
1040: 3a 42 79 74 65 50 6f 73 29 0a 20 20 20 20 20 20  :BytePos).      
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1060: 75 33 32 20 7b 0a 20 20 20 20 70 6f 73 2e 30 20  u32 {.    pos.0 
1070: 2d 20 73 6f 75 72 63 65 5f 66 69 6c 65 5f 73 74  - source_file_st
1080: 61 72 74 2e 30 0a 7d 0a 0a 66 6e 20 73 74 61 62  art.0.}..fn stab
1090: 6c 65 5f 6d 75 6c 74 69 62 79 74 65 5f 63 68 61  le_multibyte_cha
10a0: 72 28 6d 62 63 3a 20 3a 3a 73 79 6e 74 61 78 5f  r(mbc: ::syntax_
10b0: 70 6f 73 3a 3a 4d 75 6c 74 69 42 79 74 65 43 68  pos::MultiByteCh
10c0: 61 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ar,.            
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6f 75               sou
10e0: 72 63 65 5f 66 69 6c 65 5f 73 74 61 72 74 3a 20  rce_file_start: 
10f0: 3a 3a 73 79 6e 74 61 78 5f 70 6f 73 3a 3a 42 79  ::syntax_pos::By
1100: 74 65 50 6f 73 29 0a 20 20 20 20 20 20 20 20 20  tePos).         
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 2d 3e 20 28 75 33 32 2c 20 75 33 32 29 20 7b 0a  -> (u32, u32) {.
1130: 20 20 20 20 6c 65 74 20 3a 3a 73 79 6e 74 61 78      let ::syntax
1140: 5f 70 6f 73 3a 3a 4d 75 6c 74 69 42 79 74 65 43  _pos::MultiByteC
1150: 68 61 72 20 7b 0a 20 20 20 20 20 20 20 20 70 6f  har {.        po
1160: 73 2c 0a 20 20 20 20 20 20 20 20 62 79 74 65 73  s,.        bytes
1170: 2c 0a 20 20 20 20 7d 20 3d 20 6d 62 63 3b 0a 0a  ,.    } = mbc;..
1180: 20 20 20 20 28 70 6f 73 2e 30 20 2d 20 73 6f 75      (pos.0 - sou
1190: 72 63 65 5f 66 69 6c 65 5f 73 74 61 72 74 2e 30  rce_file_start.0
11a0: 2c 20 62 79 74 65 73 20 61 73 20 75 33 32 29 0a  , bytes as u32).
11b0: 7d 0a 0a 66 6e 20 73 74 61 62 6c 65 5f 6e 6f 6e  }..fn stable_non
11c0: 5f 6e 61 72 72 6f 77 5f 63 68 61 72 28 73 77 63  _narrow_char(swc
11d0: 3a 20 3a 3a 73 79 6e 74 61 78 5f 70 6f 73 3a 3a  : ::syntax_pos::
11e0: 4e 6f 6e 4e 61 72 72 6f 77 43 68 61 72 2c 0a 20  NonNarrowChar,. 
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65 5f           source_
1210: 66 69 6c 65 5f 73 74 61 72 74 3a 20 3a 3a 73 79  file_start: ::sy
1220: 6e 74 61 78 5f 70 6f 73 3a 3a 42 79 74 65 50 6f  ntax_pos::BytePo
1230: 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s).             
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1250: 28 75 33 32 2c 20 75 33 32 29 20 7b 0a 20 20 20  (u32, u32) {.   
1260: 20 6c 65 74 20 70 6f 73 20 3d 20 73 77 63 2e 70   let pos = swc.p
1270: 6f 73 28 29 3b 0a 20 20 20 20 6c 65 74 20 77 69  os();.    let wi
1280: 64 74 68 20 3d 20 73 77 63 2e 77 69 64 74 68 28  dth = swc.width(
1290: 29 3b 0a 0a 20 20 20 20 28 70 6f 73 2e 30 20 2d  );..    (pos.0 -
12a0: 20 73 6f 75 72 63 65 5f 66 69 6c 65 5f 73 74 61   source_file_sta
12b0: 72 74 2e 30 2c 20 77 69 64 74 68 20 61 73 20 75  rt.0, width as u
12c0: 33 32 29 0a 7d 0a 0a 66 6e 20 73 74 61 62 6c 65  32).}..fn stable
12d0: 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 70 6f 73 28  _normalized_pos(
12e0: 6e 70 3a 20 3a 3a 73 79 6e 74 61 78 5f 70 6f 73  np: ::syntax_pos
12f0: 3a 3a 4e 6f 72 6d 61 6c 69 7a 65 64 50 6f 73 2c  ::NormalizedPos,
1300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1310: 20 20 20 20 20 20 20 20 20 20 73 6f 75 72 63 65            source
1320: 5f 66 69 6c 65 5f 73 74 61 72 74 3a 20 3a 3a 73  _file_start: ::s
1330: 79 6e 74 61 78 5f 70 6f 73 3a 3a 42 79 74 65 50  yntax_pos::ByteP
1340: 6f 73 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  os).            
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 3e 20               -> 
1360: 28 75 33 32 2c 20 75 33 32 29 20 7b 0a 20 20 20  (u32, u32) {.   
1370: 20 6c 65 74 20 3a 3a 73 79 6e 74 61 78 5f 70 6f   let ::syntax_po
1380: 73 3a 3a 4e 6f 72 6d 61 6c 69 7a 65 64 50 6f 73  s::NormalizedPos
1390: 20 7b 0a 20 20 20 20 20 20 20 20 70 6f 73 2c 0a   {.        pos,.
13a0: 20 20 20 20 20 20 20 20 64 69 66 66 0a 20 20 20          diff.   
13b0: 20 7d 20 3d 20 6e 70 3b 0a 0a 20 20 20 20 28 70   } = np;..    (p
13c0: 6f 73 2e 30 20 2d 20 73 6f 75 72 63 65 5f 66 69  os.0 - source_fi
13d0: 6c 65 5f 73 74 61 72 74 2e 30 2c 20 64 69 66 66  le_start.0, diff
13e0: 29 0a 7d 0a 0a 0a 69 6d 70 6c 3c 27 74 63 78 3e  ).}...impl<'tcx>
13f0: 20 48 61 73 68 53 74 61 62 6c 65 3c 53 74 61 62   HashStable<Stab
1400: 6c 65 48 61 73 68 69 6e 67 43 6f 6e 74 65 78 74  leHashingContext
1410: 3c 27 74 63 78 3e 3e 20 66 6f 72 20 72 75 73 74  <'tcx>> for rust
1420: 63 5f 66 65 61 74 75 72 65 3a 3a 46 65 61 74 75  c_feature::Featu
1430: 72 65 73 20 7b 0a 20 20 20 20 66 6e 20 68 61 73  res {.    fn has
1440: 68 5f 73 74 61 62 6c 65 28 26 73 65 6c 66 2c 20  h_stable(&self, 
1450: 68 63 78 3a 20 26 6d 75 74 20 53 74 61 62 6c 65  hcx: &mut Stable
1460: 48 61 73 68 69 6e 67 43 6f 6e 74 65 78 74 3c 27  HashingContext<'
1470: 74 63 78 3e 2c 20 68 61 73 68 65 72 3a 20 26 6d  tcx>, hasher: &m
1480: 75 74 20 53 74 61 62 6c 65 48 61 73 68 65 72 29  ut StableHasher)
1490: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20 55 6e   {.        // Un
14a0: 66 6f 72 74 75 6e 61 74 65 6c 79 20 77 65 20 63  fortunately we c
14b0: 61 6e 6e 6f 74 20 65 78 68 61 75 73 74 69 76 65  annot exhaustive
14c0: 6c 79 20 6c 69 73 74 20 66 69 65 6c 64 73 20 68  ly list fields h
14d0: 65 72 65 2c 20 73 69 6e 63 65 20 74 68 65 0a 20  ere, since the. 
14e0: 20 20 20 20 20 20 20 2f 2f 20 73 74 72 75 63 74         // struct
14f0: 20 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61   is macro genera
1500: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 73 65 6c  ted..        sel
1510: 66 2e 64 65 63 6c 61 72 65 64 5f 6c 61 6e 67 5f  f.declared_lang_
1520: 66 65 61 74 75 72 65 73 2e 68 61 73 68 5f 73 74  features.hash_st
1530: 61 62 6c 65 28 68 63 78 2c 20 68 61 73 68 65 72  able(hcx, hasher
1540: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e  );.        self.
1550: 64 65 63 6c 61 72 65 64 5f 6c 69 62 5f 66 65 61  declared_lib_fea
1560: 74 75 72 65 73 2e 68 61 73 68 5f 73 74 61 62 6c  tures.hash_stabl
1570: 65 28 68 63 78 2c 20 68 61 73 68 65 72 29 3b 0a  e(hcx, hasher);.
1580: 0a 20 20 20 20 20 20 20 20 73 65 6c 66 2e 77 61  .        self.wa
1590: 6c 6b 5f 66 65 61 74 75 72 65 5f 66 69 65 6c 64  lk_feature_field
15a0: 73 28 7c 66 65 61 74 75 72 65 5f 6e 61 6d 65 2c  s(|feature_name,
15b0: 20 76 61 6c 75 65 7c 20 7b 0a 20 20 20 20 20 20   value| {.      
15c0: 20 20 20 20 20 20 66 65 61 74 75 72 65 5f 6e 61        feature_na
15d0: 6d 65 2e 68 61 73 68 5f 73 74 61 62 6c 65 28 68  me.hash_stable(h
15e0: 63 78 2c 20 68 61 73 68 65 72 29 3b 0a 20 20 20  cx, hasher);.   
15f0: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 2e 68           value.h
1600: 61 73 68 5f 73 74 61 62 6c 65 28 68 63 78 2c 20  ash_stable(hcx, 
1610: 68 61 73 68 65 72 29 3b 0a 20 20 20 20 20 20 20  hasher);.       
1620: 20 7d 29 3b 0a 20 20 20 20 7d 0a 7d 0a            });.    }.}.