- let mut roots = Vec::new();
- roots.extend(folder_roots.iter().map(|path| {
- let mut filter = RustPackageFilterBuilder::default().set_member(true);
- for glob in exclude_globs.iter() {
- filter = filter.exclude(glob.clone());
- }
- RootEntry::new(path.clone(), filter.into_vfs_filter())
- }));
- for ws in workspaces.iter() {
- roots.extend(ws.to_roots().into_iter().map(|pkg_root| {
- let mut filter =
- RustPackageFilterBuilder::default().set_member(pkg_root.is_member());
- for glob in exclude_globs.iter() {
- filter = filter.exclude(glob.clone());
- }
- RootEntry::new(pkg_root.path().clone(), filter.into_vfs_filter())
- }));
- }
-
- let mut extern_dirs = FxHashSet::default();
- for ws in workspaces.iter() {
- extern_dirs.extend(ws.out_dirs());
- }
-
- let mut extern_source_roots = FxHashMap::default();
-
- roots.extend(extern_dirs.iter().map(|path| {
- let mut filter = RustPackageFilterBuilder::default().set_member(false);
- for glob in exclude_globs.iter() {
- filter = filter.exclude(glob.clone());
- }
- RootEntry::new(PathBuf::from(&path), filter.into_vfs_filter())
- }));
+ let extern_dirs: FxHashSet<_> =
+ workspaces.iter().flat_map(ProjectWorkspace::out_dirs).collect();
+
+ let roots: Vec<_> = {
+ let create_filter = |is_member| {
+ RustPackageFilterBuilder::default()
+ .set_member(is_member)
+ .exclude(exclude_globs.iter().cloned())
+ .into_vfs_filter()
+ };
+ folder_roots
+ .iter()
+ .map(|path| RootEntry::new(path.clone(), create_filter(true)))
+ .chain(workspaces.iter().flat_map(ProjectWorkspace::to_roots).map(|pkg_root| {
+ RootEntry::new(pkg_root.path, create_filter(pkg_root.is_member))
+ }))
+ .chain(
+ extern_dirs
+ .iter()
+ .map(|path| RootEntry::new(path.to_owned(), create_filter(false))),
+ )
+ .collect()
+ };