Skip to content

Commit e3d5ade

Browse files
committed
fix some fmt issue
1 parent 685df2b commit e3d5ade

3 files changed

Lines changed: 93 additions & 17 deletions

File tree

crates/emmylua_formatter/src/formatter/expr.rs

Lines changed: 38 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2532,23 +2532,46 @@ fn try_format_simple_inline_closure_expr(
25322532
}
25332533

25342534
let mut stats = block.get_stats();
2535-
let LuaStat::ReturnStat(return_stat) = stats.next()? else {
2536-
return None;
2537-
};
2538-
if stats.next().is_some() || node_has_direct_comment_child(return_stat.syntax()) {
2539-
return None;
2540-
}
2541-
2542-
let mut returned_exprs = return_stat.get_expr_list();
2543-
let returned_expr = returned_exprs.next()?;
2544-
if returned_exprs.next().is_some() {
2535+
let first_stat = stats.next()?;
2536+
if stats.next().is_some() || node_has_direct_comment_child(first_stat.syntax()) {
25452537
return None;
25462538
}
25472539

2548-
let returned_docs = format_expr(ctx, plan, &returned_expr);
2549-
if ir::ir_has_forced_line_break(&returned_docs) {
2550-
return None;
2551-
}
2540+
// Format a single-statement closure inline: `function (args) stmt end`.
2541+
// Supports return, call, and other statement types subject to line-width constraint.
2542+
let body_docs: Vec<DocIR> = match &first_stat {
2543+
LuaStat::ReturnStat(return_stat) => {
2544+
let mut returned_exprs = return_stat.get_expr_list();
2545+
let returned_expr = returned_exprs.next()?;
2546+
if returned_exprs.next().is_some() {
2547+
return None;
2548+
}
2549+
let returned_docs = format_expr(ctx, plan, &returned_expr);
2550+
if ir::ir_has_forced_line_break(&returned_docs) {
2551+
return None;
2552+
}
2553+
let mut docs = vec![ir::syntax_token(LuaTokenKind::TkReturn)];
2554+
docs.push(ir::space());
2555+
docs.extend(returned_docs);
2556+
docs
2557+
}
2558+
LuaStat::CallExprStat(call_stat) => {
2559+
let call_expr = call_stat.get_call_expr()?;
2560+
let docs = format_expr(ctx, plan, &call_expr.into());
2561+
if ir::ir_has_forced_line_break(&docs) {
2562+
return None;
2563+
}
2564+
docs
2565+
}
2566+
_ => {
2567+
let stmt_text = first_stat.syntax().text().to_string();
2568+
let trimmed = stmt_text.trim();
2569+
if trimmed.contains('\n') {
2570+
return None;
2571+
}
2572+
vec![ir::source_node_trimmed(first_stat.syntax().clone())]
2573+
}
2574+
};
25522575

25532576
let mut docs = vec![ir::syntax_token(LuaTokenKind::TkFunction)];
25542577
if let Some(params) = expr.get_params_list() {
@@ -2557,9 +2580,7 @@ fn try_format_simple_inline_closure_expr(
25572580
}
25582581
docs.extend(shell_plan.params);
25592582
docs.push(ir::space());
2560-
docs.push(ir::syntax_token(LuaTokenKind::TkReturn));
2561-
docs.push(ir::space());
2562-
docs.extend(returned_docs);
2583+
docs.extend(body_docs);
25632584
docs.push(ir::space());
25642585
docs.push(ir::syntax_token(LuaTokenKind::TkEnd));
25652586

crates/emmylua_formatter/src/test/config_tests.rs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,51 @@ end
528528
);
529529
}
530530

531+
#[test]
532+
fn test_simple_lambda_always_collapses_non_return_closure() {
533+
let config = LuaFormatConfig {
534+
output: OutputConfig {
535+
simple_lambda_single_line: SimpleLambdaSingleLine::Always,
536+
..Default::default()
537+
},
538+
..Default::default()
539+
};
540+
541+
assert_format_with_config!(
542+
r#"buttonRegister(self._btnClose, function()
543+
self:_onBtnEventClose()
544+
end)
545+
"#,
546+
r#"buttonRegister(self._btnClose, function () self:_onBtnEventClose() end)
547+
"#,
548+
config
549+
);
550+
}
551+
552+
#[test]
553+
fn test_simple_lambda_never_expands_non_return_closure() {
554+
let config = LuaFormatConfig {
555+
output: OutputConfig {
556+
simple_lambda_single_line: SimpleLambdaSingleLine::Never,
557+
..Default::default()
558+
},
559+
..Default::default()
560+
};
561+
562+
assert_format_with_config!(
563+
r#"buttonRegister(self._btnClose, function() self:_onBtnEventClose() end)
564+
"#,
565+
r#"buttonRegister(
566+
self._btnClose,
567+
function ()
568+
self:_onBtnEventClose()
569+
end
570+
)
571+
"#,
572+
config
573+
);
574+
}
575+
531576
// ========== indentation ==========
532577

533578
#[test]

crates/emmylua_formatter/src/test/expression_tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,16 @@ end)
767767
);
768768
}
769769

770+
#[test]
771+
fn test_inline_lambda_callback_no_return_stays_inline() {
772+
assert_format!(
773+
r#"buttonRegister(self._btnClose, function() self:_onBtnEventClose() end)
774+
"#,
775+
r#"buttonRegister(self._btnClose, function () self:_onBtnEventClose() end)
776+
"#
777+
);
778+
}
779+
770780
#[test]
771781
fn test_simple_inline_lambda_callback_stays_inline() {
772782
assert_format!(

0 commit comments

Comments
 (0)