Added source hashes to FileMap
We can use these to perform lazy loading of source files belonging to external crates. That way we will be able to show the source code of external spans that have been translated.
This commit is contained in:
parent
70fa1fbea7
commit
3d2cff0c94
4 changed files with 25 additions and 3 deletions
|
@ -336,6 +336,7 @@ impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for FileMa
|
||||||
crate_of_origin,
|
crate_of_origin,
|
||||||
// Do not hash the source as it is not encoded
|
// Do not hash the source as it is not encoded
|
||||||
src: _,
|
src: _,
|
||||||
|
src_hash,
|
||||||
start_pos,
|
start_pos,
|
||||||
end_pos: _,
|
end_pos: _,
|
||||||
ref lines,
|
ref lines,
|
||||||
|
@ -350,6 +351,8 @@ impl<'a, 'gcx, 'tcx> HashStable<StableHashingContext<'a, 'gcx, 'tcx>> for FileMa
|
||||||
index: CRATE_DEF_INDEX,
|
index: CRATE_DEF_INDEX,
|
||||||
}.hash_stable(hcx, hasher);
|
}.hash_stable(hcx, hasher);
|
||||||
|
|
||||||
|
src_hash.hash_stable(hcx, hasher);
|
||||||
|
|
||||||
// We only hash the relative position within this filemap
|
// We only hash the relative position within this filemap
|
||||||
let lines = lines.borrow();
|
let lines = lines.borrow();
|
||||||
lines.len().hash_stable(hcx, hasher);
|
lines.len().hash_stable(hcx, hasher);
|
||||||
|
|
|
@ -1148,6 +1148,7 @@ impl<'a, 'tcx> CrateMetadata {
|
||||||
// containing the information we need.
|
// containing the information we need.
|
||||||
let syntax_pos::FileMap { name,
|
let syntax_pos::FileMap { name,
|
||||||
name_was_remapped,
|
name_was_remapped,
|
||||||
|
src_hash,
|
||||||
start_pos,
|
start_pos,
|
||||||
end_pos,
|
end_pos,
|
||||||
lines,
|
lines,
|
||||||
|
@ -1173,6 +1174,7 @@ impl<'a, 'tcx> CrateMetadata {
|
||||||
let local_version = local_codemap.new_imported_filemap(name,
|
let local_version = local_codemap.new_imported_filemap(name,
|
||||||
name_was_remapped,
|
name_was_remapped,
|
||||||
self.cnum.as_u32(),
|
self.cnum.as_u32(),
|
||||||
|
src_hash,
|
||||||
source_length,
|
source_length,
|
||||||
lines,
|
lines,
|
||||||
multibyte_chars);
|
multibyte_chars);
|
||||||
|
|
|
@ -27,9 +27,12 @@ use std::rc::Rc;
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
use std::hash::Hasher;
|
||||||
use std::io::{self, Read};
|
use std::io::{self, Read};
|
||||||
use errors::CodeMapper;
|
use errors::CodeMapper;
|
||||||
|
|
||||||
|
use rustc_data_structures::stable_hasher::StableHasher;
|
||||||
|
|
||||||
/// Return the span itself if it doesn't come from a macro expansion,
|
/// Return the span itself if it doesn't come from a macro expansion,
|
||||||
/// otherwise return the call site span up to the `enclosing_sp` by
|
/// otherwise return the call site span up to the `enclosing_sp` by
|
||||||
/// following the `expn_info` chain.
|
/// following the `expn_info` chain.
|
||||||
|
@ -171,11 +174,16 @@ impl CodeMap {
|
||||||
|
|
||||||
let (filename, was_remapped) = self.path_mapping.map_prefix(filename);
|
let (filename, was_remapped) = self.path_mapping.map_prefix(filename);
|
||||||
|
|
||||||
|
let mut hasher: StableHasher<u128> = StableHasher::new();
|
||||||
|
hasher.write(src.as_bytes());
|
||||||
|
let src_hash = hasher.finish();
|
||||||
|
|
||||||
let filemap = Rc::new(FileMap {
|
let filemap = Rc::new(FileMap {
|
||||||
name: filename,
|
name: filename,
|
||||||
name_was_remapped: was_remapped,
|
name_was_remapped: was_remapped,
|
||||||
crate_of_origin: 0,
|
crate_of_origin: 0,
|
||||||
src: Some(Rc::new(src)),
|
src: Some(Rc::new(src)),
|
||||||
|
src_hash: src_hash,
|
||||||
start_pos: Pos::from_usize(start_pos),
|
start_pos: Pos::from_usize(start_pos),
|
||||||
end_pos: Pos::from_usize(end_pos),
|
end_pos: Pos::from_usize(end_pos),
|
||||||
lines: RefCell::new(Vec::new()),
|
lines: RefCell::new(Vec::new()),
|
||||||
|
@ -210,6 +218,7 @@ impl CodeMap {
|
||||||
filename: FileName,
|
filename: FileName,
|
||||||
name_was_remapped: bool,
|
name_was_remapped: bool,
|
||||||
crate_of_origin: u32,
|
crate_of_origin: u32,
|
||||||
|
src_hash: u128,
|
||||||
source_len: usize,
|
source_len: usize,
|
||||||
mut file_local_lines: Vec<BytePos>,
|
mut file_local_lines: Vec<BytePos>,
|
||||||
mut file_local_multibyte_chars: Vec<MultiByteChar>)
|
mut file_local_multibyte_chars: Vec<MultiByteChar>)
|
||||||
|
@ -233,6 +242,7 @@ impl CodeMap {
|
||||||
name_was_remapped: name_was_remapped,
|
name_was_remapped: name_was_remapped,
|
||||||
crate_of_origin: crate_of_origin,
|
crate_of_origin: crate_of_origin,
|
||||||
src: None,
|
src: None,
|
||||||
|
src_hash: src_hash,
|
||||||
start_pos: start_pos,
|
start_pos: start_pos,
|
||||||
end_pos: end_pos,
|
end_pos: end_pos,
|
||||||
lines: RefCell::new(file_local_lines),
|
lines: RefCell::new(file_local_lines),
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#![feature(const_fn)]
|
#![feature(const_fn)]
|
||||||
#![feature(custom_attribute)]
|
#![feature(custom_attribute)]
|
||||||
|
#![feature(i128_type)]
|
||||||
#![feature(optin_builtin_traits)]
|
#![feature(optin_builtin_traits)]
|
||||||
#![allow(unused_attributes)]
|
#![allow(unused_attributes)]
|
||||||
#![feature(specialization)]
|
#![feature(specialization)]
|
||||||
|
@ -36,7 +37,6 @@ use std::cell::{Cell, RefCell};
|
||||||
use std::ops::{Add, Sub};
|
use std::ops::{Add, Sub};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
use serialize::{Encodable, Decodable, Encoder, Decoder};
|
use serialize::{Encodable, Decodable, Encoder, Decoder};
|
||||||
|
@ -382,6 +382,8 @@ pub struct FileMap {
|
||||||
pub crate_of_origin: u32,
|
pub crate_of_origin: u32,
|
||||||
/// The complete source code
|
/// The complete source code
|
||||||
pub src: Option<Rc<String>>,
|
pub src: Option<Rc<String>>,
|
||||||
|
/// The source code's hash
|
||||||
|
pub src_hash: u128,
|
||||||
/// The start position of this source in the CodeMap
|
/// The start position of this source in the CodeMap
|
||||||
pub start_pos: BytePos,
|
pub start_pos: BytePos,
|
||||||
/// The end position of this source in the CodeMap
|
/// The end position of this source in the CodeMap
|
||||||
|
@ -394,9 +396,10 @@ pub struct FileMap {
|
||||||
|
|
||||||
impl Encodable for FileMap {
|
impl Encodable for FileMap {
|
||||||
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
|
fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> {
|
||||||
s.emit_struct("FileMap", 6, |s| {
|
s.emit_struct("FileMap", 7, |s| {
|
||||||
s.emit_struct_field("name", 0, |s| self.name.encode(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("name_was_remapped", 1, |s| self.name_was_remapped.encode(s))?;
|
||||||
|
s.emit_struct_field("src_hash", 6, |s| self.src_hash.encode(s))?;
|
||||||
s.emit_struct_field("start_pos", 2, |s| self.start_pos.encode(s))?;
|
s.emit_struct_field("start_pos", 2, |s| self.start_pos.encode(s))?;
|
||||||
s.emit_struct_field("end_pos", 3, |s| self.end_pos.encode(s))?;
|
s.emit_struct_field("end_pos", 3, |s| self.end_pos.encode(s))?;
|
||||||
s.emit_struct_field("lines", 4, |s| {
|
s.emit_struct_field("lines", 4, |s| {
|
||||||
|
@ -459,7 +462,10 @@ impl Decodable for FileMap {
|
||||||
let name: String = d.read_struct_field("name", 0, |d| Decodable::decode(d))?;
|
let name: String = d.read_struct_field("name", 0, |d| Decodable::decode(d))?;
|
||||||
let name_was_remapped: bool =
|
let name_was_remapped: bool =
|
||||||
d.read_struct_field("name_was_remapped", 1, |d| Decodable::decode(d))?;
|
d.read_struct_field("name_was_remapped", 1, |d| Decodable::decode(d))?;
|
||||||
let start_pos: BytePos = d.read_struct_field("start_pos", 2, |d| Decodable::decode(d))?;
|
let src_hash: u128 =
|
||||||
|
d.read_struct_field("src_hash", 6, |d| Decodable::decode(d))?;
|
||||||
|
let start_pos: BytePos =
|
||||||
|
d.read_struct_field("start_pos", 2, |d| Decodable::decode(d))?;
|
||||||
let end_pos: BytePos = d.read_struct_field("end_pos", 3, |d| Decodable::decode(d))?;
|
let end_pos: BytePos = d.read_struct_field("end_pos", 3, |d| Decodable::decode(d))?;
|
||||||
let lines: Vec<BytePos> = d.read_struct_field("lines", 4, |d| {
|
let lines: Vec<BytePos> = d.read_struct_field("lines", 4, |d| {
|
||||||
let num_lines: u32 = Decodable::decode(d)?;
|
let num_lines: u32 = Decodable::decode(d)?;
|
||||||
|
@ -501,6 +507,7 @@ impl Decodable for FileMap {
|
||||||
start_pos: start_pos,
|
start_pos: start_pos,
|
||||||
end_pos: end_pos,
|
end_pos: end_pos,
|
||||||
src: None,
|
src: None,
|
||||||
|
src_hash: src_hash,
|
||||||
lines: RefCell::new(lines),
|
lines: RefCell::new(lines),
|
||||||
multibyte_chars: RefCell::new(multibyte_chars)
|
multibyte_chars: RefCell::new(multibyte_chars)
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue