mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-19 00:31:19 +00:00
Move features into potential_cfg_options
This commit is contained in:
parent
284483b347
commit
ae823aa23f
6 changed files with 32 additions and 38 deletions
|
@ -128,10 +128,10 @@ impl ChangeFixture {
|
||||||
file_id,
|
file_id,
|
||||||
meta.edition,
|
meta.edition,
|
||||||
Some(crate_name.clone().into()),
|
Some(crate_name.clone().into()),
|
||||||
|
meta.cfg.clone(),
|
||||||
meta.cfg,
|
meta.cfg,
|
||||||
meta.env,
|
meta.env,
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let prev = crates.insert(crate_name.clone(), crate_id);
|
let prev = crates.insert(crate_name.clone(), crate_id);
|
||||||
assert!(prev.is_none());
|
assert!(prev.is_none());
|
||||||
|
@ -158,10 +158,10 @@ impl ChangeFixture {
|
||||||
crate_root,
|
crate_root,
|
||||||
Edition::Edition2018,
|
Edition::Edition2018,
|
||||||
Some(CrateName::new("test").unwrap().into()),
|
Some(CrateName::new("test").unwrap().into()),
|
||||||
|
default_cfg.clone(),
|
||||||
default_cfg,
|
default_cfg,
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
for (from, to) in crate_deps {
|
for (from, to) in crate_deps {
|
||||||
|
@ -188,6 +188,7 @@ impl ChangeFixture {
|
||||||
Edition::Edition2021,
|
Edition::Edition2021,
|
||||||
Some(CrateDisplayName::from_canonical_name("core".to_string())),
|
Some(CrateDisplayName::from_canonical_name("core".to_string())),
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Vec::new(),
|
Vec::new(),
|
||||||
);
|
);
|
||||||
|
|
|
@ -189,10 +189,10 @@ pub struct CrateData {
|
||||||
/// `Dependency` matters), this name should only be used for UI.
|
/// `Dependency` matters), this name should only be used for UI.
|
||||||
pub display_name: Option<CrateDisplayName>,
|
pub display_name: Option<CrateDisplayName>,
|
||||||
pub cfg_options: CfgOptions,
|
pub cfg_options: CfgOptions,
|
||||||
|
pub potential_cfg_options: CfgOptions,
|
||||||
pub env: Env,
|
pub env: Env,
|
||||||
pub dependencies: Vec<Dependency>,
|
pub dependencies: Vec<Dependency>,
|
||||||
pub proc_macro: Vec<ProcMacro>,
|
pub proc_macro: Vec<ProcMacro>,
|
||||||
pub features: FxHashMap<String, Vec<String>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
@ -220,19 +220,19 @@ impl CrateGraph {
|
||||||
edition: Edition,
|
edition: Edition,
|
||||||
display_name: Option<CrateDisplayName>,
|
display_name: Option<CrateDisplayName>,
|
||||||
cfg_options: CfgOptions,
|
cfg_options: CfgOptions,
|
||||||
|
potential_cfg_options: CfgOptions,
|
||||||
env: Env,
|
env: Env,
|
||||||
proc_macro: Vec<ProcMacro>,
|
proc_macro: Vec<ProcMacro>,
|
||||||
features: FxHashMap<String, Vec<String>>,
|
|
||||||
) -> CrateId {
|
) -> CrateId {
|
||||||
let data = CrateData {
|
let data = CrateData {
|
||||||
root_file_id: file_id,
|
root_file_id: file_id,
|
||||||
edition,
|
edition,
|
||||||
display_name,
|
display_name,
|
||||||
cfg_options,
|
cfg_options,
|
||||||
|
potential_cfg_options,
|
||||||
env,
|
env,
|
||||||
proc_macro,
|
proc_macro,
|
||||||
dependencies: Vec::new(),
|
dependencies: Vec::new(),
|
||||||
features,
|
|
||||||
};
|
};
|
||||||
let crate_id = CrateId(self.arena.len() as u32);
|
let crate_id = CrateId(self.arena.len() as u32);
|
||||||
let prev = self.arena.insert(crate_id, data);
|
let prev = self.arena.insert(crate_id, data);
|
||||||
|
@ -507,27 +507,27 @@ mod tests {
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate2 = graph.add_crate_root(
|
let crate2 = graph.add_crate_root(
|
||||||
FileId(2u32),
|
FileId(2u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate3 = graph.add_crate_root(
|
let crate3 = graph.add_crate_root(
|
||||||
FileId(3u32),
|
FileId(3u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
||||||
assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
|
assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
|
||||||
|
@ -542,18 +542,18 @@ mod tests {
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate2 = graph.add_crate_root(
|
let crate2 = graph.add_crate_root(
|
||||||
FileId(2u32),
|
FileId(2u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
||||||
assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err());
|
assert!(graph.add_dep(crate2, CrateName::new("crate2").unwrap(), crate2).is_err());
|
||||||
|
@ -567,27 +567,27 @@ mod tests {
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate2 = graph.add_crate_root(
|
let crate2 = graph.add_crate_root(
|
||||||
FileId(2u32),
|
FileId(2u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate3 = graph.add_crate_root(
|
let crate3 = graph.add_crate_root(
|
||||||
FileId(3u32),
|
FileId(3u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
assert!(graph.add_dep(crate1, CrateName::new("crate2").unwrap(), crate2).is_ok());
|
||||||
assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
|
assert!(graph.add_dep(crate2, CrateName::new("crate3").unwrap(), crate3).is_ok());
|
||||||
|
@ -601,18 +601,18 @@ mod tests {
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
let crate2 = graph.add_crate_root(
|
let crate2 = graph.add_crate_root(
|
||||||
FileId(2u32),
|
FileId(2u32),
|
||||||
Edition2018,
|
Edition2018,
|
||||||
None,
|
None,
|
||||||
CfgOptions::default(),
|
CfgOptions::default(),
|
||||||
|
CfgOptions::default(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
assert!(graph
|
assert!(graph
|
||||||
.add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
|
.add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
|
||||||
|
|
|
@ -234,8 +234,8 @@ impl Crate {
|
||||||
db.crate_graph()[self.id].cfg_options.clone()
|
db.crate_graph()[self.id].cfg_options.clone()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn features(&self, db: &dyn HirDatabase) -> Vec<String> {
|
pub fn potential_cfg(&self, db: &dyn HirDatabase) -> CfgOptions {
|
||||||
db.crate_graph()[self.id].features.iter().map(|(feat, _)| feat.clone()).collect()
|
db.crate_graph()[self.id].potential_cfg_options.clone()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -217,10 +217,10 @@ impl Analysis {
|
||||||
file_id,
|
file_id,
|
||||||
Edition::Edition2018,
|
Edition::Edition2018,
|
||||||
None,
|
None,
|
||||||
|
cfg_options.clone(),
|
||||||
cfg_options,
|
cfg_options,
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Default::default(),
|
Default::default(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
change.change_file(file_id, Some(Arc::new(text)));
|
change.change_file(file_id, Some(Arc::new(text)));
|
||||||
change.set_crate_graph(crate_graph);
|
change.set_crate_graph(crate_graph);
|
||||||
|
|
|
@ -26,20 +26,6 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
.find(|t| matches!(t.kind(), SyntaxKind::IDENT));
|
.find(|t| matches!(t.kind(), SyntaxKind::IDENT));
|
||||||
|
|
||||||
match previous.as_ref().map(|p| p.text()) {
|
match previous.as_ref().map(|p| p.text()) {
|
||||||
Some("feature") => {
|
|
||||||
ctx.krate.map(|krate| {
|
|
||||||
krate.features(ctx.db).iter().for_each(|f| {
|
|
||||||
let mut item = CompletionItem::new(
|
|
||||||
CompletionKind::Attribute,
|
|
||||||
ctx.source_range(),
|
|
||||||
f.clone(),
|
|
||||||
);
|
|
||||||
item.insert_text(format!(r#""{}""#, f));
|
|
||||||
|
|
||||||
acc.add(item.build())
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
Some("target_arch") => KNOWN_ARCH.iter().for_each(add_completion),
|
Some("target_arch") => KNOWN_ARCH.iter().for_each(add_completion),
|
||||||
Some("target_env") => KNOWN_ENV.iter().for_each(add_completion),
|
Some("target_env") => KNOWN_ENV.iter().for_each(add_completion),
|
||||||
Some("target_os") => KNOWN_OS.iter().for_each(add_completion),
|
Some("target_os") => KNOWN_OS.iter().for_each(add_completion),
|
||||||
|
@ -47,7 +33,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
Some("target_endian") => ["little", "big"].iter().for_each(add_completion),
|
Some("target_endian") => ["little", "big"].iter().for_each(add_completion),
|
||||||
Some(name) => {
|
Some(name) => {
|
||||||
ctx.krate.map(|krate| {
|
ctx.krate.map(|krate| {
|
||||||
krate.cfg(ctx.db).get_cfg_values(&name).iter().for_each(|s| {
|
krate.potential_cfg(ctx.db).get_cfg_values(&name).iter().for_each(|s| {
|
||||||
let mut item = CompletionItem::new(
|
let mut item = CompletionItem::new(
|
||||||
CompletionKind::Attribute,
|
CompletionKind::Attribute,
|
||||||
ctx.source_range(),
|
ctx.source_range(),
|
||||||
|
@ -61,7 +47,7 @@ pub(crate) fn complete_cfg(acc: &mut Completions, ctx: &CompletionContext) {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
ctx.krate.map(|krate| {
|
ctx.krate.map(|krate| {
|
||||||
krate.cfg(ctx.db).get_cfg_keys().iter().for_each(|s| {
|
krate.potential_cfg(ctx.db).get_cfg_keys().iter().for_each(|s| {
|
||||||
let item = CompletionItem::new(
|
let item = CompletionItem::new(
|
||||||
CompletionKind::Attribute,
|
CompletionKind::Attribute,
|
||||||
ctx.source_range(),
|
ctx.source_range(),
|
||||||
|
|
|
@ -384,10 +384,10 @@ fn project_json_to_crate_graph(
|
||||||
file_id,
|
file_id,
|
||||||
krate.edition,
|
krate.edition,
|
||||||
krate.display_name.clone(),
|
krate.display_name.clone(),
|
||||||
|
cfg_options.clone(),
|
||||||
cfg_options,
|
cfg_options,
|
||||||
env,
|
env,
|
||||||
proc_macro.unwrap_or_default(),
|
proc_macro.unwrap_or_default(),
|
||||||
Default::default(),
|
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
@ -581,9 +581,9 @@ fn detached_files_to_crate_graph(
|
||||||
Edition::Edition2018,
|
Edition::Edition2018,
|
||||||
display_name,
|
display_name,
|
||||||
cfg_options.clone(),
|
cfg_options.clone(),
|
||||||
|
cfg_options.clone(),
|
||||||
Env::default(),
|
Env::default(),
|
||||||
Vec::new(),
|
Vec::new(),
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
for (name, krate) in public_deps.iter() {
|
for (name, krate) in public_deps.iter() {
|
||||||
|
@ -721,14 +721,21 @@ fn add_target_crate_root(
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
|
|
||||||
let display_name = CrateDisplayName::from_canonical_name(cargo_name.to_string());
|
let display_name = CrateDisplayName::from_canonical_name(cargo_name.to_string());
|
||||||
|
let mut potential_cfg_options = cfg_options.clone();
|
||||||
|
potential_cfg_options.extend(
|
||||||
|
pkg.features
|
||||||
|
.iter()
|
||||||
|
.map(|feat| CfgFlag::KeyValue { key: "feature".into(), value: feat.0.into() }),
|
||||||
|
);
|
||||||
|
|
||||||
let crate_id = crate_graph.add_crate_root(
|
let crate_id = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
edition,
|
edition,
|
||||||
Some(display_name),
|
Some(display_name),
|
||||||
cfg_options,
|
cfg_options,
|
||||||
|
potential_cfg_options,
|
||||||
env,
|
env,
|
||||||
proc_macro,
|
proc_macro,
|
||||||
pkg.features.clone(),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
crate_id
|
crate_id
|
||||||
|
@ -756,9 +763,9 @@ fn sysroot_to_crate_graph(
|
||||||
Edition::Edition2018,
|
Edition::Edition2018,
|
||||||
Some(display_name),
|
Some(display_name),
|
||||||
cfg_options.clone(),
|
cfg_options.clone(),
|
||||||
|
cfg_options.clone(),
|
||||||
env,
|
env,
|
||||||
proc_macro,
|
proc_macro,
|
||||||
Default::default(),
|
|
||||||
);
|
);
|
||||||
Some((krate, crate_id))
|
Some((krate, crate_id))
|
||||||
})
|
})
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue