mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-27 05:23:24 +00:00
Merge #5457
5457: Simplify r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
commit
7a089a7bab
2 changed files with 41 additions and 33 deletions
|
@ -34,6 +34,7 @@ pub struct Crate {
|
||||||
pub(crate) target: Option<String>,
|
pub(crate) target: Option<String>,
|
||||||
pub(crate) out_dir: Option<AbsPathBuf>,
|
pub(crate) out_dir: Option<AbsPathBuf>,
|
||||||
pub(crate) proc_macro_dylib_path: Option<AbsPathBuf>,
|
pub(crate) proc_macro_dylib_path: Option<AbsPathBuf>,
|
||||||
|
pub(crate) is_workspace_member: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ProjectJson {
|
impl ProjectJson {
|
||||||
|
@ -43,32 +44,42 @@ impl ProjectJson {
|
||||||
crates: data
|
crates: data
|
||||||
.crates
|
.crates
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|crate_data| Crate {
|
.map(|crate_data| {
|
||||||
root_module: base.join(crate_data.root_module),
|
let is_workspace_member = crate_data.is_workspace_member.unwrap_or_else(|| {
|
||||||
edition: crate_data.edition.into(),
|
crate_data.root_module.is_relative()
|
||||||
deps: crate_data
|
&& !crate_data.root_module.starts_with("..")
|
||||||
.deps
|
|| crate_data.root_module.starts_with(base)
|
||||||
.into_iter()
|
});
|
||||||
.map(|dep_data| Dependency {
|
Crate {
|
||||||
crate_id: CrateId(dep_data.krate as u32),
|
root_module: base.join(crate_data.root_module),
|
||||||
name: dep_data.name,
|
edition: crate_data.edition.into(),
|
||||||
})
|
deps: crate_data
|
||||||
.collect::<Vec<_>>(),
|
.deps
|
||||||
cfg: {
|
.into_iter()
|
||||||
let mut cfg = CfgOptions::default();
|
.map(|dep_data| Dependency {
|
||||||
for entry in &crate_data.cfg {
|
crate_id: CrateId(dep_data.krate as u32),
|
||||||
match split_delim(entry, '=') {
|
name: dep_data.name,
|
||||||
Some((key, value)) => {
|
})
|
||||||
cfg.insert_key_value(key.into(), value.into());
|
.collect::<Vec<_>>(),
|
||||||
|
cfg: {
|
||||||
|
let mut cfg = CfgOptions::default();
|
||||||
|
for entry in &crate_data.cfg {
|
||||||
|
match split_delim(entry, '=') {
|
||||||
|
Some((key, value)) => {
|
||||||
|
cfg.insert_key_value(key.into(), value.into());
|
||||||
|
}
|
||||||
|
None => cfg.insert_atom(entry.into()),
|
||||||
}
|
}
|
||||||
None => cfg.insert_atom(entry.into()),
|
|
||||||
}
|
}
|
||||||
}
|
cfg
|
||||||
cfg
|
},
|
||||||
},
|
target: crate_data.target,
|
||||||
target: crate_data.target,
|
out_dir: crate_data.out_dir.map(|it| base.join(it)),
|
||||||
out_dir: crate_data.out_dir.map(|it| base.join(it)),
|
proc_macro_dylib_path: crate_data
|
||||||
proc_macro_dylib_path: crate_data.proc_macro_dylib_path.map(|it| base.join(it)),
|
.proc_macro_dylib_path
|
||||||
|
.map(|it| base.join(it)),
|
||||||
|
is_workspace_member,
|
||||||
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
}
|
}
|
||||||
|
@ -91,6 +102,7 @@ struct CrateData {
|
||||||
target: Option<String>,
|
target: Option<String>,
|
||||||
out_dir: Option<PathBuf>,
|
out_dir: Option<PathBuf>,
|
||||||
proc_macro_dylib_path: Option<PathBuf>,
|
proc_macro_dylib_path: Option<PathBuf>,
|
||||||
|
is_workspace_member: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
|
|
|
@ -83,11 +83,11 @@ impl Directories {
|
||||||
self.includes_path(path)
|
self.includes_path(path)
|
||||||
}
|
}
|
||||||
fn includes_path(&self, path: &AbsPath) -> bool {
|
fn includes_path(&self, path: &AbsPath) -> bool {
|
||||||
let mut include = None;
|
let mut include: Option<&AbsPathBuf> = None;
|
||||||
for incl in &self.include {
|
for incl in &self.include {
|
||||||
if is_prefix(incl, path) {
|
if path.starts_with(incl) {
|
||||||
include = Some(match include {
|
include = Some(match include {
|
||||||
Some(prev) if is_prefix(incl, prev) => prev,
|
Some(prev) if prev.starts_with(incl) => prev,
|
||||||
_ => incl,
|
_ => incl,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -97,15 +97,11 @@ impl Directories {
|
||||||
None => return false,
|
None => return false,
|
||||||
};
|
};
|
||||||
for excl in &self.exclude {
|
for excl in &self.exclude {
|
||||||
if is_prefix(excl, path) && is_prefix(include, excl) {
|
if path.starts_with(excl) && excl.starts_with(include) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
true
|
||||||
|
|
||||||
fn is_prefix(short: &AbsPath, long: &AbsPath) -> bool {
|
|
||||||
long.strip_prefix(short).is_some()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue