diff --git a/src/librustc/ich/hcx.rs b/src/librustc/ich/hcx.rs index f9fb668110b..7099b951129 100644 --- a/src/librustc/ich/hcx.rs +++ b/src/librustc/ich/hcx.rs @@ -341,7 +341,7 @@ impl<'gcx> HashStable> for Span { std_hash::Hash::hash(&TAG_VALID_SPAN, hasher); // We truncate the stable_id hash and line and col numbers. The chances // of causing a collision this way should be minimal. - std_hash::Hash::hash(&(file_lo.stable_id.0 as u64), hasher); + std_hash::Hash::hash(&file_lo.name, hasher); let col = (col_lo.0 as u64) & 0xFF; let line = ((line_lo as u64) & 0xFF_FF_FF) << 8; diff --git a/src/librustc/ich/impls_syntax.rs b/src/librustc/ich/impls_syntax.rs index dfb90a5d27f..c25aa10eb1e 100644 --- a/src/librustc/ich/impls_syntax.rs +++ b/src/librustc/ich/impls_syntax.rs @@ -394,8 +394,6 @@ impl<'gcx> HashStable> for FileMap { // Do not hash the source as it is not encoded src: _, src_hash, - // The stable id is just a hash of other fields - stable_id: _, external_src: _, start_pos, end_pos: _, diff --git a/src/librustc/ty/maps/on_disk_cache.rs b/src/librustc/ty/maps/on_disk_cache.rs index 7d583a35477..079b518efd8 100644 --- a/src/librustc/ty/maps/on_disk_cache.rs +++ b/src/librustc/ty/maps/on_disk_cache.rs @@ -176,7 +176,7 @@ impl<'sess> OnDiskCache<'sess> { let index = FileMapIndex(index as u32); let file_ptr: *const FileMap = &**file as *const _; file_to_file_index.insert(file_ptr, index); - file_index_to_stable_id.insert(index, file.stable_id); + file_index_to_stable_id.insert(index, StableFilemapId::new(&file)); } (file_to_file_index, file_index_to_stable_id) diff --git a/src/librustc_metadata/decoder.rs b/src/librustc_metadata/decoder.rs index aa7eee366d2..49a017535ff 100644 --- a/src/librustc_metadata/decoder.rs +++ b/src/librustc_metadata/decoder.rs @@ -1124,7 +1124,6 @@ impl<'a, 'tcx> CrateMetadata { let syntax_pos::FileMap { name, name_was_remapped, src_hash, - stable_id, start_pos, end_pos, lines, @@ -1156,7 +1155,6 @@ impl<'a, 'tcx> CrateMetadata { name_was_remapped, self.cnum.as_u32(), src_hash, - stable_id, source_length, lines, multibyte_chars, diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs index 07bba29ca4b..2c91d60ce9d 100644 --- a/src/libsyntax/codemap.rs +++ b/src/libsyntax/codemap.rs @@ -23,7 +23,9 @@ pub use syntax_pos::hygiene::{ExpnFormat, ExpnInfo, NameAndSpan}; pub use self::ExpnFormat::*; use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::StableHasher; use std::cell::{RefCell, Ref}; +use std::hash::Hash; use std::path::{Path, PathBuf}; use std::rc::Rc; @@ -100,6 +102,24 @@ impl FileLoader for RealFileLoader { } } +// This is a FileMap identifier that is used to correlate FileMaps between +// subsequent compilation sessions (which is something we need to do during +// incremental compilation). +#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)] +pub struct StableFilemapId(u128); + +impl StableFilemapId { + pub fn new(filemap: &FileMap) -> StableFilemapId { + let mut hasher = StableHasher::new(); + + filemap.name.hash(&mut hasher); + filemap.name_was_remapped.hash(&mut hasher); + filemap.unmapped_path.hash(&mut hasher); + + StableFilemapId(hasher.finish()) + } +} + // _____________________________________________________________________________ // CodeMap // @@ -197,7 +217,7 @@ impl CodeMap { self.stable_id_to_filemap .borrow_mut() - .insert(filemap.stable_id, filemap.clone()); + .insert(StableFilemapId::new(&filemap), filemap.clone()); filemap } @@ -226,7 +246,6 @@ impl CodeMap { name_was_remapped: bool, crate_of_origin: u32, src_hash: u128, - stable_id: StableFilemapId, source_len: usize, mut file_local_lines: Vec, mut file_local_multibyte_chars: Vec, @@ -257,7 +276,6 @@ impl CodeMap { crate_of_origin, src: None, src_hash, - stable_id, external_src: RefCell::new(ExternalSource::AbsentOk), start_pos, end_pos, @@ -270,7 +288,7 @@ impl CodeMap { self.stable_id_to_filemap .borrow_mut() - .insert(stable_id, filemap.clone()); + .insert(StableFilemapId::new(&filemap), filemap.clone()); filemap } diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index c3d2f0de21d..8d5d7c81c0e 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -678,8 +678,6 @@ pub struct FileMap { pub src: Option>, /// The source code's hash pub src_hash: u128, - /// The stable id used during incr. comp. - pub stable_id: StableFilemapId, /// The external source code (used for external crates, which will have a `None` /// value as `self.src`. pub external_src: RefCell, @@ -695,34 +693,12 @@ pub struct FileMap { pub non_narrow_chars: RefCell>, } -// This is a FileMap identifier that is used to correlate FileMaps between -// subsequent compilation sessions (which is something we need to do during -// incremental compilation). -#[derive(Copy, Clone, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Debug)] -pub struct StableFilemapId(pub u128); - -impl StableFilemapId { - pub fn new(name: &FileName, - name_was_remapped: bool, - unmapped_path: &FileName) - -> StableFilemapId { - use std::hash::Hash; - - let mut hasher = StableHasher::new(); - name.hash(&mut hasher); - name_was_remapped.hash(&mut hasher); - unmapped_path.hash(&mut hasher); - StableFilemapId(hasher.finish()) - } -} - impl Encodable for FileMap { fn encode(&self, s: &mut S) -> Result<(), S::Error> { s.emit_struct("FileMap", 8, |s| { s.emit_struct_field("name", 0, |s| self.name.encode(s))?; s.emit_struct_field("name_was_remapped", 1, |s| self.name_was_remapped.encode(s))?; s.emit_struct_field("src_hash", 2, |s| self.src_hash.encode(s))?; - s.emit_struct_field("stable_id", 3, |s| self.stable_id.encode(s))?; s.emit_struct_field("start_pos", 4, |s| self.start_pos.encode(s))?; s.emit_struct_field("end_pos", 5, |s| self.end_pos.encode(s))?; s.emit_struct_field("lines", 6, |s| { @@ -790,8 +766,6 @@ impl Decodable for FileMap { d.read_struct_field("name_was_remapped", 1, |d| Decodable::decode(d))?; let src_hash: u128 = d.read_struct_field("src_hash", 2, |d| Decodable::decode(d))?; - let stable_id: StableFilemapId = - d.read_struct_field("stable_id", 3, |d| Decodable::decode(d))?; let start_pos: BytePos = d.read_struct_field("start_pos", 4, |d| Decodable::decode(d))?; let end_pos: BytePos = d.read_struct_field("end_pos", 5, |d| Decodable::decode(d))?; @@ -839,7 +813,6 @@ impl Decodable for FileMap { end_pos, src: None, src_hash, - stable_id, external_src: RefCell::new(ExternalSource::AbsentOk), lines: RefCell::new(lines), multibyte_chars: RefCell::new(multibyte_chars), @@ -866,11 +839,6 @@ impl FileMap { let mut hasher: StableHasher = StableHasher::new(); hasher.write(src.as_bytes()); let src_hash = hasher.finish(); - - let stable_id = StableFilemapId::new(&name, - name_was_remapped, - &unmapped_path); - let end_pos = start_pos.to_usize() + src.len(); FileMap { @@ -880,7 +848,6 @@ impl FileMap { crate_of_origin: 0, src: Some(Rc::new(src)), src_hash, - stable_id, external_src: RefCell::new(ExternalSource::Unneeded), start_pos, end_pos: Pos::from_usize(end_pos),