Skip to content

Commit 7551401

Browse files
author
Paolo Tranquilli
committed
Rust: support glob members in workspaces
1 parent 7fa41c4 commit 7551401

File tree

12 files changed

+68
-4
lines changed

12 files changed

+68
-4
lines changed

rust/extractor/src/rust_analyzer.rs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use ra_ap_base_db::SourceDatabase;
33
use ra_ap_hir::Semantics;
44
use ra_ap_ide_db::RootDatabase;
55
use ra_ap_load_cargo::{load_workspace_at, LoadCargoConfig, ProcMacroServerChoice};
6-
use ra_ap_paths::Utf8PathBuf;
6+
use ra_ap_paths::{AbsPath, Utf8PathBuf};
77
use ra_ap_project_model::ProjectManifest;
88
use ra_ap_project_model::{CargoConfig, ManifestPath};
99
use ra_ap_span::Edition;
@@ -136,6 +136,8 @@ impl<'a> RustAnalyzer<'a> {
136136
struct CargoManifestMembersSlice {
137137
#[serde(default)]
138138
members: Vec<String>,
139+
#[serde(default)]
140+
exclude: Vec<String>,
139141
}
140142

141143
#[derive(Deserialize)]
@@ -171,6 +173,12 @@ impl TomlReader {
171173
}
172174
}
173175

176+
fn workspace_members_match(workspace_dir: &AbsPath, members: &[String], target: &AbsPath) -> bool {
177+
members.iter().any(|p| {
178+
glob::Pattern::new(workspace_dir.join(p).as_str()).is_ok_and(|p| p.matches(target.as_str()))
179+
})
180+
}
181+
174182
fn find_workspace(reader: &mut TomlReader, manifest: &ProjectManifest) -> Option<ProjectManifest> {
175183
let ProjectManifest::CargoToml(cargo) = manifest else {
176184
return None;
@@ -200,9 +208,12 @@ fn find_workspace(reader: &mut TomlReader, manifest: &ProjectManifest) -> Option
200208
if cargo.starts_with(other.parent())
201209
&& reader.read(other).is_ok_and(|it| {
202210
it.workspace.as_ref().is_some_and(|w| {
203-
w.members
204-
.iter()
205-
.any(|m| other.parent().join(m) == cargo.parent())
211+
workspace_members_match(other.parent(), &w.members, cargo.parent())
212+
&& !workspace_members_match(
213+
other.parent(),
214+
&w.exclude,
215+
cargo.parent(),
216+
)
206217
})
207218
}) =>
208219
{
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[workspace]
2+
members = [ "*" ]
3+
exclude = [ "other" ]
4+
resolver = "2"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
name = "exe"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
7+
lib = { path = "../lib" }
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
use lib::hello;
2+
3+
fn main() {
4+
hello();
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "lib"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
pub fn hello() {
2+
println!("Hello, world!");
3+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
[package]
2+
name = "other"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
[dependencies]

rust/ql/integration-tests/workspace-with-glob/other/src/lib.rs

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
exe/src/main.rs
2+
lib/src/lib.rs
3+
other/src/lib.rs
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
| Cargo.toml:0:0:0:0 | LoadManifest(Cargo.toml) |
2+
| exe/src/main.rs:0:0:0:0 | Extract(exe/src/main.rs) |
3+
| exe/src/main.rs:0:0:0:0 | Parse(exe/src/main.rs) |
4+
| file://:0:0:0:0 | FindManifests |
5+
| lib/src/lib.rs:0:0:0:0 | Extract(lib/src/lib.rs) |
6+
| lib/src/lib.rs:0:0:0:0 | Parse(lib/src/lib.rs) |
7+
| other/Cargo.toml:0:0:0:0 | LoadManifest(other/Cargo.toml) |
8+
| other/src/lib.rs:0:0:0:0 | Extract(other/src/lib.rs) |
9+
| other/src/lib.rs:0:0:0:0 | LoadSource(other/src/lib.rs) |
10+
| other/src/lib.rs:0:0:0:0 | Parse(other/src/lib.rs) |

0 commit comments

Comments
 (0)