@@ -38,21 +38,35 @@ fn fixes(ctx: &DiagnosticsContext, file_id: FileId) -> Option<Vec<Assist>> {
38
38
39
39
let source_root = ctx. sema . db . source_root ( ctx. sema . db . file_source_root ( file_id) ) ;
40
40
let our_path = source_root. path_for_file ( & file_id) ?;
41
- let ( module_name, _) = our_path. name_and_extension ( ) ?;
41
+ let ( mut module_name, _) = our_path. name_and_extension ( ) ?;
42
42
43
43
// Candidates to look for:
44
- // - `mod.rs` in the same folder
45
- // - we also check `main.rs` and `lib.rs`
44
+ // - `mod.rs`, `main.rs` and `lib.rs` in the same folder
46
45
// - `$dir.rs` in the parent folder, where `$dir` is the directory containing `self.file_id`
47
46
let parent = our_path. parent ( ) ?;
48
- let mut paths = vec ! [ parent. join( "mod.rs" ) ?, parent. join( "lib.rs" ) ?, parent. join( "main.rs" ) ?] ;
49
-
50
- // `submod/bla.rs` -> `submod.rs`
51
- let parent_mod = ( || {
52
- let ( name, _) = parent. name_and_extension ( ) ?;
53
- parent. parent ( ) ?. join ( & format ! ( "{}.rs" , name) )
54
- } ) ( ) ;
55
- paths. extend ( parent_mod) ;
47
+ let paths = {
48
+ let temp;
49
+ let parent = if module_name == "mod" {
50
+ // for mod.rs we need to actually look up one higher
51
+ // and take the parent as our to be module name
52
+ let ( name, _) = parent. name_and_extension ( ) ?;
53
+ module_name = name;
54
+ temp = parent. parent ( ) ?;
55
+ & temp
56
+ } else {
57
+ & parent
58
+ } ;
59
+ let mut paths =
60
+ vec ! [ parent. join( "mod.rs" ) ?, parent. join( "lib.rs" ) ?, parent. join( "main.rs" ) ?] ;
61
+
62
+ // `submod/bla.rs` -> `submod.rs`
63
+ let parent_mod = ( || {
64
+ let ( name, _) = parent. name_and_extension ( ) ?;
65
+ parent. parent ( ) ?. join ( & format ! ( "{}.rs" , name) )
66
+ } ) ( ) ;
67
+ paths. extend ( parent_mod) ;
68
+ paths
69
+ } ;
56
70
57
71
for & parent_id in paths. iter ( ) . filter_map ( |path| source_root. file_for_path ( path) ) {
58
72
for & krate in ctx. sema . db . relevant_crates ( parent_id) . iter ( ) {
@@ -156,6 +170,7 @@ fn make_fixes(
156
170
157
171
#[ cfg( test) ]
158
172
mod tests {
173
+
159
174
use crate :: tests:: { check_diagnostics, check_fix, check_fixes, check_no_fix} ;
160
175
161
176
#[ test]
@@ -232,6 +247,34 @@ mod foo;
232
247
) ;
233
248
}
234
249
250
+ #[ test]
251
+ fn unlinked_file_insert_in_empty_file_mod_file ( ) {
252
+ check_fix (
253
+ r#"
254
+ //- /main.rs
255
+ //- /foo/mod.rs
256
+ $0
257
+ "# ,
258
+ r#"
259
+ mod foo;
260
+ "# ,
261
+ ) ;
262
+ check_fix (
263
+ r#"
264
+ //- /main.rs
265
+ mod bar;
266
+ //- /bar.rs
267
+ // bar module
268
+ //- /bar/foo/mod.rs
269
+ $0
270
+ "# ,
271
+ r#"
272
+ // bar module
273
+ mod foo;
274
+ "# ,
275
+ ) ;
276
+ }
277
+
235
278
#[ test]
236
279
fn unlinked_file_old_style_modrs ( ) {
237
280
check_fix (
0 commit comments