Skip to content

Commit 27ebe5d

Browse files
committed
Reduce OUT_DIR special casing
1 parent 560b98b commit 27ebe5d

File tree

3 files changed

+43
-50
lines changed

3 files changed

+43
-50
lines changed

crates/ra_project_model/src/lib.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,21 @@ pub struct PackageRoot {
4747
path: PathBuf,
4848
/// Is a member of the current workspace
4949
is_member: bool,
50+
out_dir: Option<PathBuf>,
5051
}
5152
impl PackageRoot {
5253
pub fn new_member(path: PathBuf) -> PackageRoot {
53-
Self { path, is_member: true }
54+
Self { path, is_member: true, out_dir: None }
5455
}
5556
pub fn new_non_member(path: PathBuf) -> PackageRoot {
56-
Self { path, is_member: false }
57+
Self { path, is_member: false, out_dir: None }
5758
}
5859
pub fn path(&self) -> &Path {
5960
&self.path
6061
}
62+
pub fn out_dir(&self) -> Option<&Path> {
63+
self.out_dir.as_deref()
64+
}
6165
pub fn is_member(&self) -> bool {
6266
self.is_member
6367
}
@@ -204,6 +208,7 @@ impl ProjectWorkspace {
204208
.map(|pkg| PackageRoot {
205209
path: cargo[pkg].root().to_path_buf(),
206210
is_member: cargo[pkg].is_member,
211+
out_dir: cargo[pkg].out_dir.clone(),
207212
})
208213
.chain(sysroot.crates().map(|krate| {
209214
PackageRoot::new_non_member(sysroot[krate].root_dir().to_path_buf())
@@ -212,17 +217,6 @@ impl ProjectWorkspace {
212217
}
213218
}
214219

215-
pub fn out_dirs(&self) -> Vec<PathBuf> {
216-
match self {
217-
ProjectWorkspace::Json { project } => {
218-
project.crates.iter().filter_map(|krate| krate.out_dir.as_ref()).cloned().collect()
219-
}
220-
ProjectWorkspace::Cargo { cargo, sysroot: _ } => {
221-
cargo.packages().filter_map(|pkg| cargo[pkg].out_dir.as_ref()).cloned().collect()
222-
}
223-
}
224-
}
225-
226220
pub fn proc_macro_dylib_paths(&self) -> Vec<PathBuf> {
227221
match self {
228222
ProjectWorkspace::Json { project } => project

crates/rust-analyzer/src/cli/load_cargo.rs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,28 +36,28 @@ pub fn load_cargo(
3636
)?;
3737

3838
let mut extern_dirs = FxHashSet::default();
39-
extern_dirs.extend(ws.out_dirs());
40-
41-
let mut project_roots = ws.to_roots();
42-
project_roots.extend(extern_dirs.iter().cloned().map(PackageRoot::new_non_member));
4339

4440
let (sender, receiver) = unbounded();
4541
let sender = Box::new(move |t| sender.send(t).unwrap());
46-
let (mut vfs, roots) = Vfs::new(
47-
project_roots
48-
.iter()
49-
.map(|pkg_root| {
50-
RootEntry::new(
51-
pkg_root.path().to_owned(),
52-
RustPackageFilterBuilder::default()
53-
.set_member(pkg_root.is_member())
54-
.into_vfs_filter(),
55-
)
56-
})
57-
.collect(),
58-
sender,
59-
Watch(false),
60-
);
42+
43+
let mut roots = Vec::new();
44+
let project_roots = ws.to_roots();
45+
for root in &project_roots {
46+
roots.push(RootEntry::new(
47+
root.path().to_owned(),
48+
RustPackageFilterBuilder::default().set_member(root.is_member()).into_vfs_filter(),
49+
));
50+
51+
if let Some(out_dir) = root.out_dir() {
52+
extern_dirs.insert(out_dir.to_path_buf());
53+
roots.push(RootEntry::new(
54+
out_dir.to_owned(),
55+
RustPackageFilterBuilder::default().set_member(root.is_member()).into_vfs_filter(),
56+
))
57+
}
58+
}
59+
60+
let (mut vfs, roots) = Vfs::new(roots, sender, Watch(false));
6161

6262
let source_roots = roots
6363
.into_iter()

crates/rust-analyzer/src/global_state.rs

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,7 @@ impl GlobalState {
8989
) -> GlobalState {
9090
let mut change = AnalysisChange::new();
9191

92-
let extern_dirs: FxHashSet<_> =
93-
workspaces.iter().flat_map(ProjectWorkspace::out_dirs).collect();
92+
let mut extern_dirs: FxHashSet<PathBuf> = FxHashSet::default();
9493

9594
let mut local_roots = Vec::new();
9695
let roots: Vec<_> = {
@@ -100,22 +99,22 @@ impl GlobalState {
10099
.exclude(exclude_globs.iter().cloned())
101100
.into_vfs_filter()
102101
};
103-
workspaces
104-
.iter()
105-
.flat_map(ProjectWorkspace::to_roots)
106-
.map(|pkg_root| {
107-
let path = pkg_root.path().to_owned();
108-
if pkg_root.is_member() {
109-
local_roots.push(path.clone());
110-
}
111-
RootEntry::new(path, create_filter(pkg_root.is_member()))
112-
})
113-
.chain(
114-
extern_dirs
115-
.iter()
116-
.map(|path| RootEntry::new(path.to_owned(), create_filter(false))),
117-
)
118-
.collect()
102+
let mut roots = Vec::new();
103+
for root in workspaces.iter().flat_map(ProjectWorkspace::to_roots) {
104+
let path = root.path().to_owned();
105+
if root.is_member() {
106+
local_roots.push(path.clone());
107+
}
108+
roots.push(RootEntry::new(path, create_filter(root.is_member())));
109+
if let Some(out_dir) = root.out_dir() {
110+
extern_dirs.insert(out_dir.to_path_buf());
111+
roots.push(RootEntry::new(
112+
out_dir.to_path_buf(),
113+
create_filter(root.is_member()),
114+
))
115+
}
116+
}
117+
roots
119118
};
120119

121120
let (task_sender, task_receiver) = unbounded();

0 commit comments

Comments
 (0)