From 8efefb926dbac5d95221df2d365580e8beb415dc Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Tue, 25 Mar 2025 10:08:30 -0300 Subject: [PATCH 01/13] =?UTF-8?q?add=20raison=20d'=C3=AAtre?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c606d4d1..e33d1247 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Correct indentation for a documented function defined as table value ([#942](https://github.com/JohnnyMorganz/StyLua/issues/942)) + ### Added - Luau: Added support for parsing user-defined type functions ([#938](https://github.com/JohnnyMorganz/StyLua/issues/938)) From 59edc1a787ae7450aded24003e4186c42b17cb39 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Tue, 25 Mar 2025 10:13:24 -0300 Subject: [PATCH 02/13] target test --- tests/inputs/function-as-table-value.lua | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tests/inputs/function-as-table-value.lua diff --git a/tests/inputs/function-as-table-value.lua b/tests/inputs/function-as-table-value.lua new file mode 100644 index 00000000..25ea0aa4 --- /dev/null +++ b/tests/inputs/function-as-table-value.lua @@ -0,0 +1,9 @@ +-- https://github.com/JohnnyMorganz/StyLua/issues/942 +local t = { + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, +} From ba7aae454f8236f048e6e5210e950652cd27d793 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Wed, 26 Mar 2025 11:22:57 -0300 Subject: [PATCH 03/13] =?UTF-8?q?tab=E2=86=92spaces?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/inputs/function-as-table-value.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/inputs/function-as-table-value.lua b/tests/inputs/function-as-table-value.lua index 25ea0aa4..53f6e470 100644 --- a/tests/inputs/function-as-table-value.lua +++ b/tests/inputs/function-as-table-value.lua @@ -1,6 +1,6 @@ -- https://github.com/JohnnyMorganz/StyLua/issues/942 local t = { - plus_one = + plus_one = ---@param n number ---@return number function(n) From f2e90c58bcbc102f8a609acaec8a9f56b1e18c9a Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Thu, 27 Mar 2025 16:19:39 -0300 Subject: [PATCH 04/13] prepend newline --- src/formatters/table.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index 6c31f7a8..74f97f70 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -34,7 +34,18 @@ pub enum TableType { Empty, } +fn is_function_with_leading_trivia(expression: &Expression) -> bool { + match expression { + Expression::Function(anonymous_function) => { + !trivia_util::GetLeadingTrivia::leading_trivia(&anonymous_function.0).is_empty() + } + _ => false, + } +} + /// Formats an Expression value part of a k,v field pair +/// If value is an anonymous function with trivia, will prepend a newline so the trivia will align +/// to the function definition fn format_field_expression_value( ctx: &Context, expression: &Expression, @@ -64,7 +75,12 @@ fn format_field_expression_value( } } } else { - format_expression(ctx, expression, shape).update_trailing_trivia(trailing_trivia) + let formatted_expr = + format_expression(ctx, expression, shape).update_trailing_trivia(trailing_trivia); + if is_function_with_leading_trivia(expression) { + trivia_util::prepend_newline_indent(ctx, &formatted_expr, shape); + } + formatted_expr } } From 7d3fe75cc54d24e02f9679548abf7534ebb6e9c7 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Thu, 27 Mar 2025 16:21:22 -0300 Subject: [PATCH 05/13] add code to changelog --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e33d1247..b3da742c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Correct indentation for a documented function defined as table value ([#942](https://github.com/JohnnyMorganz/StyLua/issues/942)) +```lua +local t = { + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, +} +``` + ### Added - Luau: Added support for parsing user-defined type functions ([#938](https://github.com/JohnnyMorganz/StyLua/issues/938)) From cedc89ecb88db1ae5b305c6f9d348f284cd4e083 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Thu, 27 Mar 2025 18:41:26 -0300 Subject: [PATCH 06/13] use tabs for input --- CHANGELOG.md | 12 ++++++------ tests/inputs/function-as-table-value.lua | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3da742c..e9ba5b57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,12 +13,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ```lua local t = { - plus_one = - ---@param n number - ---@return number - function(n) - return n + 1 - end, + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, } ``` diff --git a/tests/inputs/function-as-table-value.lua b/tests/inputs/function-as-table-value.lua index 53f6e470..730282fb 100644 --- a/tests/inputs/function-as-table-value.lua +++ b/tests/inputs/function-as-table-value.lua @@ -1,9 +1,9 @@ -- https://github.com/JohnnyMorganz/StyLua/issues/942 local t = { - plus_one = - ---@param n number - ---@return number - function(n) - return n + 1 - end, + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, } From 15e92e2dcf2bc452578d517771fa084e2003d995 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 09:42:10 -0300 Subject: [PATCH 07/13] add snap file --- ...s__standard@function-as-table-value.lua.snap | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/snapshots/tests__standard@function-as-table-value.lua.snap diff --git a/tests/snapshots/tests__standard@function-as-table-value.lua.snap b/tests/snapshots/tests__standard@function-as-table-value.lua.snap new file mode 100644 index 00000000..bed4f110 --- /dev/null +++ b/tests/snapshots/tests__standard@function-as-table-value.lua.snap @@ -0,0 +1,17 @@ +--- +source: tests/tests.rs +assertion_line: 18 +expression: "format(&contents, LuaVersion::Lua51)" +input_file: tests/inputs/function-as-table-value.lua +--- +-- https://github.com/JohnnyMorganz/StyLua/issues/942 +local t = { + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, +} + + From 20da09e1a6cef5165502e394dae83d378c6336b7 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 09:48:15 -0300 Subject: [PATCH 08/13] correct snap --- tests/snapshots/tests__standard@function-as-table-value.lua.snap | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/snapshots/tests__standard@function-as-table-value.lua.snap b/tests/snapshots/tests__standard@function-as-table-value.lua.snap index bed4f110..bc390243 100644 --- a/tests/snapshots/tests__standard@function-as-table-value.lua.snap +++ b/tests/snapshots/tests__standard@function-as-table-value.lua.snap @@ -14,4 +14,3 @@ local t = { end, } - From 2a66315c38157c992574eb07161655ba7deaa178 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 09:51:09 -0300 Subject: [PATCH 09/13] correct formatting --- src/formatters/table.rs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index 74f97f70..a8b1a470 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -75,10 +75,14 @@ fn format_field_expression_value( } } } else { - let formatted_expr = - format_expression(ctx, expression, shape).update_trailing_trivia(trailing_trivia); + let formatted_expr = format_expression(ctx, expression, shape); if is_function_with_leading_trivia(expression) { - trivia_util::prepend_newline_indent(ctx, &formatted_expr, shape); + let formatted_expr = formatted_expr + .update_trailing_trivia(trailing_trivia) + .update_leading_trivia(FormatTriviaType::Append(vec![create_indent_trivia( + ctx, shape, + )])); + return trivia_util::prepend_newline_indent(ctx, &formatted_expr, shape.reset()); } formatted_expr } @@ -221,6 +225,15 @@ fn format_field( let shape = shape + (strip_trivia(&key).to_string().len() + 3); // 3 = " = " let value = format_field_expression_value(ctx, value, shape); + let equal = if is_function_with_leading_trivia(&value) { + // function definition goes in the next line, so we remove space between = and newline + equal.update_trailing_trivia(FormatTriviaType::Replace(vec![Token::new( + TokenType::spaces(0), + )])) + } else { + equal + }; + Field::NameKey { key, equal, value } } Field::NoKey(expression) => { From 9f9dc98f9b6e49d13b73d012c21da027633ccccf Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 09:54:53 -0300 Subject: [PATCH 10/13] add doc-comment --- src/formatters/table.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index a8b1a470..f56c1ba5 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -34,6 +34,8 @@ pub enum TableType { Empty, } +/// Detect function with leading comments/doc-comments when used as a table value +/// Such (anonymous) function definition gets formatted differently, in a separate line line fn is_function_with_leading_trivia(expression: &Expression) -> bool { match expression { Expression::Function(anonymous_function) => { From 957092b489946be9ac0e92c4bda0f567f4d3bc76 Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 10:00:57 -0300 Subject: [PATCH 11/13] revert original code for formatting --- src/formatters/table.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index f56c1ba5..15a0518d 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -86,7 +86,7 @@ fn format_field_expression_value( )])); return trivia_util::prepend_newline_indent(ctx, &formatted_expr, shape.reset()); } - formatted_expr + formatted_expr.update_trailing_trivia(trailing_trivia) } } From 24dbe0d8e4812cb60b7a46214be5af0f835a68cf Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 13:56:44 -0300 Subject: [PATCH 12/13] =?UTF-8?q?add=20single=20indent=20to=20full=20?= =?UTF-8?q?=F0=9D=91=93=20definition?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 10 +++++----- src/formatters/table.rs | 13 ++++++------- tests/inputs/function-as-table-value.lua | 10 +++++----- ...tests__standard@function-as-table-value.lua.snap | 10 +++++----- 4 files changed, 21 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e9ba5b57..8f31bb31 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,11 +14,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ```lua local t = { plus_one = - ---@param n number - ---@return number - function(n) - return n + 1 - end, + ---@param n number + ---@return number + function(n) + return n + 1 + end, } ``` diff --git a/src/formatters/table.rs b/src/formatters/table.rs index 15a0518d..b82e8e03 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -77,16 +77,15 @@ fn format_field_expression_value( } } } else { - let formatted_expr = format_expression(ctx, expression, shape); if is_function_with_leading_trivia(expression) { - let formatted_expr = formatted_expr + let incr_shape = shape.increment_additional_indent(); + let incr_leading_trivia = vec![create_indent_trivia(ctx, incr_shape)]; + let formatted_expr = format_expression(ctx, expression, incr_shape) .update_trailing_trivia(trailing_trivia) - .update_leading_trivia(FormatTriviaType::Append(vec![create_indent_trivia( - ctx, shape, - )])); - return trivia_util::prepend_newline_indent(ctx, &formatted_expr, shape.reset()); + .update_leading_trivia(FormatTriviaType::Append(incr_leading_trivia)); + return trivia_util::prepend_newline_indent(ctx, &formatted_expr, incr_shape); } - formatted_expr.update_trailing_trivia(trailing_trivia) + format_expression(ctx, expression, shape).update_trailing_trivia(trailing_trivia) } } diff --git a/tests/inputs/function-as-table-value.lua b/tests/inputs/function-as-table-value.lua index 730282fb..9e58efcf 100644 --- a/tests/inputs/function-as-table-value.lua +++ b/tests/inputs/function-as-table-value.lua @@ -1,9 +1,9 @@ -- https://github.com/JohnnyMorganz/StyLua/issues/942 local t = { plus_one = - ---@param n number - ---@return number - function(n) - return n + 1 - end, + ---@param n number + ---@return number + function(n) + return n + 1 + end, } diff --git a/tests/snapshots/tests__standard@function-as-table-value.lua.snap b/tests/snapshots/tests__standard@function-as-table-value.lua.snap index bc390243..6df07b1b 100644 --- a/tests/snapshots/tests__standard@function-as-table-value.lua.snap +++ b/tests/snapshots/tests__standard@function-as-table-value.lua.snap @@ -7,10 +7,10 @@ input_file: tests/inputs/function-as-table-value.lua -- https://github.com/JohnnyMorganz/StyLua/issues/942 local t = { plus_one = - ---@param n number - ---@return number - function(n) - return n + 1 - end, + ---@param n number + ---@return number + function(n) + return n + 1 + end, } From 256989bb9d7fa093d695c2f85e6a7673dbbd493f Mon Sep 17 00:00:00 2001 From: Felipe Lema Date: Fri, 4 Apr 2025 14:15:59 -0300 Subject: [PATCH 13/13] add test for mixed definition --- .../function-as-table-value-in-mixed-def.lua | 14 +++++++++++++ ...ction-as-table-value-in-mixed-def.lua.snap | 21 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 tests/inputs/function-as-table-value-in-mixed-def.lua create mode 100644 tests/snapshots/tests__standard@function-as-table-value-in-mixed-def.lua.snap diff --git a/tests/inputs/function-as-table-value-in-mixed-def.lua b/tests/inputs/function-as-table-value-in-mixed-def.lua new file mode 100644 index 00000000..e480a214 --- /dev/null +++ b/tests/inputs/function-as-table-value-in-mixed-def.lua @@ -0,0 +1,14 @@ +local mixed = { + --- identity + ---@param n number + ---@return number + function(n) + return n + end, + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, +} diff --git a/tests/snapshots/tests__standard@function-as-table-value-in-mixed-def.lua.snap b/tests/snapshots/tests__standard@function-as-table-value-in-mixed-def.lua.snap new file mode 100644 index 00000000..eb02af8f --- /dev/null +++ b/tests/snapshots/tests__standard@function-as-table-value-in-mixed-def.lua.snap @@ -0,0 +1,21 @@ +--- +source: tests/tests.rs +assertion_line: 21 +expression: "format(&contents, LuaVersion::Lua51)" +input_file: tests/inputs/function-as-table-value-in-mixed-def.lua +--- +local mixed = { + --- identity + ---@param n number + ---@return number + function(n) + return n + end, + plus_one = + ---@param n number + ---@return number + function(n) + return n + 1 + end, +} +