Move project discovery

This commit is contained in:
Aleksey Kladov 2020-06-03 11:44:51 +02:00
parent 992e1256d0
commit 0a88de809f
2 changed files with 16 additions and 8 deletions

View file

@ -14,7 +14,7 @@ use std::{
use anyhow::{bail, Context, Result}; use anyhow::{bail, Context, Result};
use ra_cfg::CfgOptions; use ra_cfg::CfgOptions;
use ra_db::{CrateGraph, CrateName, Edition, Env, ExternSource, ExternSourceId, FileId}; use ra_db::{CrateGraph, CrateName, Edition, Env, ExternSource, ExternSourceId, FileId};
use rustc_hash::FxHashMap; use rustc_hash::{FxHashMap, FxHashSet};
use serde_json::from_reader; use serde_json::from_reader;
pub use crate::{ pub use crate::{
@ -57,7 +57,7 @@ impl PackageRoot {
} }
} }
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]
pub enum ProjectRoot { pub enum ProjectRoot {
ProjectJson(PathBuf), ProjectJson(PathBuf),
CargoToml(PathBuf), CargoToml(PathBuf),
@ -128,6 +128,18 @@ impl ProjectRoot {
.collect() .collect()
} }
} }
pub fn discover_all(paths: &[impl AsRef<Path>]) -> Vec<ProjectRoot> {
let mut res = paths
.iter()
.filter_map(|it| ProjectRoot::discover(it.as_ref()).ok())
.flatten()
.collect::<FxHashSet<_>>()
.into_iter()
.collect::<Vec<_>>();
res.sort();
res
}
} }
impl ProjectWorkspace { impl ProjectWorkspace {

View file

@ -28,7 +28,7 @@ use lsp_types::{
use ra_flycheck::{CheckTask, Status}; use ra_flycheck::{CheckTask, Status};
use ra_ide::{Canceled, FileId, LibraryData, LineIndex, SourceRootId}; use ra_ide::{Canceled, FileId, LibraryData, LineIndex, SourceRootId};
use ra_prof::profile; use ra_prof::profile;
use ra_project_model::{PackageRoot, ProjectWorkspace}; use ra_project_model::{PackageRoot, ProjectRoot, ProjectWorkspace};
use ra_vfs::{VfsFile, VfsTask, Watch}; use ra_vfs::{VfsFile, VfsTask, Watch};
use relative_path::RelativePathBuf; use relative_path::RelativePathBuf;
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
@ -96,11 +96,7 @@ pub fn main_loop(ws_roots: Vec<PathBuf>, config: Config, connection: Connection)
let mut global_state = { let mut global_state = {
let workspaces = { let workspaces = {
// FIXME: support dynamic workspace loading. // FIXME: support dynamic workspace loading.
let project_roots: FxHashSet<_> = ws_roots let project_roots = ProjectRoot::discover_all(&ws_roots);
.iter()
.filter_map(|it| ra_project_model::ProjectRoot::discover(it).ok())
.flatten()
.collect();
if project_roots.is_empty() && config.notifications.cargo_toml_not_found { if project_roots.is_empty() && config.notifications.cargo_toml_not_found {
show_message( show_message(