incr.comp.: Hash more pieces of crate metadata to detect changes there.
This commit is contained in:
@@ -21,8 +21,8 @@ pub use syntax_pos::*;
|
||||
pub use syntax_pos::hygiene::{ExpnFormat, ExpnInfo, NameAndSpan};
|
||||
pub use self::ExpnFormat::*;
|
||||
|
||||
use std::cell::RefCell;
|
||||
use std::path::{Path,PathBuf};
|
||||
use std::cell::{RefCell, Ref};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::rc::Rc;
|
||||
|
||||
use std::env;
|
||||
@@ -103,11 +103,18 @@ impl FileLoader for RealFileLoader {
|
||||
//
|
||||
|
||||
pub struct CodeMap {
|
||||
pub files: RefCell<Vec<Rc<FileMap>>>,
|
||||
// The `files` field should not be visible outside of libsyntax so that we
|
||||
// can do proper dependency tracking.
|
||||
pub(super) files: RefCell<Vec<Rc<FileMap>>>,
|
||||
file_loader: Box<FileLoader>,
|
||||
// This is used to apply the file path remapping as specified via
|
||||
// -Zremap-path-prefix to all FileMaps allocated within this CodeMap.
|
||||
path_mapping: FilePathMapping,
|
||||
// The CodeMap will invoke this callback whenever a specific FileMap is
|
||||
// accessed. The callback starts out as a no-op but when the dependency
|
||||
// graph becomes available later during the compilation process, it is
|
||||
// be replaced with something that notifies the dep-tracking system.
|
||||
dep_tracking_callback: RefCell<Box<Fn(&FileMap)>>,
|
||||
}
|
||||
|
||||
impl CodeMap {
|
||||
@@ -116,6 +123,7 @@ impl CodeMap {
|
||||
files: RefCell::new(Vec::new()),
|
||||
file_loader: Box::new(RealFileLoader),
|
||||
path_mapping: path_mapping,
|
||||
dep_tracking_callback: RefCell::new(Box::new(|_| {})),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -126,6 +134,7 @@ impl CodeMap {
|
||||
files: RefCell::new(Vec::new()),
|
||||
file_loader: file_loader,
|
||||
path_mapping: path_mapping,
|
||||
dep_tracking_callback: RefCell::new(Box::new(|_| {})),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,6 +142,10 @@ impl CodeMap {
|
||||
&self.path_mapping
|
||||
}
|
||||
|
||||
pub fn set_dep_tracking_callback(&self, cb: Box<Fn(&FileMap)>) {
|
||||
*self.dep_tracking_callback.borrow_mut() = cb;
|
||||
}
|
||||
|
||||
pub fn file_exists(&self, path: &Path) -> bool {
|
||||
self.file_loader.file_exists(path)
|
||||
}
|
||||
@@ -142,6 +155,19 @@ impl CodeMap {
|
||||
Ok(self.new_filemap(path.to_str().unwrap().to_string(), src))
|
||||
}
|
||||
|
||||
pub fn files(&self) -> Ref<Vec<Rc<FileMap>>> {
|
||||
let files = self.files.borrow();
|
||||
for file in files.iter() {
|
||||
(self.dep_tracking_callback.borrow())(file);
|
||||
}
|
||||
files
|
||||
}
|
||||
|
||||
/// Only use this if you do your own dependency tracking!
|
||||
pub fn files_untracked(&self) -> Ref<Vec<Rc<FileMap>>> {
|
||||
self.files.borrow()
|
||||
}
|
||||
|
||||
fn next_start_pos(&self) -> usize {
|
||||
let files = self.files.borrow();
|
||||
match files.last() {
|
||||
@@ -170,6 +196,7 @@ impl CodeMap {
|
||||
let filemap = Rc::new(FileMap {
|
||||
name: filename,
|
||||
name_was_remapped: was_remapped,
|
||||
crate_of_origin: 0,
|
||||
src: Some(Rc::new(src)),
|
||||
start_pos: Pos::from_usize(start_pos),
|
||||
end_pos: Pos::from_usize(end_pos),
|
||||
@@ -204,6 +231,7 @@ impl CodeMap {
|
||||
pub fn new_imported_filemap(&self,
|
||||
filename: FileName,
|
||||
name_was_remapped: bool,
|
||||
crate_of_origin: u32,
|
||||
source_len: usize,
|
||||
mut file_local_lines: Vec<BytePos>,
|
||||
mut file_local_multibyte_chars: Vec<MultiByteChar>)
|
||||
@@ -225,6 +253,7 @@ impl CodeMap {
|
||||
let filemap = Rc::new(FileMap {
|
||||
name: filename,
|
||||
name_was_remapped: name_was_remapped,
|
||||
crate_of_origin: crate_of_origin,
|
||||
src: None,
|
||||
start_pos: start_pos,
|
||||
end_pos: end_pos,
|
||||
@@ -282,6 +311,8 @@ impl CodeMap {
|
||||
let files = self.files.borrow();
|
||||
let f = (*files)[idx].clone();
|
||||
|
||||
(self.dep_tracking_callback.borrow())(&f);
|
||||
|
||||
match f.lookup_line(pos) {
|
||||
Some(line) => Ok(FileMapAndLine { fm: f, line: line }),
|
||||
None => Err(f)
|
||||
@@ -471,6 +502,7 @@ impl CodeMap {
|
||||
pub fn get_filemap(&self, filename: &str) -> Option<Rc<FileMap>> {
|
||||
for fm in self.files.borrow().iter() {
|
||||
if filename == fm.name {
|
||||
(self.dep_tracking_callback.borrow())(&fm);
|
||||
return Some(fm.clone());
|
||||
}
|
||||
}
|
||||
@@ -481,6 +513,7 @@ impl CodeMap {
|
||||
pub fn lookup_byte_offset(&self, bpos: BytePos) -> FileMapAndBytePos {
|
||||
let idx = self.lookup_filemap_idx(bpos);
|
||||
let fm = (*self.files.borrow())[idx].clone();
|
||||
(self.dep_tracking_callback.borrow())(&fm);
|
||||
let offset = bpos - fm.start_pos;
|
||||
FileMapAndBytePos {fm: fm, pos: offset}
|
||||
}
|
||||
@@ -491,6 +524,8 @@ impl CodeMap {
|
||||
let files = self.files.borrow();
|
||||
let map = &(*files)[idx];
|
||||
|
||||
(self.dep_tracking_callback.borrow())(map);
|
||||
|
||||
// The number of extra bytes due to multibyte chars in the FileMap
|
||||
let mut total_extra_bytes = 0;
|
||||
|
||||
@@ -536,7 +571,7 @@ impl CodeMap {
|
||||
}
|
||||
|
||||
pub fn count_lines(&self) -> usize {
|
||||
self.files.borrow().iter().fold(0, |a, f| a + f.count_lines())
|
||||
self.files().iter().fold(0, |a, f| a + f.count_lines())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user