diff options
Diffstat (limited to 'crates/vfs')
-rw-r--r-- | crates/vfs/src/file_set.rs | 84 |
1 files changed, 58 insertions, 26 deletions
diff --git a/crates/vfs/src/file_set.rs b/crates/vfs/src/file_set.rs index 3085fd818..cb65c17e0 100644 --- a/crates/vfs/src/file_set.rs +++ b/crates/vfs/src/file_set.rs | |||
@@ -26,38 +26,70 @@ impl FileSet { | |||
26 | self.files.get(&path).copied() | 26 | self.files.get(&path).copied() |
27 | } | 27 | } |
28 | 28 | ||
29 | pub fn file_name_and_extension(&self, file: FileId) -> Option<(&str, Option<&str>)> { | 29 | pub fn possible_sudmobule_names(&self, module_file: FileId) -> Vec<String> { |
30 | self.paths[&file].file_name_and_extension() | 30 | let directory_to_look_for_submodules = match self.get_directory_with_submodules(module_file) |
31 | } | 31 | { |
32 | 32 | Some(directory) => directory, | |
33 | pub fn list_files_with_extensions( | 33 | None => return Vec::new(), |
34 | &self, | ||
35 | anchor: FileId, | ||
36 | anchor_relative_path: Option<&str>, | ||
37 | ) -> Vec<(&str, Option<&str>)> { | ||
38 | let anchor_directory = { | ||
39 | let path = self.paths[&anchor].clone(); | ||
40 | match anchor_relative_path { | ||
41 | Some(anchor_relative_path) => path.join(anchor_relative_path), | ||
42 | None => path.parent(), | ||
43 | } | ||
44 | }; | 34 | }; |
45 | 35 | self.paths | |
46 | if let Some(anchor_directory) = anchor_directory { | 36 | .iter() |
47 | self.paths | 37 | .filter_map(|(_, path)| { |
48 | .iter() | 38 | if path.parent()? == directory_to_look_for_submodules { |
49 | .filter_map(|(_, path)| { | 39 | path.file_name_and_extension() |
50 | if path.parent()? == anchor_directory { | 40 | } else { |
51 | path.file_name_and_extension() | 41 | None |
42 | } | ||
43 | }) | ||
44 | .filter_map(|file_name_and_extension| match file_name_and_extension { | ||
45 | // TODO kb do not include the module file name itself, if present | ||
46 | // TODO kb wrong resolution for nesСпаted non-file modules (mod tests {mod <|>) | ||
47 | // TODO kb in src/bin when a module is included into another, | ||
48 | // the included file gets "moved" into a directory below and now cannot add any other modules | ||
49 | ("mod", Some("rs")) | ("lib", Some("rs")) | ("main", Some("rs")) => None, | ||
50 | (file_name, Some("rs")) => Some(file_name.to_owned()), | ||
51 | (subdirectory_name, None) => { | ||
52 | let mod_rs_path = | ||
53 | directory_to_look_for_submodules.join(subdirectory_name)?.join("mod.rs")?; | ||
54 | if self.files.contains_key(&mod_rs_path) { | ||
55 | Some(subdirectory_name.to_owned()) | ||
52 | } else { | 56 | } else { |
53 | None | 57 | None |
54 | } | 58 | } |
55 | }) | 59 | } |
56 | .collect() | 60 | _ => None, |
57 | } else { | 61 | }) |
58 | Vec::new() | 62 | .collect() |
63 | } | ||
64 | |||
65 | fn get_directory_with_submodules(&self, module_file: FileId) -> Option<VfsPath> { | ||
66 | let module_file_path = &self.paths[&module_file]; | ||
67 | let module_directory_path = module_file_path.parent()?; | ||
68 | match module_file_path.file_name_and_extension() { | ||
69 | Some(("mod", Some("rs"))) | Some(("lib", Some("rs"))) | Some(("main", Some("rs"))) => { | ||
70 | Some(module_directory_path) | ||
71 | } | ||
72 | Some((regular_rust_file_name, Some("rs"))) => { | ||
73 | if matches!( | ||
74 | ( | ||
75 | module_directory_path | ||
76 | .parent() | ||
77 | .as_ref() | ||
78 | .and_then(|path| path.file_name_and_extension()), | ||
79 | module_directory_path.file_name_and_extension(), | ||
80 | ), | ||
81 | (Some(("src", None)), Some(("bin", None))) | ||
82 | ) { | ||
83 | // files in /src/bin/ can import each other directly | ||
84 | Some(module_directory_path) | ||
85 | } else { | ||
86 | module_directory_path.join(regular_rust_file_name) | ||
87 | } | ||
88 | } | ||
89 | _ => None, | ||
59 | } | 90 | } |
60 | } | 91 | } |
92 | |||
61 | pub fn insert(&mut self, file_id: FileId, path: VfsPath) { | 93 | pub fn insert(&mut self, file_id: FileId, path: VfsPath) { |
62 | self.files.insert(path.clone(), file_id); | 94 | self.files.insert(path.clone(), file_id); |
63 | self.paths.insert(file_id, path); | 95 | self.paths.insert(file_id, path); |