Skip to content

Commit d7a0b0f

Browse files
bors[bot]Veetaha
andauthored
Merge #4381
4381: Simplify r=matklad a=Veetaha Co-authored-by: veetaha <[email protected]>
2 parents 1acb556 + e83a291 commit d7a0b0f

File tree

2 files changed

+24
-47
lines changed

2 files changed

+24
-47
lines changed

crates/ra_project_model/src/lib.rs

+15-36
Original file line numberDiff line numberDiff line change
@@ -88,46 +88,28 @@ impl ProjectRoot {
8888
}
8989

9090
pub fn discover(path: &Path) -> io::Result<Vec<ProjectRoot>> {
91-
if let Some(project_json) = find_rust_project_json(path) {
91+
if let Some(project_json) = find_in_parent_dirs(path, "rust-project.json") {
9292
return Ok(vec![ProjectRoot::ProjectJson(project_json)]);
9393
}
9494
return find_cargo_toml(path)
9595
.map(|paths| paths.into_iter().map(ProjectRoot::CargoToml).collect());
9696

97-
fn find_rust_project_json(path: &Path) -> Option<PathBuf> {
98-
if path.ends_with("rust-project.json") {
99-
return Some(path.to_path_buf());
100-
}
101-
102-
let mut curr = Some(path);
103-
while let Some(path) = curr {
104-
let candidate = path.join("rust-project.json");
105-
if candidate.exists() {
106-
return Some(candidate);
107-
}
108-
curr = path.parent();
109-
}
110-
111-
None
112-
}
113-
11497
fn find_cargo_toml(path: &Path) -> io::Result<Vec<PathBuf>> {
115-
if path.ends_with("Cargo.toml") {
116-
return Ok(vec![path.to_path_buf()]);
98+
match find_in_parent_dirs(path, "Cargo.toml") {
99+
Some(it) => Ok(vec![it]),
100+
None => Ok(find_cargo_toml_in_child_dir(read_dir(path)?)),
117101
}
102+
}
118103

119-
if let Some(p) = find_cargo_toml_in_parent_dir(path) {
120-
return Ok(vec![p]);
104+
fn find_in_parent_dirs(path: &Path, target_file_name: &str) -> Option<PathBuf> {
105+
if path.ends_with(target_file_name) {
106+
return Some(path.to_owned());
121107
}
122108

123-
let entities = read_dir(path)?;
124-
Ok(find_cargo_toml_in_child_dir(entities))
125-
}
126-
127-
fn find_cargo_toml_in_parent_dir(path: &Path) -> Option<PathBuf> {
128109
let mut curr = Some(path);
110+
129111
while let Some(path) = curr {
130-
let candidate = path.join("Cargo.toml");
112+
let candidate = path.join(target_file_name);
131113
if candidate.exists() {
132114
return Some(candidate);
133115
}
@@ -139,14 +121,11 @@ impl ProjectRoot {
139121

140122
fn find_cargo_toml_in_child_dir(entities: ReadDir) -> Vec<PathBuf> {
141123
// Only one level down to avoid cycles the easy way and stop a runaway scan with large projects
142-
let mut valid_canditates = vec![];
143-
for entity in entities.filter_map(Result::ok) {
144-
let candidate = entity.path().join("Cargo.toml");
145-
if candidate.exists() {
146-
valid_canditates.push(candidate)
147-
}
148-
}
149-
valid_canditates
124+
entities
125+
.filter_map(Result::ok)
126+
.map(|it| it.path().join("Cargo.toml"))
127+
.filter(|it| it.exists())
128+
.collect()
150129
}
151130
}
152131
}

crates/rust-analyzer/src/main_loop.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -96,23 +96,21 @@ pub fn main_loop(ws_roots: Vec<PathBuf>, config: Config, connection: Connection)
9696
let mut world_state = {
9797
let workspaces = {
9898
// FIXME: support dynamic workspace loading.
99-
let mut visited = FxHashSet::default();
100-
let project_roots = ws_roots
99+
let project_roots: FxHashSet<_> = ws_roots
101100
.iter()
102101
.filter_map(|it| ra_project_model::ProjectRoot::discover(it).ok())
103102
.flatten()
104-
.filter(|it| visited.insert(it.clone()))
105-
.collect::<Vec<_>>();
103+
.collect();
106104

107105
if project_roots.is_empty() && config.notifications.cargo_toml_not_found {
108106
show_message(
109-
req::MessageType::Error,
110-
format!(
111-
"rust-analyzer failed to discover workspace, no Cargo.toml found, dirs searched: {}",
112-
ws_roots.iter().format_with(", ", |it, f| f(&it.display()))
113-
),
114-
&connection.sender,
115-
);
107+
req::MessageType::Error,
108+
format!(
109+
"rust-analyzer failed to discover workspace, no Cargo.toml found, dirs searched: {}",
110+
ws_roots.iter().format_with(", ", |it, f| f(&it.display()))
111+
),
112+
&connection.sender,
113+
);
116114
};
117115

118116
project_roots

0 commit comments

Comments
 (0)