@@ -3,7 +3,7 @@ use ra_ap_base_db::SourceDatabase;
33use ra_ap_hir:: Semantics ;
44use ra_ap_ide_db:: RootDatabase ;
55use ra_ap_load_cargo:: { load_workspace_at, LoadCargoConfig , ProcMacroServerChoice } ;
6- use ra_ap_paths:: Utf8PathBuf ;
6+ use ra_ap_paths:: { AbsPath , Utf8PathBuf } ;
77use ra_ap_project_model:: ProjectManifest ;
88use ra_ap_project_model:: { CargoConfig , ManifestPath } ;
99use ra_ap_span:: Edition ;
@@ -136,6 +136,8 @@ impl<'a> RustAnalyzer<'a> {
136136struct 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+
174182fn 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 {
0 commit comments