aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_db/src/input.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_db/src/input.rs')
-rw-r--r--crates/ra_db/src/input.rs53
1 files changed, 53 insertions, 0 deletions
diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs
index b77640b2b..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
@@ -122,11 +123,22 @@ pub enum Edition {
122 Edition2015, 123 Edition2015,
123} 124}
124 125
126#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
127pub struct ExternSourceId(pub u32);
128
125#[derive(Default, Debug, Clone, PartialEq, Eq)] 129#[derive(Default, Debug, Clone, PartialEq, Eq)]
126pub struct Env { 130pub struct Env {
127 entries: FxHashMap<String, String>, 131 entries: FxHashMap<String, String>,
128} 132}
129 133
134// FIXME: Redesign vfs for solve the following limitation ?
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 {
139 extern_paths: FxHashMap<String, ExternSourceId>,
140}
141
130#[derive(Debug, Clone, PartialEq, Eq)] 142#[derive(Debug, Clone, PartialEq, Eq)]
131pub struct Dependency { 143pub struct Dependency {
132 pub crate_id: CrateId, 144 pub crate_id: CrateId,
@@ -141,6 +153,7 @@ impl CrateGraph {
141 display_name: Option<String>, 153 display_name: Option<String>,
142 cfg_options: CfgOptions, 154 cfg_options: CfgOptions,
143 env: Env, 155 env: Env,
156 extern_source: ExternSource,
144 ) -> CrateId { 157 ) -> CrateId {
145 let data = CrateData { 158 let data = CrateData {
146 root_file_id: file_id, 159 root_file_id: file_id,
@@ -148,6 +161,7 @@ impl CrateGraph {
148 display_name, 161 display_name,
149 cfg_options, 162 cfg_options,
150 env, 163 env,
164 extern_source,
151 dependencies: Vec::new(), 165 dependencies: Vec::new(),
152 }; 166 };
153 let crate_id = CrateId(self.arena.len() as u32); 167 let crate_id = CrateId(self.arena.len() as u32);
@@ -261,6 +275,37 @@ impl fmt::Display for Edition {
261 } 275 }
262} 276}
263 277
278impl Env {
279 pub fn set(&mut self, env: &str, value: String) {
280 self.entries.insert(env.to_owned(), value);
281 }
282
283 pub fn get(&self, env: &str) -> Option<String> {
284 self.entries.get(env).cloned()
285 }
286}
287
288impl ExternSource {
289 pub fn extern_path(&self, path: &str) -> Option<(ExternSourceId, RelativePathBuf)> {
290 self.extern_paths.iter().find_map(|(root_path, id)| {
291 if path.starts_with(root_path) {
292 let mut rel_path = &path[root_path.len()..];
293 if rel_path.starts_with("/") {
294 rel_path = &rel_path[1..];
295 }
296 let rel_path = RelativePathBuf::from_path(rel_path).ok()?;
297 Some((id.clone(), rel_path))
298 } else {
299 None
300 }
301 })
302 }
303
304 pub fn set_extern_path(&mut self, root_path: &str, root: ExternSourceId) {
305 self.extern_paths.insert(root_path.to_owned(), root);
306 }
307}
308
264#[derive(Debug)] 309#[derive(Debug)]
265pub struct ParseEditionError { 310pub struct ParseEditionError {
266 invalid_input: String, 311 invalid_input: String,
@@ -290,6 +335,7 @@ mod tests {
290 None, 335 None,
291 CfgOptions::default(), 336 CfgOptions::default(),
292 Env::default(), 337 Env::default(),
338 Default::default(),
293 ); 339 );
294 let crate2 = graph.add_crate_root( 340 let crate2 = graph.add_crate_root(
295 FileId(2u32), 341 FileId(2u32),
@@ -297,6 +343,7 @@ mod tests {
297 None, 343 None,
298 CfgOptions::default(), 344 CfgOptions::default(),
299 Env::default(), 345 Env::default(),
346 Default::default(),
300 ); 347 );
301 let crate3 = graph.add_crate_root( 348 let crate3 = graph.add_crate_root(
302 FileId(3u32), 349 FileId(3u32),
@@ -304,6 +351,7 @@ mod tests {
304 None, 351 None,
305 CfgOptions::default(), 352 CfgOptions::default(),
306 Env::default(), 353 Env::default(),
354 Default::default(),
307 ); 355 );
308 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());
309 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());
@@ -319,6 +367,7 @@ mod tests {
319 None, 367 None,
320 CfgOptions::default(), 368 CfgOptions::default(),
321 Env::default(), 369 Env::default(),
370 Default::default(),
322 ); 371 );
323 let crate2 = graph.add_crate_root( 372 let crate2 = graph.add_crate_root(
324 FileId(2u32), 373 FileId(2u32),
@@ -326,6 +375,7 @@ mod tests {
326 None, 375 None,
327 CfgOptions::default(), 376 CfgOptions::default(),
328 Env::default(), 377 Env::default(),
378 Default::default(),
329 ); 379 );
330 let crate3 = graph.add_crate_root( 380 let crate3 = graph.add_crate_root(
331 FileId(3u32), 381 FileId(3u32),
@@ -333,6 +383,7 @@ mod tests {
333 None, 383 None,
334 CfgOptions::default(), 384 CfgOptions::default(),
335 Env::default(), 385 Env::default(),
386 Default::default(),
336 ); 387 );
337 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());
338 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());
@@ -347,6 +398,7 @@ mod tests {
347 None, 398 None,
348 CfgOptions::default(), 399 CfgOptions::default(),
349 Env::default(), 400 Env::default(),
401 Default::default(),
350 ); 402 );
351 let crate2 = graph.add_crate_root( 403 let crate2 = graph.add_crate_root(
352 FileId(2u32), 404 FileId(2u32),
@@ -354,6 +406,7 @@ mod tests {
354 None, 406 None,
355 CfgOptions::default(), 407 CfgOptions::default(),
356 Env::default(), 408 Env::default(),
409 Default::default(),
357 ); 410 );
358 assert!(graph 411 assert!(graph
359 .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2) 412 .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)