summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorInokentiy Babushkin <twk@twki.de>2017-06-10 21:08:32 +0200
committerInokentiy Babushkin <twk@twki.de>2017-06-10 21:08:32 +0200
commitc2c31b2db33e0d0b5356a0c9e032269034cdc70a (patch)
tree4a2ddeafa8e6ff5a359c2bd954831adfbb60663f /src/libsyntax
parentdd8f7cd126403955295c8b0cdbccc5ca5cbef763 (diff)
downloadrust-c2c31b2db33e0d0b5356a0c9e032269034cdc70a.tar.gz
rust-c2c31b2db33e0d0b5356a0c9e032269034cdc70a.zip
Added external crates' sources to FileMap.
They are now handled in their own member to prevent mutating access to
the `src` member. This way, we can safely load external sources, while
keeping the mutation of local source strings off-limits.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/codemap.rs20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/libsyntax/codemap.rs b/src/libsyntax/codemap.rs
index 442b92be1cb..9779a678845 100644
--- a/src/libsyntax/codemap.rs
+++ b/src/libsyntax/codemap.rs
@@ -219,6 +219,7 @@ impl CodeMap {
             crate_of_origin: crate_of_origin,
             src: None,
             src_hash: src_hash,
+            external_src: RefCell::new(ExternalSource::AbsentOk),
             start_pos: start_pos,
             end_pos: end_pos,
             lines: RefCell::new(file_local_lines),
@@ -558,6 +559,25 @@ impl CodeMapper for CodeMap {
         }
         sp
     }
+    fn load_source_for_filemap(&mut self, filename: FileName) -> bool {
+        let file_map = if let Some(fm) = self.get_filemap(&filename) {
+            fm
+        } else {
+            return false;
+        };
+
+        if *file_map.external_src.borrow() == ExternalSource::AbsentOk {
+            let mut external_src = file_map.external_src.borrow_mut();
+            if let Ok(src) = self.file_loader.read_file(Path::new(&filename)) {
+                *external_src = ExternalSource::Present(src);
+                return true;
+            } else {
+                *external_src = ExternalSource::AbsentErr;
+            }
+        }
+
+        false
+    }
 }
 
 #[derive(Clone)]