77 ignore:: Walk ,
88 itertools:: Itertools ,
99 ropey:: Rope ,
10- std:: path:: PathBuf ,
10+ std:: { path:: PathBuf , time :: Instant } ,
1111 thiserror:: Error ,
1212 tree_sitter:: Node ,
1313} ;
@@ -232,6 +232,7 @@ enum LineEnding {
232232}
233233
234234pub fn format ( node : Node , rope : & Rope , config : Config ) -> Result < String , FormatError > {
235+ let start = Instant :: now ( ) ;
235236 let line_ending = rope
236237 . chars ( )
237238 . tuple_windows ( )
@@ -244,13 +245,20 @@ pub fn format(node: Node, rope: &Rope, config: Config) -> Result<String, FormatE
244245 } )
245246 . unwrap_or ( LineEnding :: Lf ) ;
246247
247- Ok ( utils:: remove_indent_prefix ( & traverse (
248+ let formatted = utils:: remove_indent_prefix ( & traverse (
248249 node,
249250 rope,
250251 line_ending,
251252 config,
252253 State :: default ( ) ,
253- ) ?) )
254+ ) ?) ;
255+
256+ log:: debug!(
257+ "formatted {} lines in {} ms" ,
258+ rope. len_lines( ) ,
259+ start. elapsed( ) . as_millis( )
260+ ) ;
261+ Ok ( formatted)
254262}
255263
256264#[ derive( Debug , Clone , Copy , Default ) ]
@@ -417,21 +425,22 @@ fn traverse(
417425 }
418426 }
419427 "arguments" => {
428+ handles_comments = true ;
429+
420430 check ( field ( node, "open" ) ?) ?;
421431 check ( field ( node, "close" ) ?) ?;
422- handles_comments = true ;
423432 let is_multiline = !same_line ( node, node) ;
424433
425- let mut prev_sibling = None ;
434+ let mut maybe_prev = None ;
426435 let mut is_first_arg = true ;
427436 let mut fmt_skip = false ;
428437 node. children ( & mut node. walk ( ) )
429438 . skip ( 1 )
430439 . take ( node. child_count ( ) - 2 )
431440 . map ( |child| {
432441 let maybe_prev = {
433- let tmp = prev_sibling ;
434- prev_sibling = Some ( child) ;
442+ let tmp = maybe_prev ;
443+ maybe_prev = Some ( child) ;
435444 tmp
436445 } ;
437446 if child
@@ -514,6 +523,7 @@ fn traverse(
514523 }
515524 "binary_operator" => {
516525 handles_comments = true ;
526+
517527 let lhs = field ( node, "lhs" ) ?;
518528 let operator = field ( node, "operator" ) ?;
519529 let rhs = field ( node, "rhs" ) ?;
@@ -563,13 +573,14 @@ fn traverse(
563573 )
564574 }
565575 "braced_expression" => {
576+ handles_comments = true ;
577+
566578 check ( field ( node, "open" ) ?) ?;
567579 check ( field ( node, "close" ) ?) ?;
568- handles_comments = true ;
569580 let mut cursor = node. walk ( ) ;
570581 let is_multiline = !same_line ( node, node) ;
571582
572- let mut prev_end = None ;
583+ let mut maybe_prev_end = None ;
573584 let mut fmt_skip = false ;
574585 let lines = node
575586 . children ( & mut cursor)
@@ -590,13 +601,13 @@ fn traverse(
590601 fmt ( child) ?
591602 } ;
592603 if is_fmt_skip_comment ( & child)
593- && prev_end
604+ && maybe_prev_end
594605 . map ( |prev_end| child. start_position ( ) . row > prev_end)
595606 . unwrap_or ( true )
596607 {
597608 fmt_skip = true ;
598609 }
599- let result = match prev_end {
610+ let result = match maybe_prev_end {
600611 Some ( prev_end)
601612 if child. kind ( ) == "comment"
602613 && prev_end == child. start_position ( ) . row =>
@@ -620,7 +631,7 @@ fn traverse(
620631 }
621632 None => line,
622633 } ;
623- prev_end = Some ( end_position ( child) . row ) ;
634+ maybe_prev_end = Some ( end_position ( child) . row ) ;
624635 Ok ( result)
625636 } )
626637 . collect :: < Result < String , FormatError > > ( ) ?;
@@ -683,6 +694,7 @@ fn traverse(
683694 "complex" => fmt_raw ( node) ,
684695 "extract_operator" => {
685696 handles_comments = true ;
697+
686698 let lhs = field ( node, "lhs" ) ?;
687699 let operator = field ( node, "operator" ) ?;
688700 let maybe_rhs = field_optional ( node, "rhs" ) ;
@@ -728,6 +740,7 @@ fn traverse(
728740 "float" => fmt_raw ( node) ,
729741 "for_statement" => {
730742 handles_comments = true ;
743+
731744 let condition_is_multiline = !same_line ( field ( node, "open" ) ?, field ( node, "close" ) ?) ;
732745 let loop_header_is_multiline =
733746 !same_line ( field ( node, "variable" ) ?, field ( node, "sequence" ) ?) ;
@@ -863,6 +876,7 @@ fn traverse(
863876 }
864877 "if_statement" => {
865878 handles_comments = true ;
879+
866880 let is_multiline = state. make_multiline || !same_line ( node, node) ;
867881 let condition_is_multiline = !same_line ( field ( node, "open" ) ?, field ( node, "close" ) ?) ;
868882
@@ -981,19 +995,20 @@ fn traverse(
981995 }
982996 "parameters" => {
983997 handles_comments = true ;
998+
984999 let is_multiline = !same_line ( node, node) ;
9851000
986- let mut prev_sibling = None ;
1001+ let mut maybe_prev = None ;
9871002 let mut is_first_param = true ;
9881003 let mut fmt_skip = false ;
9891004 let mut cursor = node. walk ( ) ;
9901005 node. children ( & mut cursor)
9911006 . skip ( 1 )
9921007 . take ( node. child_count ( ) - 2 )
9931008 . map ( |child| {
994- let prev_sibling = {
995- let tmp = prev_sibling ;
996- prev_sibling = Some ( child) ;
1009+ let maybe_prev = {
1010+ let tmp = maybe_prev ;
1011+ maybe_prev = Some ( child) ;
9971012 tmp
9981013 } ;
9991014 if child
@@ -1010,14 +1025,14 @@ fn traverse(
10101025 fmt ( child) ?
10111026 } ;
10121027 if is_fmt_skip_comment ( & child)
1013- && prev_sibling
1028+ && maybe_prev
10141029 . map ( |sibling| end_position ( sibling) . row < child. start_position ( ) . row )
10151030 . unwrap_or ( true )
10161031 {
10171032 fmt_skip = true ;
10181033 }
10191034 if child. kind ( ) == "comment" {
1020- return Ok ( match prev_sibling {
1035+ return Ok ( match maybe_prev {
10211036 Some ( prev) if same_line ( prev, child) => {
10221037 format ! ( " {tmp}" )
10231038 }
@@ -1028,7 +1043,7 @@ fn traverse(
10281043 if child. kind ( ) == "comma" {
10291044 is_first_param = false ;
10301045 return Ok (
1031- if prev_sibling
1046+ if maybe_prev
10321047 . map ( |node| node. kind ( ) == "comment" )
10331048 . unwrap_or ( false )
10341049 {
@@ -1041,7 +1056,7 @@ fn traverse(
10411056 let result = format ! (
10421057 "{}{}" ,
10431058 if is_first_param {
1044- if prev_sibling
1059+ if maybe_prev
10451060 . map( |node| node. kind( ) == "comment" )
10461061 . unwrap_or( false )
10471062 {
@@ -1063,11 +1078,10 @@ fn traverse(
10631078 }
10641079 "parenthesized_expression" => {
10651080 handles_comments = true ;
1066- let mut cursor = node. walk ( ) ;
10671081
10681082 let mut prev_end = None ;
10691083 let lines = node
1070- . children ( & mut cursor )
1084+ . children ( & mut node . walk ( ) )
10711085 . skip ( 1 )
10721086 . take ( node. child_count ( ) - 2 )
10731087 . map ( |child| {
@@ -1109,10 +1123,10 @@ fn traverse(
11091123 }
11101124 "program" => {
11111125 handles_comments = true ;
1112- let mut cursor = node . walk ( ) ;
1113- let mut prev_end = None ;
1126+
1127+ let mut maybe_prev_end = None ;
11141128 let mut fmt_skip = false ;
1115- node. children ( & mut cursor )
1129+ node. children ( & mut node . walk ( ) )
11161130 . map ( |child| {
11171131 if child
11181132 . next_sibling ( )
@@ -1128,13 +1142,13 @@ fn traverse(
11281142 fmt ( child) ?
11291143 } ;
11301144 if is_fmt_skip_comment ( & child)
1131- && prev_end
1145+ && maybe_prev_end
11321146 . map ( |prev_end| child. start_position ( ) . row > prev_end)
11331147 . unwrap_or ( true )
11341148 {
11351149 fmt_skip = true ;
11361150 }
1137- let result = match prev_end {
1151+ let result = match maybe_prev_end {
11381152 Some ( prev_end)
11391153 if child. kind ( ) == "comment" && prev_end == end_position ( child) . row =>
11401154 {
@@ -1153,7 +1167,7 @@ fn traverse(
11531167 }
11541168 None => line,
11551169 } ;
1156- prev_end = Some ( end_position ( child) . row ) ;
1170+ maybe_prev_end = Some ( end_position ( child) . row ) ;
11571171 Ok ( result)
11581172 } )
11591173 . chain ( std:: iter:: once ( Ok ( line_ending. into ( ) ) ) )
@@ -1265,6 +1279,7 @@ fn traverse(
12651279 }
12661280 "while_statement" => {
12671281 handles_comments = true ;
1282+
12681283 let condition_is_multiline = !same_line ( field ( node, "open" ) ?, field ( node, "close" ) ?) ;
12691284
12701285 let mut out = String :: with_capacity ( node. end_byte ( ) - node. start_byte ( ) ) ;
0 commit comments