diff options
author | Edwin Cheng <[email protected]> | 2020-03-11 03:04:02 +0000 |
---|---|---|
committer | Edwin Cheng <[email protected]> | 2020-03-11 03:04:02 +0000 |
commit | 6ea7c319154f9ec10721f4041afc9d07d6b2476b (patch) | |
tree | bdd64414df9950213cc117e2975d8fd17f85fbfc /crates/ra_db | |
parent | 5a292309c55639a12d10b3c37b9f800d8b802b6d (diff) |
Add extern source
Diffstat (limited to 'crates/ra_db')
-rw-r--r-- | crates/ra_db/src/fixture.rs | 12 | ||||
-rw-r--r-- | crates/ra_db/src/input.rs | 24 | ||||
-rw-r--r-- | crates/ra_db/src/lib.rs | 4 |
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)] |
129 | pub struct Env { | 130 | pub 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)] | ||
138 | pub 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 | ||
288 | impl 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}; | |||
11 | pub use crate::{ | 11 | pub 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 | }; |
18 | pub use relative_path::{RelativePath, RelativePathBuf}; | 18 | pub use relative_path::{RelativePath, RelativePathBuf}; |