@@ -9,7 +9,7 @@ use ide_db::{
9
9
RootDatabase ,
10
10
} ;
11
11
use syntax:: {
12
- ast:: { self , HasModuleItem , HasName } ,
12
+ ast:: { self , edit :: IndentLevel , HasModuleItem , HasName } ,
13
13
AstNode , TextRange , TextSize ,
14
14
} ;
15
15
use text_edit:: TextEdit ;
@@ -184,30 +184,36 @@ fn make_fixes(
184
184
Some ( last) => {
185
185
cov_mark:: hit!( unlinked_file_append_to_existing_mods) ;
186
186
let offset = last. syntax ( ) . text_range ( ) . end ( ) ;
187
- mod_decl_builder. insert ( offset, format ! ( "\n {mod_decl}" ) ) ;
188
- pub_mod_decl_builder. insert ( offset, format ! ( "\n {pub_mod_decl}" ) ) ;
187
+ let indent = IndentLevel :: from_node ( last. syntax ( ) ) ;
188
+ mod_decl_builder. insert ( offset, format ! ( "\n {indent}{mod_decl}" ) ) ;
189
+ pub_mod_decl_builder. insert ( offset, format ! ( "\n {indent}{pub_mod_decl}" ) ) ;
189
190
}
190
191
None => {
191
192
// Prepend before the first item in the file.
192
193
match items. next ( ) {
193
- Some ( item ) => {
194
+ Some ( first ) => {
194
195
cov_mark:: hit!( unlinked_file_prepend_before_first_item) ;
195
- let offset = item. syntax ( ) . text_range ( ) . start ( ) ;
196
- mod_decl_builder. insert ( offset, format ! ( "{mod_decl}\n \n " ) ) ;
197
- pub_mod_decl_builder. insert ( offset, format ! ( "{pub_mod_decl}\n \n " ) ) ;
196
+ let offset = first. syntax ( ) . text_range ( ) . start ( ) ;
197
+ let indent = IndentLevel :: from_node ( first. syntax ( ) ) ;
198
+ mod_decl_builder. insert ( offset, format ! ( "{mod_decl}\n \n {indent}" ) ) ;
199
+ pub_mod_decl_builder. insert ( offset, format ! ( "{pub_mod_decl}\n \n {indent}" ) ) ;
198
200
}
199
201
None => {
200
202
// No items in the file, so just append at the end.
201
203
cov_mark:: hit!( unlinked_file_empty_file) ;
204
+ let mut indent = IndentLevel :: from ( 0 ) ;
202
205
let offset = match & source {
203
206
ModuleSource :: SourceFile ( it) => it. syntax ( ) . text_range ( ) . end ( ) ,
204
207
ModuleSource :: Module ( it) => {
208
+ indent = IndentLevel :: from_node ( it. syntax ( ) ) + 1 ;
205
209
it. item_list ( ) ?. r_curly_token ( ) ?. text_range ( ) . start ( )
206
210
}
207
- ModuleSource :: BlockExpr ( _) => return None ,
211
+ ModuleSource :: BlockExpr ( it) => {
212
+ it. stmt_list ( ) ?. r_curly_token ( ) ?. text_range ( ) . start ( )
213
+ }
208
214
} ;
209
- mod_decl_builder. insert ( offset, format ! ( "{mod_decl}\n " ) ) ;
210
- pub_mod_decl_builder. insert ( offset, format ! ( "{pub_mod_decl}\n " ) ) ;
215
+ mod_decl_builder. insert ( offset, format ! ( "{indent}{ mod_decl}\n " ) ) ;
216
+ pub_mod_decl_builder. insert ( offset, format ! ( "{indent}{ pub_mod_decl}\n " ) ) ;
211
217
}
212
218
}
213
219
}
@@ -406,15 +412,13 @@ mod foo;
406
412
mod bar;
407
413
//- /bar.rs
408
414
mod foo {
409
-
410
415
}
411
416
//- /bar/foo/baz.rs
412
417
$0
413
418
"# ,
414
419
r#"
415
420
mod foo {
416
-
417
- mod baz;
421
+ mod baz;
418
422
}
419
423
"# ,
420
424
) ;
@@ -428,15 +432,13 @@ mod baz;
428
432
mod bar;
429
433
//- /bar.rs
430
434
mod baz {
431
-
432
435
}
433
436
//- /bar/baz/foo/mod.rs
434
437
$0
435
438
"# ,
436
439
r#"
437
440
mod baz {
438
-
439
- mod foo;
441
+ mod foo;
440
442
}
441
443
"# ,
442
444
) ;
@@ -448,15 +450,13 @@ mod foo;
448
450
r#"
449
451
//- /main.rs
450
452
mod bar {
451
-
452
453
}
453
454
//- /bar/foo/mod.rs
454
455
$0
455
456
"# ,
456
457
r#"
457
458
mod bar {
458
-
459
- mod foo;
459
+ mod foo;
460
460
}
461
461
"# ,
462
462
) ;
0 commit comments