Skip to content

Commit ae91343

Browse files
committed
refactor(fmt): Cleanup and add timing
1 parent 0e9a503 commit ae91343

File tree

1 file changed

+43
-28
lines changed

1 file changed

+43
-28
lines changed

src/format.rs

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use {
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

234234
pub 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

Comments
 (0)