diff --git a/crates/oxc_formatter/src/write/arrow_function_expression.rs b/crates/oxc_formatter/src/write/arrow_function_expression.rs index 7e5f66a0e4998..f4dc6db90fff5 100644 --- a/crates/oxc_formatter/src/write/arrow_function_expression.rs +++ b/crates/oxc_formatter/src/write/arrow_function_expression.rs @@ -170,21 +170,9 @@ impl<'a> Format<'a> for FormatJsArrowFunctionExpression<'a, '_> { true } Expression::JSXElement(_) | Expression::JSXFragment(_) => true, - Expression::TemplateLiteral(template) => { - is_multiline_template_starting_on_same_line( - template.span.start, - template, - f.source_text(), - ) + _ => { + is_multiline_template_starting_on_same_line(expression, f.source_text()) } - Expression::TaggedTemplateExpression(template) => { - is_multiline_template_starting_on_same_line( - template.span.start, - &template.quasi, - f.source_text(), - ) - } - _ => false, } }); @@ -392,10 +380,15 @@ impl<'a, 'b> ArrowFunctionLayout<'a, 'b> { /// /// Returns `false` because the template isn't on the same line as the '+' token. pub fn is_multiline_template_starting_on_same_line( - start: u32, - template: &TemplateLiteral, + expression: &Expression, source_text: SourceText, ) -> bool { + let (start, template) = match expression { + Expression::TemplateLiteral(template) => (template.span.start, template.as_ref()), + Expression::TaggedTemplateExpression(tagged) => (tagged.span.start, &tagged.quasi), + _ => return false, + }; + template.quasis.iter().any(|quasi| source_text.contains_newline(quasi.span)) && !source_text.has_newline_before(start) } diff --git a/crates/oxc_formatter/src/write/call_arguments.rs b/crates/oxc_formatter/src/write/call_arguments.rs index dfc6443948782..d12fc44be3d7a 100644 --- a/crates/oxc_formatter/src/write/call_arguments.rs +++ b/crates/oxc_formatter/src/write/call_arguments.rs @@ -959,19 +959,11 @@ fn is_multiline_template_only_args(arguments: &[Argument], source_text: SourceTe return false; } - match arguments.first().unwrap() { - Argument::TemplateLiteral(template) => { - is_multiline_template_starting_on_same_line(template.span.start, template, source_text) - } - Argument::TaggedTemplateExpression(template) => { - is_multiline_template_starting_on_same_line( - template.span.start, - &template.quasi, - source_text, - ) - } - _ => false, - } + arguments + .first() + .unwrap() + .as_expression() + .is_some_and(|expr| is_multiline_template_starting_on_same_line(expr, source_text)) } /// This function is used to check if the code is a hook-like code: diff --git a/crates/oxc_formatter/src/write/mod.rs b/crates/oxc_formatter/src/write/mod.rs index 64dbb6fc66459..51ff8f9505de3 100644 --- a/crates/oxc_formatter/src/write/mod.rs +++ b/crates/oxc_formatter/src/write/mod.rs @@ -78,6 +78,7 @@ use crate::{ use self::{ array_expression::FormatArrayExpression, + arrow_function_expression::is_multiline_template_starting_on_same_line, class::format_grouped_parameters_with_return_type, function::should_group_function_parameters, object_like::ObjectLike, @@ -215,13 +216,20 @@ impl<'a> FormatWrite<'a> for AstNode<'a, CallExpression<'a>> { let arguments = self.arguments(); let optional = self.optional(); - if callee.as_member_expression().is_some_and(|e| { - matches!( - e, - MemberExpression::StaticMemberExpression(_) - | MemberExpression::ComputedMemberExpression(_) - ) - }) && !callee.needs_parentheses(f) + let is_template_literal_single_arg = arguments.len() == 1 + && arguments.first().unwrap().as_expression().is_some_and(|expr| { + is_multiline_template_starting_on_same_line(expr, f.source_text()) + }); + + if !is_template_literal_single_arg + && callee.as_member_expression().is_some_and(|e| { + matches!( + e, + MemberExpression::StaticMemberExpression(_) + | MemberExpression::ComputedMemberExpression(_) + ) + }) + && !callee.needs_parentheses(f) { MemberChain::from_call_expression(self, f).fmt(f) } else { diff --git a/crates/oxc_formatter/tests/fixtures/js/calls/template-literal-argument.js.snap b/crates/oxc_formatter/tests/fixtures/js/calls/template-literal-argument.js.snap index 3a4b3f4b727e4..edf7405b1b994 100644 --- a/crates/oxc_formatter/tests/fixtures/js/calls/template-literal-argument.js.snap +++ b/crates/oxc_formatter/tests/fixtures/js/calls/template-literal-argument.js.snap @@ -12,15 +12,13 @@ expect(genCode(createVNodeCall(null, `"div"`, mockProps))) `) ==================== Output ==================== -expect( - genCode(createVNodeCall(null, `"div"`, mockProps)), -).toMatchInlineSnapshot(` +expect(genCode(createVNodeCall(null, `"div"`, mockProps))) + .toMatchInlineSnapshot(` `); expect(genCode(createVNodeCall(null, `"div"`, mockProps))) .toMatchInlineSnapshot(` - `) - .toMatchInlineSnapshot(` + `).toMatchInlineSnapshot(` `); ===================== End =====================