aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_db
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2020-03-11 03:04:02 +0000
committerEdwin Cheng <[email protected]>2020-03-11 03:04:02 +0000
commit6ea7c319154f9ec10721f4041afc9d07d6b2476b (patch)
treebdd64414df9950213cc117e2975d8fd17f85fbfc /crates/ra_db
parent5a292309c55639a12d10b3c37b9f800d8b802b6d (diff)
Add extern source
Diffstat (limited to 'crates/ra_db')
-rw-r--r--crates/ra_db/src/fixture.rs12
-rw-r--r--crates/ra_db/src/input.rs24
-rw-r--r--crates/ra_db/src/lib.rs4
3 files changed, 33 insertions, 7 deletions
diff --git a/crates/ra_db/src/fixture.rs b/crates/ra_db/src/fixture.rs
index 7f43c2971..3dc86ca2d 100644
--- a/crates/ra_db/src/fixture.rs
+++ b/crates/ra_db/src/fixture.rs
@@ -61,7 +61,14 @@ fn with_single_file(db: &mut dyn SourceDatabaseExt, ra_fixture: &str) -> FileId
61 }; 61 };
62 62
63 let mut crate_graph = CrateGraph::default(); 63 let mut crate_graph = CrateGraph::default();
64 crate_graph.add_crate_root(file_id, meta.edition, meta.krate, meta.cfg, meta.env); 64 crate_graph.add_crate_root(
65 file_id,
66 meta.edition,
67 meta.krate,
68 meta.cfg,
69 meta.env,
70 Default::default(),
71 );
65 crate_graph 72 crate_graph
66 } else { 73 } else {
67 let mut crate_graph = CrateGraph::default(); 74 let mut crate_graph = CrateGraph::default();
@@ -71,6 +78,7 @@ fn with_single_file(db: &mut dyn SourceDatabaseExt, ra_fixture: &str) -> FileId
71 None, 78 None,
72 CfgOptions::default(), 79 CfgOptions::default(),
73 Env::default(), 80 Env::default(),
81 Default::default(),
74 ); 82 );
75 crate_graph 83 crate_graph
76 }; 84 };
@@ -119,6 +127,7 @@ fn with_files(db: &mut dyn SourceDatabaseExt, fixture: &str) -> Option<FilePosit
119 Some(krate.clone()), 127 Some(krate.clone()),
120 meta.cfg, 128 meta.cfg,
121 meta.env, 129 meta.env,
130 Default::default(),
122 ); 131 );
123 let prev = crates.insert(krate.clone(), crate_id); 132 let prev = crates.insert(krate.clone(), crate_id);
124 assert!(prev.is_none()); 133 assert!(prev.is_none());
@@ -155,6 +164,7 @@ fn with_files(db: &mut dyn SourceDatabaseExt, fixture: &str) -> Option<FilePosit
155 None, 164 None,
156 CfgOptions::default(), 165 CfgOptions::default(),
157 Env::default(), 166 Env::default(),
167 Default::default(),
158 ); 168 );
159 } else { 169 } else {
160 for (from, to) in crate_deps { 170 for (from, to) in crate_deps {
diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs
index 18d8e2a53..06d40db96 100644
--- a/crates/ra_db/src/input.rs
+++ b/crates/ra_db/src/input.rs
@@ -113,6 +113,7 @@ pub struct CrateData {
113 pub display_name: Option<String>, 113 pub display_name: Option<String>,
114 pub cfg_options: CfgOptions, 114 pub cfg_options: CfgOptions,
115 pub env: Env, 115 pub env: Env,
116 pub extern_source: ExternSource,
116 pub dependencies: Vec<Dependency>, 117 pub dependencies: Vec<Dependency>,
117} 118}
118 119
@@ -128,9 +129,13 @@ pub struct ExternSourceId(pub u32);
128#[derive(Default, Debug, Clone, PartialEq, Eq)] 129#[derive(Default, Debug, Clone, PartialEq, Eq)]
129pub struct Env { 130pub struct Env {
130 entries: FxHashMap<String, String>, 131 entries: FxHashMap<String, String>,
132}
131 133
132 // Note: Some env variables (e.g. OUT_DIR) are located outside of the 134// FIXME: Redesign vfs for solve the following limitation ?
133 // crate. We store a map to allow remap it to ExternSourceId 135// Note: Some env variables (e.g. OUT_DIR) are located outside of the
136// crate. We store a map to allow remap it to ExternSourceId
137#[derive(Default, Debug, Clone, PartialEq, Eq)]
138pub struct ExternSource {
134 extern_paths: FxHashMap<String, ExternSourceId>, 139 extern_paths: FxHashMap<String, ExternSourceId>,
135} 140}
136 141
@@ -148,6 +153,7 @@ impl CrateGraph {
148 display_name: Option<String>, 153 display_name: Option<String>,
149 cfg_options: CfgOptions, 154 cfg_options: CfgOptions,
150 env: Env, 155 env: Env,
156 extern_source: ExternSource,
151 ) -> CrateId { 157 ) -> CrateId {
152 let data = CrateData { 158 let data = CrateData {
153 root_file_id: file_id, 159 root_file_id: file_id,
@@ -155,6 +161,7 @@ impl CrateGraph {
155 display_name, 161 display_name,
156 cfg_options, 162 cfg_options,
157 env, 163 env,
164 extern_source,
158 dependencies: Vec::new(), 165 dependencies: Vec::new(),
159 }; 166 };
160 let crate_id = CrateId(self.arena.len() as u32); 167 let crate_id = CrateId(self.arena.len() as u32);
@@ -276,7 +283,9 @@ impl Env {
276 pub fn get(&self, env: &str) -> Option<String> { 283 pub fn get(&self, env: &str) -> Option<String> {
277 self.entries.get(env).cloned() 284 self.entries.get(env).cloned()
278 } 285 }
286}
279 287
288impl ExternSource {
280 pub fn extern_path(&self, path: &str) -> Option<(ExternSourceId, RelativePathBuf)> { 289 pub fn extern_path(&self, path: &str) -> Option<(ExternSourceId, RelativePathBuf)> {
281 self.extern_paths.iter().find_map(|(root_path, id)| { 290 self.extern_paths.iter().find_map(|(root_path, id)| {
282 if path.starts_with(root_path) { 291 if path.starts_with(root_path) {
@@ -292,8 +301,7 @@ impl Env {
292 }) 301 })
293 } 302 }
294 303
295 pub fn set_extern_path(&mut self, env: &str, root_path: &str, root: ExternSourceId) { 304 pub fn set_extern_path(&mut self, root_path: &str, root: ExternSourceId) {
296 self.entries.insert(env.to_owned(), root_path.to_owned());
297 self.extern_paths.insert(root_path.to_owned(), root); 305 self.extern_paths.insert(root_path.to_owned(), root);
298 } 306 }
299} 307}
@@ -327,6 +335,7 @@ mod tests {
327 None, 335 None,
328 CfgOptions::default(), 336 CfgOptions::default(),
329 Env::default(), 337 Env::default(),
338 Default::default(),
330 ); 339 );
331 let crate2 = graph.add_crate_root( 340 let crate2 = graph.add_crate_root(
332 FileId(2u32), 341 FileId(2u32),
@@ -334,6 +343,7 @@ mod tests {
334 None, 343 None,
335 CfgOptions::default(), 344 CfgOptions::default(),
336 Env::default(), 345 Env::default(),
346 Default::default(),
337 ); 347 );
338 let crate3 = graph.add_crate_root( 348 let crate3 = graph.add_crate_root(
339 FileId(3u32), 349 FileId(3u32),
@@ -341,6 +351,7 @@ mod tests {
341 None, 351 None,
342 CfgOptions::default(), 352 CfgOptions::default(),
343 Env::default(), 353 Env::default(),
354 Default::default(),
344 ); 355 );
345 assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); 356 assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
346 assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); 357 assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
@@ -356,6 +367,7 @@ mod tests {
356 None, 367 None,
357 CfgOptions::default(), 368 CfgOptions::default(),
358 Env::default(), 369 Env::default(),
370 Default::default(),
359 ); 371 );
360 let crate2 = graph.add_crate_root( 372 let crate2 = graph.add_crate_root(
361 FileId(2u32), 373 FileId(2u32),
@@ -363,6 +375,7 @@ mod tests {
363 None, 375 None,
364 CfgOptions::default(), 376 CfgOptions::default(),
365 Env::default(), 377 Env::default(),
378 Default::default(),
366 ); 379 );
367 let crate3 = graph.add_crate_root( 380 let crate3 = graph.add_crate_root(
368 FileId(3u32), 381 FileId(3u32),
@@ -370,6 +383,7 @@ mod tests {
370 None, 383 None,
371 CfgOptions::default(), 384 CfgOptions::default(),
372 Env::default(), 385 Env::default(),
386 Default::default(),
373 ); 387 );
374 assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); 388 assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
375 assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); 389 assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
@@ -384,6 +398,7 @@ mod tests {
384 None, 398 None,
385 CfgOptions::default(), 399 CfgOptions::default(),
386 Env::default(), 400 Env::default(),
401 Default::default(),
387 ); 402 );
388 let crate2 = graph.add_crate_root( 403 let crate2 = graph.add_crate_root(
389 FileId(2u32), 404 FileId(2u32),
@@ -391,6 +406,7 @@ mod tests {
391 None, 406 None,
392 CfgOptions::default(), 407 CfgOptions::default(),
393 Env::default(), 408 Env::default(),
409 Default::default(),
394 ); 410 );
395 assert!(graph 411 assert!(graph
396 .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2) 412 .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
diff --git a/crates/ra_db/src/lib.rs b/crates/ra_db/src/lib.rs
index 9bf3fe248..d500d5e85 100644
--- a/crates/ra_db/src/lib.rs
+++ b/crates/ra_db/src/lib.rs
@@ -11,8 +11,8 @@ use ra_syntax::{ast, Parse, SourceFile, TextRange, TextUnit};
11pub use crate::{ 11pub use crate::{
12 cancellation::Canceled, 12 cancellation::Canceled,
13 input::{ 13 input::{
14 CrateGraph, CrateId, CrateName, Dependency, Edition, Env, ExternSourceId, FileId, 14 CrateGraph, CrateId, CrateName, Dependency, Edition, Env, ExternSource, ExternSourceId,
15 SourceRoot, SourceRootId, 15 FileId, SourceRoot, SourceRootId,
16 }, 16 },
17}; 17};
18pub use relative_path::{RelativePath, RelativePathBuf}; 18pub use relative_path::{RelativePath, RelativePathBuf};