@@ -54,6 +54,14 @@ pub(crate) fn on_enter(db: &RootDatabase, position: FilePosition) -> Option<Text
54
54
cov_mark:: hit!( indent_block_contents) ;
55
55
return Some ( edit) ;
56
56
}
57
+
58
+ // Typing enter after the `{` of a use tree list.
59
+ if let Some ( edit) = find_node_at_offset ( file. syntax ( ) , position. offset - TextSize :: of ( '{' ) )
60
+ . and_then ( |list| on_enter_in_use_tree_list ( list, position) )
61
+ {
62
+ cov_mark:: hit!( indent_block_contents) ;
63
+ return Some ( edit) ;
64
+ }
57
65
}
58
66
59
67
None
@@ -111,6 +119,21 @@ fn on_enter_in_block(block: ast::BlockExpr, position: FilePosition) -> Option<Te
111
119
Some ( edit)
112
120
}
113
121
122
+ fn on_enter_in_use_tree_list ( list : ast:: UseTreeList , position : FilePosition ) -> Option < TextEdit > {
123
+ if list. syntax ( ) . text ( ) . contains_char ( '\n' ) {
124
+ return None ;
125
+ }
126
+
127
+ let indent = IndentLevel :: from_node ( list. syntax ( ) ) ;
128
+ let mut edit = TextEdit :: insert ( position. offset , format ! ( "\n {}$0" , indent + 1 ) ) ;
129
+ edit. union ( TextEdit :: insert (
130
+ list. r_curly_token ( ) ?. text_range ( ) . start ( ) ,
131
+ format ! ( "\n {}" , indent) ,
132
+ ) )
133
+ . ok ( ) ?;
134
+ Some ( edit)
135
+ }
136
+
114
137
fn block_contents ( block : & ast:: BlockExpr ) -> Option < SyntaxNode > {
115
138
let mut node = block. tail_expr ( ) . map ( |e| e. syntax ( ) . clone ( ) ) ;
116
139
@@ -484,4 +507,96 @@ fn f() {$0
484
507
"# ,
485
508
) ;
486
509
}
510
+
511
+ #[ test]
512
+ fn indents_use_tree_list ( ) {
513
+ do_check (
514
+ r#"
515
+ use crate::{$0};
516
+ "# ,
517
+ r#"
518
+ use crate::{
519
+ $0
520
+ };
521
+ "# ,
522
+ ) ;
523
+ do_check (
524
+ r#"
525
+ use crate::{$0Object, path::to::OtherThing};
526
+ "# ,
527
+ r#"
528
+ use crate::{
529
+ $0Object, path::to::OtherThing
530
+ };
531
+ "# ,
532
+ ) ;
533
+ do_check (
534
+ r#"
535
+ use {crate::{$0Object, path::to::OtherThing}};
536
+ "# ,
537
+ r#"
538
+ use {crate::{
539
+ $0Object, path::to::OtherThing
540
+ }};
541
+ "# ,
542
+ ) ;
543
+ do_check (
544
+ r#"
545
+ use {
546
+ crate::{$0Object, path::to::OtherThing}
547
+ };
548
+ "# ,
549
+ r#"
550
+ use {
551
+ crate::{
552
+ $0Object, path::to::OtherThing
553
+ }
554
+ };
555
+ "# ,
556
+ ) ;
557
+ }
558
+
559
+ #[ test]
560
+ fn does_not_indent_use_tree_list_when_not_at_curly_brace ( ) {
561
+ do_check_noop (
562
+ r#"
563
+ use path::{Thing$0};
564
+ "# ,
565
+ ) ;
566
+ }
567
+
568
+ #[ test]
569
+ fn does_not_indent_use_tree_list_without_curly_braces ( ) {
570
+ do_check_noop (
571
+ r#"
572
+ use path::Thing$0;
573
+ "# ,
574
+ ) ;
575
+ do_check_noop (
576
+ r#"
577
+ use path::$0Thing;
578
+ "# ,
579
+ ) ;
580
+ do_check_noop (
581
+ r#"
582
+ use path::Thing$0};
583
+ "# ,
584
+ ) ;
585
+ do_check_noop (
586
+ r#"
587
+ use path::{$0Thing;
588
+ "# ,
589
+ ) ;
590
+ }
591
+
592
+ #[ test]
593
+ fn does_not_indent_multiline_use_tree_list ( ) {
594
+ do_check_noop (
595
+ r#"
596
+ use path::{$0
597
+ Thing
598
+ };
599
+ "# ,
600
+ ) ;
601
+ }
487
602
}
0 commit comments