Skip to content

Commit 26e57a7

Browse files
committed
Simpify workspace handling
1 parent 0454804 commit 26e57a7

File tree

7 files changed

+63
-83
lines changed

7 files changed

+63
-83
lines changed

crates/ra_project_model/src/lib.rs

Lines changed: 17 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -58,22 +58,16 @@ pub enum ProjectWorkspace {
5858
#[derive(Clone)]
5959
pub struct PackageRoot {
6060
/// Path to the root folder
61-
path: PathBuf,
61+
pub path: PathBuf,
6262
/// Is a member of the current workspace
63-
is_member: bool,
63+
pub is_member: bool,
6464
}
65-
6665
impl PackageRoot {
67-
pub fn new(path: PathBuf, is_member: bool) -> PackageRoot {
68-
PackageRoot { path, is_member }
69-
}
70-
71-
pub fn path(&self) -> &PathBuf {
72-
&self.path
66+
pub fn new_member(path: PathBuf) -> PackageRoot {
67+
Self { path, is_member: true }
7368
}
74-
75-
pub fn is_member(&self) -> bool {
76-
self.is_member
69+
pub fn new_non_member(path: PathBuf) -> PackageRoot {
70+
Self { path, is_member: false }
7771
}
7872
}
7973

@@ -130,24 +124,18 @@ impl ProjectWorkspace {
130124
pub fn to_roots(&self) -> Vec<PackageRoot> {
131125
match self {
132126
ProjectWorkspace::Json { project } => {
133-
let mut roots = Vec::with_capacity(project.roots.len());
134-
for root in &project.roots {
135-
roots.push(PackageRoot::new(root.path.clone(), true));
136-
}
137-
roots
138-
}
139-
ProjectWorkspace::Cargo { cargo, sysroot } => {
140-
let mut roots = Vec::with_capacity(cargo.packages().len() + sysroot.crates().len());
141-
for pkg in cargo.packages() {
142-
let root = cargo[pkg].root().to_path_buf();
143-
let member = cargo[pkg].is_member;
144-
roots.push(PackageRoot::new(root, member));
145-
}
146-
for krate in sysroot.crates() {
147-
roots.push(PackageRoot::new(sysroot[krate].root_dir().to_path_buf(), false))
148-
}
149-
roots
127+
project.roots.iter().map(|r| PackageRoot::new_member(r.path.clone())).collect()
150128
}
129+
ProjectWorkspace::Cargo { cargo, sysroot } => cargo
130+
.packages()
131+
.map(|pkg| PackageRoot {
132+
path: cargo[pkg].root().to_path_buf(),
133+
is_member: cargo[pkg].is_member,
134+
})
135+
.chain(sysroot.crates().map(|krate| {
136+
PackageRoot::new_non_member(sysroot[krate].root_dir().to_path_buf())
137+
}))
138+
.collect(),
151139
}
152140
}
153141

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ pub fn analysis_bench(
6565
roots
6666
.iter()
6767
.find_map(|(source_root_id, project_root)| {
68-
if project_root.is_member() {
68+
if project_root.is_member {
6969
for file_id in db.source_root(*source_root_id).walk() {
7070
let rel_path = db.file_relative_path(file_id);
71-
let abs_path = rel_path.to_path(project_root.path());
71+
let abs_path = rel_path.to_path(&project_root.path);
7272
if abs_path == path {
7373
return Some(file_id);
7474
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ pub fn analysis_stats(
3939
roots
4040
.into_iter()
4141
.filter_map(|(source_root_id, project_root)| {
42-
if with_deps || project_root.is_member() {
42+
if with_deps || project_root.is_member {
4343
Some(source_root_id)
4444
} else {
4545
None

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

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ pub(crate) fn load_cargo(
3636
extern_dirs.extend(ws.out_dirs());
3737

3838
let mut project_roots = ws.to_roots();
39-
project_roots
40-
.extend(extern_dirs.iter().map(|path| PackageRoot::new(path.to_path_buf(), false)));
39+
project_roots.extend(extern_dirs.iter().cloned().map(PackageRoot::new_non_member));
4140

4241
let (sender, receiver) = unbounded();
4342
let sender = Box::new(move |t| sender.send(t).unwrap());
@@ -46,9 +45,9 @@ pub(crate) fn load_cargo(
4645
.iter()
4746
.map(|pkg_root| {
4847
RootEntry::new(
49-
pkg_root.path().clone(),
48+
pkg_root.path.clone(),
5049
RustPackageFilterBuilder::default()
51-
.set_member(pkg_root.is_member())
50+
.set_member(pkg_root.is_member)
5251
.into_vfs_filter(),
5352
)
5453
})
@@ -58,14 +57,11 @@ pub(crate) fn load_cargo(
5857
);
5958

6059
let source_roots = roots
61-
.iter()
62-
.map(|&vfs_root| {
60+
.into_iter()
61+
.map(|vfs_root| {
6362
let source_root_id = vfs_root_to_id(vfs_root);
64-
let project_root = project_roots
65-
.iter()
66-
.find(|it| it.path() == &vfs.root2path(vfs_root))
67-
.unwrap()
68-
.clone();
63+
let project_root =
64+
project_roots.iter().find(|it| it.path == vfs.root2path(vfs_root)).unwrap().clone();
6965
(source_root_id, project_root)
7066
})
7167
.collect::<FxHashMap<_, _>>();
@@ -97,7 +93,7 @@ pub(crate) fn load(
9793
match change {
9894
VfsChange::AddRoot { root, files } => {
9995
let source_root_id = vfs_root_to_id(root);
100-
let is_local = source_roots[&source_root_id].is_member();
96+
let is_local = source_roots[&source_root_id].is_member;
10197
log::debug!(
10298
"loaded source root {:?} with path {:?}",
10399
source_root_id,
@@ -106,7 +102,7 @@ pub(crate) fn load(
106102
analysis_change.add_root(source_root_id, is_local);
107103
analysis_change.set_debug_root_path(
108104
source_root_id,
109-
source_roots[&source_root_id].path().display().to_string(),
105+
source_roots[&source_root_id].path.display().to_string(),
110106
);
111107

112108
let vfs_root_path = vfs.root2path(root);

crates/rust-analyzer/src/main_loop.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ pub fn main_loop(
189189
watchers: workspaces
190190
.iter()
191191
.flat_map(|ws| ws.to_roots())
192-
.filter(|root| root.is_member())
193-
.map(|root| format!("{}/**/*.rs", root.path().display()))
192+
.filter(|root| root.is_member)
193+
.map(|root| format!("{}/**/*.rs", root.path.display()))
194194
.map(|glob_pattern| req::FileSystemWatcher { glob_pattern, kind: None })
195195
.collect(),
196196
};

crates/rust-analyzer/src/vfs_glob.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,14 @@ impl RustPackageFilterBuilder {
2929
self.is_member = is_member;
3030
self
3131
}
32-
pub fn exclude(mut self, glob: Glob) -> RustPackageFilterBuilder {
33-
self.exclude.add(glob);
32+
33+
pub fn exclude(mut self, globs: impl IntoIterator<Item = Glob>) -> RustPackageFilterBuilder {
34+
for glob in globs.into_iter() {
35+
self.exclude.add(glob);
36+
}
3437
self
3538
}
39+
3640
pub fn into_vfs_filter(self) -> Box<dyn Filter> {
3741
let RustPackageFilterBuilder { is_member, mut exclude } = self;
3842
for &glob in ALWAYS_IGNORED {
@@ -87,7 +91,7 @@ fn test_globs() {
8791

8892
let filter = RustPackageFilterBuilder::default()
8993
.set_member(true)
90-
.exclude(Glob::new("src/llvm-project/**").unwrap())
94+
.exclude(std::iter::once(Glob::new("src/llvm-project/**").unwrap()))
9195
.into_vfs_filter();
9296

9397
assert!(!filter.include_dir(RelativePath::new("src/llvm-project/clang")));

crates/rust-analyzer/src/world.rs

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -103,51 +103,43 @@ impl WorldState {
103103
) -> WorldState {
104104
let mut change = AnalysisChange::new();
105105

106-
let mut roots = Vec::new();
107-
roots.extend(folder_roots.iter().map(|path| {
108-
let mut filter = RustPackageFilterBuilder::default().set_member(true);
109-
for glob in exclude_globs.iter() {
110-
filter = filter.exclude(glob.clone());
111-
}
112-
RootEntry::new(path.clone(), filter.into_vfs_filter())
113-
}));
114-
for ws in workspaces.iter() {
115-
roots.extend(ws.to_roots().into_iter().map(|pkg_root| {
116-
let mut filter =
117-
RustPackageFilterBuilder::default().set_member(pkg_root.is_member());
118-
for glob in exclude_globs.iter() {
119-
filter = filter.exclude(glob.clone());
120-
}
121-
RootEntry::new(pkg_root.path().clone(), filter.into_vfs_filter())
122-
}));
123-
}
124-
125-
let mut extern_dirs = FxHashSet::default();
126-
for ws in workspaces.iter() {
127-
extern_dirs.extend(ws.out_dirs());
128-
}
129-
130-
let mut extern_source_roots = FxHashMap::default();
131-
132-
roots.extend(extern_dirs.iter().map(|path| {
133-
let mut filter = RustPackageFilterBuilder::default().set_member(false);
134-
for glob in exclude_globs.iter() {
135-
filter = filter.exclude(glob.clone());
136-
}
137-
RootEntry::new(PathBuf::from(&path), filter.into_vfs_filter())
138-
}));
106+
let extern_dirs: FxHashSet<_> =
107+
workspaces.iter().flat_map(ProjectWorkspace::out_dirs).collect();
108+
109+
let roots: Vec<_> = {
110+
let create_filter = |is_member| {
111+
RustPackageFilterBuilder::default()
112+
.set_member(is_member)
113+
.exclude(exclude_globs.iter().cloned())
114+
.into_vfs_filter()
115+
};
116+
folder_roots
117+
.iter()
118+
.map(|path| RootEntry::new(path.clone(), create_filter(true)))
119+
.chain(workspaces.iter().flat_map(ProjectWorkspace::to_roots).map(|pkg_root| {
120+
RootEntry::new(pkg_root.path, create_filter(pkg_root.is_member))
121+
}))
122+
.chain(
123+
extern_dirs
124+
.iter()
125+
.map(|path| RootEntry::new(path.to_owned(), create_filter(false))),
126+
)
127+
.collect()
128+
};
139129

140130
let (task_sender, task_receiver) = unbounded();
141131
let task_sender = Box::new(move |t| task_sender.send(t).unwrap());
142132
let (mut vfs, vfs_roots) = Vfs::new(roots, task_sender, watch);
143133

134+
let mut extern_source_roots = FxHashMap::default();
144135
for r in vfs_roots {
145136
let vfs_root_path = vfs.root2path(r);
146137
let is_local = folder_roots.iter().any(|it| vfs_root_path.starts_with(it));
147138
change.add_root(SourceRootId(r.0), is_local);
148139
change.set_debug_root_path(SourceRootId(r.0), vfs_root_path.display().to_string());
149140

150141
// FIXME: add path2root in vfs to simpily this logic
142+
151143
if extern_dirs.contains(&vfs_root_path) {
152144
extern_source_roots.insert(vfs_root_path, ExternSourceId(r.0));
153145
}

0 commit comments

Comments
 (0)