diff options
-rw-r--r-- | crates/base_db/src/fixture.rs | 5 | ||||
-rw-r--r-- | crates/base_db/src/input.rs | 26 | ||||
-rw-r--r-- | crates/hir/src/lib.rs | 4 | ||||
-rw-r--r-- | crates/ide/src/lib.rs | 2 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/attribute/cfg.rs | 18 | ||||
-rw-r--r-- | crates/project_model/src/workspace.rs | 15 |
6 files changed, 32 insertions, 38 deletions
diff --git a/crates/base_db/src/fixture.rs b/crates/base_db/src/fixture.rs index 6d3b1266e..7d5d12e63 100644 --- a/crates/base_db/src/fixture.rs +++ b/crates/base_db/src/fixture.rs | |||
@@ -128,10 +128,10 @@ impl ChangeFixture { | |||
128 | file_id, | 128 | file_id, |
129 | meta.edition, | 129 | meta.edition, |
130 | Some(crate_name.clone().into()), | 130 | Some(crate_name.clone().into()), |
131 | meta.cfg.clone(), | ||
131 | meta.cfg, | 132 | meta.cfg, |
132 | meta.env, | 133 | meta.env, |
133 | Default::default(), | 134 | Default::default(), |
134 | Default::default(), | ||
135 | ); | 135 | ); |
136 | let prev = crates.insert(crate_name.clone(), crate_id); | 136 | let prev = crates.insert(crate_name.clone(), crate_id); |
137 | assert!(prev.is_none()); | 137 | assert!(prev.is_none()); |
@@ -158,10 +158,10 @@ impl ChangeFixture { | |||
158 | crate_root, | 158 | crate_root, |
159 | Edition::Edition2018, | 159 | Edition::Edition2018, |
160 | Some(CrateName::new("test").unwrap().into()), | 160 | Some(CrateName::new("test").unwrap().into()), |
161 | default_cfg.clone(), | ||
161 | default_cfg, | 162 | default_cfg, |
162 | Env::default(), | 163 | Env::default(), |
163 | Default::default(), | 164 | Default::default(), |
164 | Default::default(), | ||
165 | ); | 165 | ); |
166 | } else { | 166 | } else { |
167 | for (from, to) in crate_deps { | 167 | for (from, to) in crate_deps { |
@@ -188,6 +188,7 @@ impl ChangeFixture { | |||
188 | Edition::Edition2021, | 188 | Edition::Edition2021, |
189 | Some(CrateDisplayName::from_canonical_name("core".to_string())), | 189 | Some(CrateDisplayName::from_canonical_name("core".to_string())), |
190 | CfgOptions::default(), | 190 | CfgOptions::default(), |
191 | CfgOptions::default(), | ||
191 | Env::default(), | 192 | Env::default(), |
192 | Vec::new(), | 193 | Vec::new(), |
193 | ); | 194 | ); |
diff --git a/crates/base_db/src/input.rs b/crates/base_db/src/input.rs index d99388f71..0c51a59a0 100644 --- a/crates/base_db/src/input.rs +++ b/crates/base_db/src/input.rs | |||
@@ -189,10 +189,10 @@ pub struct CrateData { | |||
189 | /// `Dependency` matters), this name should only be used for UI. | 189 | /// `Dependency` matters), this name should only be used for UI. |
190 | pub display_name: Option<CrateDisplayName>, | 190 | pub display_name: Option<CrateDisplayName>, |
191 | pub cfg_options: CfgOptions, | 191 | pub cfg_options: CfgOptions, |
192 | pub potential_cfg_options: CfgOptions, | ||
192 | pub env: Env, | 193 | pub env: Env, |
193 | pub dependencies: Vec<Dependency>, | 194 | pub dependencies: Vec<Dependency>, |
194 | pub proc_macro: Vec<ProcMacro>, | 195 | pub proc_macro: Vec<ProcMacro>, |
195 | pub features: FxHashMap<String, Vec<String>>, | ||
196 | } | 196 | } |
197 | 197 | ||
198 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 198 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
@@ -220,19 +220,19 @@ impl CrateGraph { | |||
220 | edition: Edition, | 220 | edition: Edition, |
221 | display_name: Option<CrateDisplayName>, | 221 | display_name: Option<CrateDisplayName>, |
222 | cfg_options: CfgOptions, | 222 | cfg_options: CfgOptions, |
223 | potential_cfg_options: CfgOptions, | ||
223 | env: Env, | 224 | env: Env, |
224 | proc_macro: Vec<ProcMacro>, | 225 | proc_macro: Vec<ProcMacro>, |
225 | features: FxHashMap<String, Vec<String>>, | ||
226 | ) -> CrateId { | 226 | ) -> CrateId { |
227 | let data = CrateData { | 227 | let data = CrateData { |
228 | root_file_id: file_id, | 228 | root_file_id: file_id, |
229 | edition, | 229 | edition, |
230 | display_name, | 230 | display_name, |
231 | cfg_options, | 231 | cfg_options, |
232 | potential_cfg_options, | ||
232 | env, | 233 | env, |
233 | proc_macro, | 234 | proc_macro, |
234 | dependencies: Vec::new(), | 235 | dependencies: Vec::new(), |
235 | features, | ||
236 | }; | 236 | }; |
237 | let crate_id = CrateId(self.arena.len() as u32); | 237 | let crate_id = CrateId(self.arena.len() as u32); |
238 | let prev = self.arena.insert(crate_id, data); | 238 | let prev = self.arena.insert(crate_id, data); |
@@ -507,27 +507,27 @@ mod tests { | |||
507 | Edition2018, | 507 | Edition2018, |
508 | None, | 508 | None, |
509 | CfgOptions::default(), | 509 | CfgOptions::default(), |
510 | CfgOptions::default(), | ||
510 | Env::default(), | 511 | Env::default(), |
511 | Default::default(), | 512 | Default::default(), |
512 | Default::default(), | ||
513 | ); | 513 | ); |
514 | let crate2 = graph.add_crate_root( | 514 | let crate2 = graph.add_crate_root( |
515 | FileId(2u32), | 515 | FileId(2u32), |
516 | Edition2018, | 516 | Edition2018, |
517 | None, | 517 | None, |
518 | CfgOptions::default(), | 518 | CfgOptions::default(), |
519 | CfgOptions::default(), | ||
519 | Env::default(), | 520 | Env::default(), |
520 | Default::default(), | 521 | Default::default(), |
521 | Default::default(), | ||
522 | ); | 522 | ); |
523 | let crate3 = graph.add_crate_root( | 523 | let crate3 = graph.add_crate_root( |
524 | FileId(3u32), | 524 | FileId(3u32), |
525 | Edition2018, | 525 | Edition2018, |
526 | None, | 526 | None, |
527 | CfgOptions::default(), | 527 | CfgOptions::default(), |
528 | CfgOptions::default(), | ||
528 | Env::default(), | 529 | Env::default(), |
529 | Default::default(), | 530 | Default::default(), |
530 | Default::default(), | ||
531 | ); | 531 | ); |
532 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); | 532 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); |
533 | assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); | 533 | assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); |
@@ -542,18 +542,18 @@ mod tests { | |||
542 | Edition2018, | 542 | Edition2018, |
543 | None, | 543 | None, |
544 | CfgOptions::default(), | 544 | CfgOptions::default(), |
545 | CfgOptions::default(), | ||
545 | Env::default(), | 546 | Env::default(), |
546 | Default::default(), | 547 | Default::default(), |
547 | Default::default(), | ||
548 | ); | 548 | ); |
549 | let crate2 = graph.add_crate_root( | 549 | let crate2 = graph.add_crate_root( |
550 | FileId(2u32), | 550 | FileId(2u32), |
551 | Edition2018, | 551 | Edition2018, |
552 | None, | 552 | None, |
553 | CfgOptions::default(), | 553 | CfgOptions::default(), |
554 | CfgOptions::default(), | ||
554 | Env::default(), | 555 | Env::default(), |
555 | Default::default(), | 556 | Default::default(), |
556 | Default::default(), | ||
557 | ); | 557 | ); |
558 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); | 558 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); |
559 | assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err()); | 559 | assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err()); |
@@ -567,27 +567,27 @@ mod tests { | |||
567 | Edition2018, | 567 | Edition2018, |
568 | None, | 568 | None, |
569 | CfgOptions::default(), | 569 | CfgOptions::default(), |
570 | CfgOptions::default(), | ||
570 | Env::default(), | 571 | Env::default(), |
571 | Default::default(), | 572 | Default::default(), |
572 | Default::default(), | ||
573 | ); | 573 | ); |
574 | let crate2 = graph.add_crate_root( | 574 | let crate2 = graph.add_crate_root( |
575 | FileId(2u32), | 575 | FileId(2u32), |
576 | Edition2018, | 576 | Edition2018, |
577 | None, | 577 | None, |
578 | CfgOptions::default(), | 578 | CfgOptions::default(), |
579 | CfgOptions::default(), | ||
579 | Env::default(), | 580 | Env::default(), |
580 | Default::default(), | 581 | Default::default(), |
581 | Default::default(), | ||
582 | ); | 582 | ); |
583 | let crate3 = graph.add_crate_root( | 583 | let crate3 = graph.add_crate_root( |
584 | FileId(3u32), | 584 | FileId(3u32), |
585 | Edition2018, | 585 | Edition2018, |
586 | None, | 586 | None, |
587 | CfgOptions::default(), | 587 | CfgOptions::default(), |
588 | CfgOptions::default(), | ||
588 | Env::default(), | 589 | Env::default(), |
589 | Default::default(), | 590 | Default::default(), |
590 | Default::default(), | ||
591 | ); | 591 | ); |
592 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); | 592 | assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok()); |
593 | assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); | 593 | assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok()); |
@@ -601,18 +601,18 @@ mod tests { | |||
601 | Edition2018, | 601 | Edition2018, |
602 | None, | 602 | None, |
603 | CfgOptions::default(), | 603 | CfgOptions::default(), |
604 | CfgOptions::default(), | ||
604 | Env::default(), | 605 | Env::default(), |
605 | Default::default(), | 606 | Default::default(), |
606 | Default::default(), | ||
607 | ); | 607 | ); |
608 | let crate2 = graph.add_crate_root( | 608 | let crate2 = graph.add_crate_root( |
609 | FileId(2u32), | 609 | FileId(2u32), |
610 | Edition2018, | 610 | Edition2018, |
611 | None, | 611 | None, |
612 | CfgOptions::default(), | 612 | CfgOptions::default(), |
613 | CfgOptions::default(), | ||
613 | Env::default(), | 614 | Env::default(), |
614 | Default::default(), | 615 | Default::default(), |
615 | Default::default(), | ||
616 | ); | 616 | ); |
617 | assert!(graph | 617 | assert!(graph |
618 | .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2) | 618 | .add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2) |
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 2b2aaec94..30cc34403 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs | |||
@@ -234,8 +234,8 @@ impl Crate { | |||
234 | db.crate_graph()[self.id].cfg_options.clone() | 234 | db.crate_graph()[self.id].cfg_options.clone() |
235 | } | 235 | } |
236 | 236 | ||
237 | pub fn features(&self, db: &dyn HirDatabase) -> Vec<String> { | 237 | pub fn potential_cfg(&self, db: &dyn HirDatabase) -> CfgOptions { |
238 | db.crate_graph()[self.id].features.iter().map(|(feat, _)| feat.clone()).collect() | 238 | db.crate_graph()[self.id].potential_cfg_options.clone() |
239 | } | 239 | } |
240 | } | 240 | } |
241 | 241 | ||
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs index 0693869a2..aac084012 100644 --- a/crates/ide/src/lib.rs +++ b/crates/ide/src/lib.rs | |||
@@ -217,10 +217,10 @@ impl Analysis { | |||
217 | file_id, | 217 | file_id, |
218 | Edition::Edition2018, | 218 | Edition::Edition2018, |
219 | None, | 219 | None, |
220 | cfg_options.clone(), | ||
220 | cfg_options, | 221 | cfg_options, |
221 | Env::default(), | 222 | Env::default(), |
222 | Default::default(), | 223 | Default::default(), |
223 | Default::default(), | ||
224 | ); | 224 | ); |
225 | change.change_file(file_id, Some(Arc::new(text))); | 225 | change.change_file(file_id, Some(Arc::new(text))); |
226 | change.set_crate_graph(crate_graph); | 226 | change.set_crate_graph(crate_graph); |
diff --git a/crates/ide_completion/src/completions/attribute/cfg.rs b/crates/ide_completion/src/completions/attribute/cfg.rs index 71e659563..847e6529a 100644 --- a/crates/ide_completion/src/completions/attribute/cfg.rs +++ b/crates/ide_completion/src/completions/attribute/cfg.rs | |||
@@ -26,20 +26,6 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) { | |||
26 | .find(|t| matches!(t.kind(), SyntaxKind::IDENT)); | 26 | .find(|t| matches!(t.kind(), SyntaxKind::IDENT)); |
27 | 27 | ||
28 | match previous.as_ref().map(|p| p.text()) { | 28 | match previous.as_ref().map(|p| p.text()) { |
29 | Some("feature") => { | ||
30 | ctx.krate.map(|krate| { | ||
31 | krate.features(ctx.db).iter().for_each(|f| { | ||
32 | let mut item = CompletionItem::new( | ||
33 | CompletionKind::Attribute, | ||
34 | ctx.source_range(), | ||
35 | f.clone(), | ||
36 | ); | ||
37 | item.insert_text(format!(r#""{}""#, f)); | ||
38 | |||
39 | acc.add(item.build()) | ||
40 | }) | ||
41 | }); | ||
42 | } | ||
43 | Some("target_arch") => KNOWN_ARCH.iter().for_each(add_completion), | 29 | Some("target_arch") => KNOWN_ARCH.iter().for_each(add_completion), |
44 | Some("target_env") => KNOWN_ENV.iter().for_each(add_completion), | 30 | Some("target_env") => KNOWN_ENV.iter().for_each(add_completion), |
45 | Some("target_os") => KNOWN_OS.iter().for_each(add_completion), | 31 | Some("target_os") => KNOWN_OS.iter().for_each(add_completion), |
@@ -47,7 +33,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) { | |||
47 | Some("target_endian") => ["little", "big"].iter().for_each(add_completion), | 33 | Some("target_endian") => ["little", "big"].iter().for_each(add_completion), |
48 | Some(name) => { | 34 | Some(name) => { |
49 | ctx.krate.map(|krate| { | 35 | ctx.krate.map(|krate| { |
50 | krate.cfg(ctx.db).get_cfg_values(&name).iter().for_each(|s| { | 36 | krate.potential_cfg(ctx.db).get_cfg_values(&name).iter().for_each(|s| { |
51 | let mut item = CompletionItem::new( | 37 | let mut item = CompletionItem::new( |
52 | CompletionKind::Attribute, | 38 | CompletionKind::Attribute, |
53 | ctx.source_range(), | 39 | ctx.source_range(), |
@@ -61,7 +47,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) { | |||
61 | } | 47 | } |
62 | None => { | 48 | None => { |
63 | ctx.krate.map(|krate| { | 49 | ctx.krate.map(|krate| { |
64 | krate.cfg(ctx.db).get_cfg_keys().iter().for_each(|s| { | 50 | krate.potential_cfg(ctx.db).get_cfg_keys().iter().for_each(|s| { |
65 | let item = CompletionItem::new( | 51 | let item = CompletionItem::new( |
66 | CompletionKind::Attribute, | 52 | CompletionKind::Attribute, |
67 | ctx.source_range(), | 53 | ctx.source_range(), |
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs index 9ee3fc1a3..e67ba2bd9 100644 --- a/crates/project_model/src/workspace.rs +++ b/crates/project_model/src/workspace.rs | |||
@@ -384,10 +384,10 @@ fn project_json_to_crate_graph( | |||
384 | file_id, | 384 | file_id, |
385 | krate.edition, | 385 | krate.edition, |
386 | krate.display_name.clone(), | 386 | krate.display_name.clone(), |
387 | cfg_options.clone(), | ||
387 | cfg_options, | 388 | cfg_options, |
388 | env, | 389 | env, |
389 | proc_macro.unwrap_or_default(), | 390 | proc_macro.unwrap_or_default(), |
390 | Default::default(), | ||
391 | ), | 391 | ), |
392 | ) | 392 | ) |
393 | }) | 393 | }) |
@@ -581,9 +581,9 @@ fn detached_files_to_crate_graph( | |||
581 | Edition::Edition2018, | 581 | Edition::Edition2018, |
582 | display_name, | 582 | display_name, |
583 | cfg_options.clone(), | 583 | cfg_options.clone(), |
584 | cfg_options.clone(), | ||
584 | Env::default(), | 585 | Env::default(), |
585 | Vec::new(), | 586 | Vec::new(), |
586 | Default::default(), | ||
587 | ); | 587 | ); |
588 | 588 | ||
589 | for (name, krate) in public_deps.iter() { | 589 | for (name, krate) in public_deps.iter() { |
@@ -721,14 +721,21 @@ fn add_target_crate_root( | |||
721 | .unwrap_or_default(); | 721 | .unwrap_or_default(); |
722 | 722 | ||
723 | let display_name = CrateDisplayName::from_canonical_name(cargo_name.to_string()); | 723 | let display_name = CrateDisplayName::from_canonical_name(cargo_name.to_string()); |
724 | let mut potential_cfg_options = cfg_options.clone(); | ||
725 | potential_cfg_options.extend( | ||
726 | pkg.features | ||
727 | .iter() | ||
728 | .map(|feat| CfgFlag::KeyValue { key: "feature".into(), value: feat.0.into() }), | ||
729 | ); | ||
730 | |||
724 | let crate_id = crate_graph.add_crate_root( | 731 | let crate_id = crate_graph.add_crate_root( |
725 | file_id, | 732 | file_id, |
726 | edition, | 733 | edition, |
727 | Some(display_name), | 734 | Some(display_name), |
728 | cfg_options, | 735 | cfg_options, |
736 | potential_cfg_options, | ||
729 | env, | 737 | env, |
730 | proc_macro, | 738 | proc_macro, |
731 | pkg.features.clone(), | ||
732 | ); | 739 | ); |
733 | 740 | ||
734 | crate_id | 741 | crate_id |
@@ -756,9 +763,9 @@ fn sysroot_to_crate_graph( | |||
756 | Edition::Edition2018, | 763 | Edition::Edition2018, |
757 | Some(display_name), | 764 | Some(display_name), |
758 | cfg_options.clone(), | 765 | cfg_options.clone(), |
766 | cfg_options.clone(), | ||
759 | env, | 767 | env, |
760 | proc_macro, | 768 | proc_macro, |
761 | Default::default(), | ||
762 | ); | 769 | ); |
763 | Some((krate, crate_id)) | 770 | Some((krate, crate_id)) |
764 | }) | 771 | }) |