Skip to content

Commit b54c18a

Browse files
authored
fix(fmt): properly calc fn header size (#12343)
* fix(fmt): properly calc fn header size * docs: add more cmnts * fix: revert bun.lock changes
1 parent 7d5038e commit b54c18a

File tree

3 files changed

+17
-12
lines changed

3 files changed

+17
-12
lines changed

crates/fmt/src/state/sol.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -491,12 +491,14 @@ impl<'ast> State<'_, 'ast> {
491491
let params_format = match header_style {
492492
MultilineFuncHeaderStyle::ParamsAlways => ListFormat::always_break(),
493493
MultilineFuncHeaderStyle::All
494-
if header.parameters.len() > 1 && !self.can_header_be_inlined(header) =>
494+
if header.parameters.len() > 1
495+
&& !self.can_header_be_inlined(header, body.is_some()) =>
495496
{
496497
ListFormat::always_break()
497498
}
498499
MultilineFuncHeaderStyle::AllParams
499-
if !header.parameters.is_empty() && !self.can_header_be_inlined(header) =>
500+
if !header.parameters.is_empty()
501+
&& !self.can_header_be_inlined(header, body.is_some()) =>
500502
{
501503
ListFormat::always_break()
502504
}
@@ -2552,9 +2554,7 @@ impl<'ast> State<'_, 'ast> {
25522554
els_opt.is_none_or(|els| self.is_inline_stmt(els, 6))
25532555
}
25542556

2555-
fn can_header_be_inlined(&mut self, header: &ast::FunctionHeader<'_>) -> bool {
2556-
const FUNCTION: usize = 8;
2557-
2557+
fn can_header_be_inlined(&mut self, header: &ast::FunctionHeader<'_>, has_body: bool) -> bool {
25582558
// ' ' + visibility
25592559
let visibility = header.visibility.map_or(0, |v| self.estimate_size(v.span) + 1);
25602560
// ' ' + state mutability
@@ -2568,19 +2568,25 @@ impl<'ast> State<'_, 'ast> {
25682568
let returns = header.returns.as_ref().map_or(0, |ret| {
25692569
ret.vars
25702570
.iter()
2571-
.fold(0, |len, p| if len != 0 { len + 2 } else { 8 } + self.estimate_size(p.span))
2571+
.fold(0, |len, p| if len != 0 { len + 2 } else { 10 } + self.estimate_size(p.span))
25722572
});
2573+
// ' {' or ';'
2574+
let end = if has_body { 2 } else { 1 };
25732575

2574-
FUNCTION
2575-
+ self.estimate_header_params_size(header)
2576+
self.estimate_header_params_size(header) // accounts for 'function name(..)'
25762577
+ visibility
25772578
+ mutability
25782579
+ modifiers
25792580
+ override_
25802581
+ returns
2582+
+ end
25812583
<= self.space_left()
25822584
}
25832585

2586+
fn can_header_params_be_inlined(&mut self, header: &ast::FunctionHeader<'_>) -> bool {
2587+
self.estimate_header_params_size(header) <= self.space_left()
2588+
}
2589+
25842590
fn estimate_header_params_size(&mut self, header: &ast::FunctionHeader<'_>) -> usize {
25852591
// '(' + param + (', ' + param) + ')'
25862592
let params = header
@@ -2593,10 +2599,6 @@ impl<'ast> State<'_, 'ast> {
25932599
9 + header.name.map_or(0, |name| self.estimate_size(name.span) + 1) + params
25942600
}
25952601

2596-
fn can_header_params_be_inlined(&mut self, header: &ast::FunctionHeader<'_>) -> bool {
2597-
self.estimate_header_params_size(header) <= self.space_left()
2598-
}
2599-
26002602
fn estimate_lhs_size(&self, expr: &ast::Expr<'_>, parent_op: &ast::BinOp) -> usize {
26012603
match &expr.kind {
26022604
ast::ExprKind::Binary(lhs, op, _) if op.kind.group() == parent_op.kind.group() => {

crates/fmt/testdata/ReprosFunctionDefs/all.120.fmt.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
// config: multiline_func_header = "all"
33
contract Repros {
44
// https://github.com/foundry-rs/foundry/issues/12109
5+
function createDefaultStream(UD21x18 ratePerSecond, uint40 startTime, IERC20 token_) internal returns (uint256);
6+
57
function calculateStreamedPercentage(
68
uint128 streamedAmount,
79
uint128 depositedAmount
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
contract Repros {
22
// https://github.com/foundry-rs/foundry/issues/12109
3+
function createDefaultStream(UD21x18 ratePerSecond, uint40 startTime, IERC20 token_) internal returns (uint256);
34
function calculateStreamedPercentage(uint128 streamedAmount, uint128 depositedAmount) internal pure returns (uint256) { a = 1; }
45
}

0 commit comments

Comments
 (0)