From c81943b8c494b75a0e712da49eb48c9754d0a686 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:10:28 +0100 Subject: [PATCH 1/8] Migrate ignore tests to separate files Will make it easier to add new tests --- .../multiline-block-ignore-1.lua | 5 + .../multiline-block-ignore-2.lua | 6 + ...gnore-multiple-comments-leading-trivia.lua | 17 ++ .../multiline-block-ignore-no-ending.lua | 5 + .../multiline-block-ignore-no-starting.lua | 5 + ...multiline-block-ignore-scope-no-ending.lua | 7 + .../multiline-block-ignore-scope.lua | 8 + tests/inputs-ignore/singleline-ignore-1.lua | 3 + tests/inputs-ignore/singleline-ignore-2.lua | 4 + .../singleline-ignore-last-stmt.lua | 2 + .../singleline-ignore-stmt-block.lua | 5 + ..._ignores@multiline-block-ignore-1.lua.snap | 12 + ..._ignores@multiline-block-ignore-2.lua.snap | 13 + ...-multiple-comments-leading-trivia.lua.snap | 24 ++ ...@multiline-block-ignore-no-ending.lua.snap | 12 + ...ultiline-block-ignore-no-starting.lua.snap | 12 + ...line-block-ignore-scope-no-ending.lua.snap | 14 + ...ores@multiline-block-ignore-scope.lua.snap | 15 + ...ests__ignores@singleline-ignore-1.lua.snap | 10 + ...ests__ignores@singleline-ignore-2.lua.snap | 11 + ...nores@singleline-ignore-last-stmt.lua.snap | 9 + ...ores@singleline-ignore-stmt-block.lua.snap | 12 + tests/test_ignore.rs | 258 ------------------ tests/tests.rs | 8 + 24 files changed, 219 insertions(+), 258 deletions(-) create mode 100644 tests/inputs-ignore/multiline-block-ignore-1.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-2.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-multiple-comments-leading-trivia.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-no-ending.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-no-starting.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-scope-no-ending.lua create mode 100644 tests/inputs-ignore/multiline-block-ignore-scope.lua create mode 100644 tests/inputs-ignore/singleline-ignore-1.lua create mode 100644 tests/inputs-ignore/singleline-ignore-2.lua create mode 100644 tests/inputs-ignore/singleline-ignore-last-stmt.lua create mode 100644 tests/inputs-ignore/singleline-ignore-stmt-block.lua create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-1.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-2.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-multiple-comments-leading-trivia.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-no-ending.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-no-starting.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-scope-no-ending.lua.snap create mode 100644 tests/snapshots/tests__ignores@multiline-block-ignore-scope.lua.snap create mode 100644 tests/snapshots/tests__ignores@singleline-ignore-1.lua.snap create mode 100644 tests/snapshots/tests__ignores@singleline-ignore-2.lua.snap create mode 100644 tests/snapshots/tests__ignores@singleline-ignore-last-stmt.lua.snap create mode 100644 tests/snapshots/tests__ignores@singleline-ignore-stmt-block.lua.snap delete mode 100644 tests/test_ignore.rs diff --git a/tests/inputs-ignore/multiline-block-ignore-1.lua b/tests/inputs-ignore/multiline-block-ignore-1.lua new file mode 100644 index 00000000..53204fee --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-1.lua @@ -0,0 +1,5 @@ +local foo = bar +-- stylua: ignore start +local bar = baz +-- stylua: ignore end +local bar = baz diff --git a/tests/inputs-ignore/multiline-block-ignore-2.lua b/tests/inputs-ignore/multiline-block-ignore-2.lua new file mode 100644 index 00000000..e62c4b0b --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-2.lua @@ -0,0 +1,6 @@ +local foo = bar +-- stylua: ignore start +local bar = baz +local bar = baz +-- stylua: ignore end +local bar = baz diff --git a/tests/inputs-ignore/multiline-block-ignore-multiple-comments-leading-trivia.lua b/tests/inputs-ignore/multiline-block-ignore-multiple-comments-leading-trivia.lua new file mode 100644 index 00000000..c8035c8d --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-multiple-comments-leading-trivia.lua @@ -0,0 +1,17 @@ +--stylua: ignore start +local a = 1 +--stylua: ignore end + +--stylua: ignore start +local b = 2 +--stylua: ignore end + +--stylua: ignore start +local c = 3 +--stylua: ignore end + +-- Some very large comment + +--stylua: ignore start +local d = 4 +--stylua: ignore end diff --git a/tests/inputs-ignore/multiline-block-ignore-no-ending.lua b/tests/inputs-ignore/multiline-block-ignore-no-ending.lua new file mode 100644 index 00000000..de8fc98a --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-no-ending.lua @@ -0,0 +1,5 @@ +local foo = bar +-- stylua: ignore start +local bar = baz +local bar = baz +local bar = baz diff --git a/tests/inputs-ignore/multiline-block-ignore-no-starting.lua b/tests/inputs-ignore/multiline-block-ignore-no-starting.lua new file mode 100644 index 00000000..f699243e --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-no-starting.lua @@ -0,0 +1,5 @@ +local foo = bar +local bar = baz +local bar = baz +-- stylua: ignore end +local bar = baz diff --git a/tests/inputs-ignore/multiline-block-ignore-scope-no-ending.lua b/tests/inputs-ignore/multiline-block-ignore-scope-no-ending.lua new file mode 100644 index 00000000..73dcea27 --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-scope-no-ending.lua @@ -0,0 +1,7 @@ +local foo = bar +do + -- stylua: ignore start + local bar = baz + local bar = baz +end +local bar = baz diff --git a/tests/inputs-ignore/multiline-block-ignore-scope.lua b/tests/inputs-ignore/multiline-block-ignore-scope.lua new file mode 100644 index 00000000..d9abd091 --- /dev/null +++ b/tests/inputs-ignore/multiline-block-ignore-scope.lua @@ -0,0 +1,8 @@ +local foo = bar +do + -- stylua: ignore start + local bar = baz + -- stylua: ignore end + local bar = baz +end +local bar = baz diff --git a/tests/inputs-ignore/singleline-ignore-1.lua b/tests/inputs-ignore/singleline-ignore-1.lua new file mode 100644 index 00000000..184059ff --- /dev/null +++ b/tests/inputs-ignore/singleline-ignore-1.lua @@ -0,0 +1,3 @@ +local foo = bar +-- stylua: ignore +local bar = baz diff --git a/tests/inputs-ignore/singleline-ignore-2.lua b/tests/inputs-ignore/singleline-ignore-2.lua new file mode 100644 index 00000000..2aad1740 --- /dev/null +++ b/tests/inputs-ignore/singleline-ignore-2.lua @@ -0,0 +1,4 @@ +local foo = bar +-- stylua: ignore +local bar = baz +local bar = baz diff --git a/tests/inputs-ignore/singleline-ignore-last-stmt.lua b/tests/inputs-ignore/singleline-ignore-last-stmt.lua new file mode 100644 index 00000000..8a292fdf --- /dev/null +++ b/tests/inputs-ignore/singleline-ignore-last-stmt.lua @@ -0,0 +1,2 @@ +-- stylua: ignore +return "hi" diff --git a/tests/inputs-ignore/singleline-ignore-stmt-block.lua b/tests/inputs-ignore/singleline-ignore-stmt-block.lua new file mode 100644 index 00000000..d2646f25 --- /dev/null +++ b/tests/inputs-ignore/singleline-ignore-stmt-block.lua @@ -0,0 +1,5 @@ +local x = 1 +-- stylua: ignore +function foo () + return x + 1 +end diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-1.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-1.lua.snap new file mode 100644 index 00000000..0faf7939 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-1.lua.snap @@ -0,0 +1,12 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +-- stylua: ignore start +local bar = baz +-- stylua: ignore end +local bar = baz + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-2.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-2.lua.snap new file mode 100644 index 00000000..4e5fbc54 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-2.lua.snap @@ -0,0 +1,13 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +-- stylua: ignore start +local bar = baz +local bar = baz +-- stylua: ignore end +local bar = baz + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-multiple-comments-leading-trivia.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-multiple-comments-leading-trivia.lua.snap new file mode 100644 index 00000000..8ad8a537 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-multiple-comments-leading-trivia.lua.snap @@ -0,0 +1,24 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +--stylua: ignore start +local a = 1 +--stylua: ignore end + +--stylua: ignore start +local b = 2 +--stylua: ignore end + +--stylua: ignore start +local c = 3 +--stylua: ignore end + +-- Some very large comment + +--stylua: ignore start +local d = 4 +--stylua: ignore end + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-no-ending.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-no-ending.lua.snap new file mode 100644 index 00000000..746b6bb6 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-no-ending.lua.snap @@ -0,0 +1,12 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +-- stylua: ignore start +local bar = baz +local bar = baz +local bar = baz + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-no-starting.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-no-starting.lua.snap new file mode 100644 index 00000000..d8171f86 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-no-starting.lua.snap @@ -0,0 +1,12 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +local bar = baz +local bar = baz +-- stylua: ignore end +local bar = baz + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-scope-no-ending.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-scope-no-ending.lua.snap new file mode 100644 index 00000000..2d10327e --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-scope-no-ending.lua.snap @@ -0,0 +1,14 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +do + -- stylua: ignore start + local bar = baz + local bar = baz +end +local bar = baz + diff --git a/tests/snapshots/tests__ignores@multiline-block-ignore-scope.lua.snap b/tests/snapshots/tests__ignores@multiline-block-ignore-scope.lua.snap new file mode 100644 index 00000000..71f78809 --- /dev/null +++ b/tests/snapshots/tests__ignores@multiline-block-ignore-scope.lua.snap @@ -0,0 +1,15 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +do + -- stylua: ignore start + local bar = baz + -- stylua: ignore end + local bar = baz +end +local bar = baz + diff --git a/tests/snapshots/tests__ignores@singleline-ignore-1.lua.snap b/tests/snapshots/tests__ignores@singleline-ignore-1.lua.snap new file mode 100644 index 00000000..140f32b3 --- /dev/null +++ b/tests/snapshots/tests__ignores@singleline-ignore-1.lua.snap @@ -0,0 +1,10 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +-- stylua: ignore +local bar = baz + diff --git a/tests/snapshots/tests__ignores@singleline-ignore-2.lua.snap b/tests/snapshots/tests__ignores@singleline-ignore-2.lua.snap new file mode 100644 index 00000000..a9f1aa8f --- /dev/null +++ b/tests/snapshots/tests__ignores@singleline-ignore-2.lua.snap @@ -0,0 +1,11 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = bar +-- stylua: ignore +local bar = baz +local bar = baz + diff --git a/tests/snapshots/tests__ignores@singleline-ignore-last-stmt.lua.snap b/tests/snapshots/tests__ignores@singleline-ignore-last-stmt.lua.snap new file mode 100644 index 00000000..9c1b7896 --- /dev/null +++ b/tests/snapshots/tests__ignores@singleline-ignore-last-stmt.lua.snap @@ -0,0 +1,9 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +-- stylua: ignore +return "hi" + diff --git a/tests/snapshots/tests__ignores@singleline-ignore-stmt-block.lua.snap b/tests/snapshots/tests__ignores@singleline-ignore-stmt-block.lua.snap new file mode 100644 index 00000000..1fbad2b6 --- /dev/null +++ b/tests/snapshots/tests__ignores@singleline-ignore-stmt-block.lua.snap @@ -0,0 +1,12 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local x = 1 +-- stylua: ignore +function foo () + return x + 1 +end + diff --git a/tests/test_ignore.rs b/tests/test_ignore.rs deleted file mode 100644 index f61bbcc7..00000000 --- a/tests/test_ignore.rs +++ /dev/null @@ -1,258 +0,0 @@ -use stylua_lib::{format_code, Config, OutputVerification}; - -fn format(input: &str) -> String { - format_code(input, Config::default(), None, OutputVerification::None).unwrap() -} - -#[test] -fn test_singleline_ignore() { - insta::assert_snapshot!( - format( - r###" -local foo = bar --- stylua: ignore -local bar = baz - "### - ), - @r###" - local foo = bar - -- stylua: ignore - local bar = baz - "### - ); -} - -#[test] -fn test_singleline_ignore_2() { - insta::assert_snapshot!( - format( - r###" -local foo = bar --- stylua: ignore -local bar = baz -local bar = baz - "### - ), - @r###" - local foo = bar - -- stylua: ignore - local bar = baz - local bar = baz - "### - ); -} - -#[test] -fn test_singleline_ignore_last_stmt() { - insta::assert_snapshot!( - format( - r###"-- stylua: ignore -return "hi" - "### - ), - @r###" - -- stylua: ignore - return "hi" - "### - ); -} - -#[test] -fn test_singleline_ignore_stmt_block() { - insta::assert_snapshot!( - r###"local x = 1 --- stylua: ignore -function foo () - return x + 1 -end"###, @r###" - local x = 1 - -- stylua: ignore - function foo () - return x + 1 - end - "### - ) -} - -#[test] -fn test_multiline_block_ignore() { - insta::assert_snapshot!( - format( - r###" -local foo = bar --- stylua: ignore start -local bar = baz --- stylua: ignore end -local bar = baz -"### - ), - @r###" - local foo = bar - -- stylua: ignore start - local bar = baz - -- stylua: ignore end - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_2() { - insta::assert_snapshot!( - format( - r###" -local foo = bar --- stylua: ignore start -local bar = baz -local bar = baz --- stylua: ignore end -local bar = baz -"### - ), - @r###" - local foo = bar - -- stylua: ignore start - local bar = baz - local bar = baz - -- stylua: ignore end - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_no_ending() { - insta::assert_snapshot!( - format( - r###" -local foo = bar --- stylua: ignore start -local bar = baz -local bar = baz -local bar = baz -"### - ), - @r###" - local foo = bar - -- stylua: ignore start - local bar = baz - local bar = baz - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_no_starting() { - insta::assert_snapshot!( - format( - r###" -local foo = bar -local bar = baz -local bar = baz --- stylua: ignore end -local bar = baz -"### - ), - @r###" - local foo = bar - local bar = baz - local bar = baz - -- stylua: ignore end - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_block_scope() { - insta::assert_snapshot!( - format( - r###" -local foo = bar -do - -- stylua: ignore start - local bar = baz - -- stylua: ignore end - local bar = baz -end -local bar = baz -"### - ), - @r###" - local foo = bar - do - -- stylua: ignore start - local bar = baz - -- stylua: ignore end - local bar = baz - end - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_block_scope_no_ending() { - insta::assert_snapshot!( - format( - r###" -local foo = bar -do - -- stylua: ignore start - local bar = baz - local bar = baz -end -local bar = baz -"### - ), - @r###" - local foo = bar - do - -- stylua: ignore start - local bar = baz - local bar = baz - end - local bar = baz - "###); -} - -#[test] -fn test_multiline_block_ignore_multiple_comments_in_leading_trivia() { - insta::assert_snapshot!( - format( - r###"--stylua: ignore start -local a = 1 ---stylua: ignore end - ---stylua: ignore start -local b = 2 ---stylua: ignore end - ---stylua: ignore start -local c = 3 ---stylua: ignore end - --- Some very large comment - ---stylua: ignore start -local d = 4 ---stylua: ignore end -"### - ), - @r###" - --stylua: ignore start - local a = 1 - --stylua: ignore end - - --stylua: ignore start - local b = 2 - --stylua: ignore end - - --stylua: ignore start - local c = 3 - --stylua: ignore end - - -- Some very large comment - - --stylua: ignore start - local d = 4 - --stylua: ignore end - "### - ) -} diff --git a/tests/tests.rs b/tests/tests.rs index 7f2baf96..1d951953 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -48,3 +48,11 @@ fn test_lua52() { insta::assert_snapshot!(format(&contents)); }) } + +#[test] +fn test_ignores() { + insta::glob!("inputs-ignore/*.lua", |path| { + let contents = std::fs::read_to_string(path).unwrap(); + insta::assert_snapshot!(format(&contents)); + }) +} From c324a2ad4eb6c493441cd5ea23bc7ff2d869d1d5 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:15:43 +0100 Subject: [PATCH 2/8] Allow ignore comments before table fields --- CHANGELOG.md | 1 + src/formatters/table.rs | 8 +++++- tests/inputs-ignore/ignore-table-field.lua | 20 ++++++++++++++ ...s__ignores@ignore-table-field.lua.snap.new | 27 +++++++++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 tests/inputs-ignore/ignore-table-field.lua create mode 100644 tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new diff --git a/CHANGELOG.md b/CHANGELOG.md index b1a8a30b..b3d16ecd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - `--output-format=json` now outputs all (error) messages in JSON format ([#453](https://github.com/JohnnyMorganz/StyLua/issues/453)) - Added WASM build support. Stylua is available on npm for consumption in Node.js or a browser (using a bundler) - https://www.npmjs.com/package/@johnnymorganz/stylua +- Ignore comments will now be respected before fields inside tables ([#448](https://github.com/JohnnyMorganz/StyLua/issues/448)) ### Fixed - [**Luau**] Fixed spacing lost before a comment within a type generic ([#446](https://github.com/JohnnyMorganz/StyLua/issues/446)) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index 03e5c2d5..efdb6e9f 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -1,5 +1,5 @@ use crate::{ - context::{create_indent_trivia, create_newline_trivia, Context}, + context::{create_indent_trivia, create_newline_trivia, Context, FormatNode}, fmt_symbol, formatters::{ expression::{format_expression, hang_expression, is_brackets_string}, @@ -110,6 +110,12 @@ fn format_field( table_type: TableType, shape: Shape, ) -> (Field, Vec) { + match ctx.should_format_node(field) { + FormatNode::Skip => return (field.to_owned(), Vec::new()), + FormatNode::NotInRange => todo!("format field block"), + _ => (), + } + let leading_trivia = match table_type { TableType::MultiLine => FormatTriviaType::Append(vec![create_indent_trivia(ctx, shape)]), _ => FormatTriviaType::NoChange, diff --git a/tests/inputs-ignore/ignore-table-field.lua b/tests/inputs-ignore/ignore-table-field.lua new file mode 100644 index 00000000..c1e23b55 --- /dev/null +++ b/tests/inputs-ignore/ignore-table-field.lua @@ -0,0 +1,20 @@ +local foo = { + -- stylua: ignore + x = 2, + y = 3, + z = " he " , +} + +local bar = { + x = 2, + -- stylua: ignore + y = 3, + z = " he " , +} + +local baz = { + x = 2, + y = 3, + -- stylua: ignore + z = " he " , +} diff --git a/tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new b/tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new new file mode 100644 index 00000000..2d0ed420 --- /dev/null +++ b/tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new @@ -0,0 +1,27 @@ +--- +source: tests/tests.rs +assertion_line: 56 +expression: format(&contents) + +--- +local foo = { + -- stylua: ignore + x = 2, + y = 3, + z = " he ", +} + +local bar = { + x = 2, + -- stylua: ignore + y = 3, + z = " he ", +} + +local baz = { + x = 2, + y = 3, + -- stylua: ignore + z = " he " , +} + From 926a95d55b7f37664feb7493fe2d4068282471e1 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:18:19 +0100 Subject: [PATCH 3/8] Simplify readme --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d650d10d..54154001 100644 --- a/README.md +++ b/README.md @@ -108,9 +108,10 @@ AST, flagging any syntax errors or possible code semantics changes. This flag ma where not every file can be examined for spurious formatting. ### Ignoring parts of a file -If there is a specific statement within your file which you wish to skip formatting on, you can precede it with `-- stylua: ignore`, -and it will be skipped over during formatting. This may be useful when there is a specific formatting style you wish to preserve for -a statement. For example: + +To skip formatting a particular part of a file, you can add `-- stylua: ignore` before it. +This may be useful if there is a particular style you want to preseve for readability, e.g.: + ```lua -- stylua: ignore local matrix = { @@ -119,7 +120,9 @@ local matrix = { { 0, 0, 0 }, } ``` -You can also disable formatting over a block of code by using `-- stylua: ignore start` / `-- stylua: ignore end` respectively. + +Formatting can also be skipped over a block of code using `-- stylua: ignore start` and `-- stylua: ignore end`: + ```lua local foo = true -- stylua: ignore start @@ -128,8 +131,8 @@ local baz = 0 -- stylua: ignore end local foobar = false ``` -Note: this comment must be preceding a statement (same as `-- stylua: ignore`), and cannot cross block scope boundaries -(i.e. if formatting is disabled, and we exit a block, formatting is automatically re-enabled). + +Note that ignoring cannot cross scope boundaries - once a block is exited, formatting will be re-enabled. ### Formatting Ranges If you only want to format a specific range within a file, you can pass the `--range-start ` and/or `--range-end ` arguments, From 5555e3a7ea7d15c414744528172e671f5abb9028 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:25:52 +0100 Subject: [PATCH 4/8] Fix test --- ...ld.lua.snap.new => tests__ignores@ignore-table-field.lua.snap} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/snapshots/{tests__ignores@ignore-table-field.lua.snap.new => tests__ignores@ignore-table-field.lua.snap} (100%) diff --git a/tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new b/tests/snapshots/tests__ignores@ignore-table-field.lua.snap similarity index 100% rename from tests/snapshots/tests__ignores@ignore-table-field.lua.snap.new rename to tests/snapshots/tests__ignores@ignore-table-field.lua.snap From 959b2a1bfcefd9fc8d1c3fd5680bd8d3d2827c09 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:48:52 +0100 Subject: [PATCH 5/8] Add support for range formatting in field --- src/formatters/table.rs | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/formatters/table.rs b/src/formatters/table.rs index efdb6e9f..8f1079ad 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -4,6 +4,7 @@ use crate::{ formatters::{ expression::{format_expression, hang_expression, is_brackets_string}, general::{format_contained_span, format_end_token, format_token_reference, EndTokenType}, + stmt::stmt_block::format_expression_block, trivia::{strip_trivia, FormatTriviaType, UpdateLeadingTrivia, UpdateTrailingTrivia}, trivia_util::{self, table_field_trailing_trivia}, }, @@ -104,6 +105,30 @@ fn handle_field_key_equals_comments( (key_leading_comments, equal) } +/// Only formats a field present inside of a block +fn format_field_block(ctx: &Context, field: &Field, shape: Shape) -> Field { + match field { + Field::ExpressionKey { + brackets, + key, + equal, + value, + } => Field::ExpressionKey { + brackets: brackets.to_owned(), + key: format_expression_block(ctx, key, shape), + equal: equal.to_owned(), + value: format_expression_block(ctx, value, shape), + }, + Field::NameKey { key, equal, value } => Field::NameKey { + key: key.to_owned(), + equal: equal.to_owned(), + value: format_expression_block(ctx, value, shape), + }, + Field::NoKey(expression) => Field::NoKey(format_expression_block(ctx, expression, shape)), + other => unreachable!("unknown node {:?}", other), + } +} + fn format_field( ctx: &Context, field: &Field, @@ -112,7 +137,7 @@ fn format_field( ) -> (Field, Vec) { match ctx.should_format_node(field) { FormatNode::Skip => return (field.to_owned(), Vec::new()), - FormatNode::NotInRange => todo!("format field block"), + FormatNode::NotInRange => return (format_field_block(ctx, field, shape), Vec::new()), _ => (), } From b86a9b9e7efafb7579228c7d9e13139a174820b4 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 12:49:01 +0100 Subject: [PATCH 6/8] Simplify range tests Use || to denote ranges instead --- tests/test_ranges.rs | 101 ++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 58 deletions(-) diff --git a/tests/test_ranges.rs b/tests/test_ranges.rs index 1b8b7fa4..3d151810 100644 --- a/tests/test_ranges.rs +++ b/tests/test_ranges.rs @@ -1,10 +1,13 @@ use stylua_lib::{format_code, Config, OutputVerification, Range}; -fn format(input: &str, range: Range) -> String { +fn format(input: &str) -> String { + let start_point = input.find("||"); + let end_point = input.rfind("||"); + format_code( - input, + &input.replace("||", ""), Config::default(), - Some(range), + Some(Range::from_values(start_point, end_point)), OutputVerification::None, ) .unwrap() @@ -14,11 +17,9 @@ fn format(input: &str, range: Range) -> String { fn test_default() { insta::assert_snapshot!( format( - r###" -local foo = bar + r###"||local foo = bar|| local bar = baz "###, - Range::from_values(Some(0), Some(30)) ), @r###" local foo = bar @@ -32,10 +33,9 @@ local bar = baz fn test_ignore_last_stmt() { insta::assert_snapshot!( format( - r###"function foo() + r###"||f||unction foo() return bar -end"###, - Range::from_values(Some(0), Some(1)) +end"### ), @r###" function foo() @@ -48,17 +48,16 @@ end"###, fn test_dont_modify_eof() { insta::assert_snapshot!( format( - r###" -local foo = bar + r###"||local foo = bar|| local bar = baz - "###, - Range::from_values(Some(0), Some(30)) + "### ), @r###" + local foo = bar local bar = baz @@ -73,8 +72,7 @@ local bar = baz fn test_incomplete_range() { insta::assert_snapshot!( format( - r###"local fooo = bar"###, - Range::from_values(Some(0), Some(5)) + r###"||local|| fooo = bar"### ), @r###" @@ -87,8 +85,7 @@ fn test_incomplete_range() { fn test_large_example() { insta::assert_snapshot!( format( - r###" -if string.sub(msg, 1, 8) == "setgrav/" then + r###"||if string.sub(msg, 1, 8) == "setgrav/" then danumber = nil for i = 9, 100 do if string.sub(msg, i, i) == "/" then danumber = i break end end if danumber == nil then return end local player = findplayer(string.sub(msg, 9, danumber - 1), speaker) if player == 0 then return end for i = 1, #player do if player[i].Character ~= nil then @@ -101,7 +98,7 @@ bf.Parent = torso end local c2 = player[i].Character:GetChildren() for i = 1, #c2 do if c2[i].className == "Part" then torso.BF.force = torso.BF.force + Vector3.new(0, c2[i]:getMass() * -string.sub(msg, danumber + 1), 0) -end end end end end end +end end end end end end|| if string.sub(msg, 1, 5) == "trip/" then local player = findplayer(string.sub(msg, 6), speaker) if player ~= 0 then for i = 1, #player do @@ -109,10 +106,10 @@ if player[i].Character ~= nil then local torso = player[i].Character:FindFirstChild("Torso") if torso ~= nil then torso.CFrame = CFrame.new(torso.Position.x, torso.Position.y, torso.Position.z, 0, 0, 1, 0, -1, 0, 1, 0, 0) --math.random(),math.random(),math.random(),math.random(),math.random(),math.random(),math.random(),math.random(),math.random()) -- i like the people being upside down better. end end end end end - "###, - Range::from_values(Some(0), Some(847)) + "### ), @r###" + if string.sub(msg, 1, 8) == "setgrav/" then danumber = nil for i = 9, 100 do @@ -168,10 +165,9 @@ fn test_nested_range() { insta::assert_snapshot!( format( r###"local my_function = function() - local nested_statement = "foobar" + ||local nested_statement = "foobar"|| end -"###, - Range::from_values(Some(33), Some(76)) +"### ), @r###" @@ -187,11 +183,10 @@ fn test_nested_range_local_function() { format( r###"local function test() call "hello" - call { x = y} - local z = 1 + 3 - (2 / 3) + ||call { x = y} + local z = 1 + 3 - (2 / 3)|| end -"###, - Range::from_values(Some(33), Some(116)) +"### ), @r###" local function test() @@ -207,10 +202,9 @@ fn test_nested_range_while() { insta::assert_snapshot!( format( r###"while true do - local z = 2 + ||local z = 2|| end -"###, - Range::from_values(Some(21), Some(47)) +"### ), @r###" while true do @@ -223,11 +217,10 @@ fn test_nested_range_while() { fn test_nested_range_repeat() { insta::assert_snapshot!( format( - r###"repeat - local z = 2 + r###"repeat|| + local z = 2|| until true -"###, - Range::from_values(Some(6), Some(32)) +"### ), @r###" repeat @@ -241,10 +234,9 @@ fn test_nested_range_do() { insta::assert_snapshot!( format( r###"do - local z = 2 + ||local z = 2|| end -"###, - Range::from_values(Some(2), Some(32)) +"### ), @r###" do @@ -258,10 +250,9 @@ fn test_nested_range_generic_for() { insta::assert_snapshot!( format( r###"for i, v in pairs(x) do - local z = 2 + ||local z = 2|| end -"###, - Range::from_values(Some(30), Some(56)) +"### ), @r###" for i, v in pairs(x) do @@ -277,10 +268,9 @@ fn test_nested_range_else_if() { r###"if x and y then local p = q elseif c - d > 2 then - local z = 2 + ||local z = 2|| end -"###, - Range::from_values(Some(69), Some(95)) +"### ), @r###" if x and y then @@ -296,10 +286,9 @@ fn test_nested_range_function_call() { insta::assert_snapshot!( format( r###"call (function () - local z = 5 + ||local z = 5|| end) -"###, - Range::from_values(Some(22), Some(58)) +"### ), @r###" call (function () @@ -313,10 +302,9 @@ fn test_nested_range_function_call_table() { insta::assert_snapshot!( format( r###"call { x = function() - local z = 2 + ||local z = 2|| end} -"###, - Range::from_values(Some(28), Some(61)) +"### ), @r###" call { x = function() @@ -331,11 +319,10 @@ fn test_nested_range_table_1() { format( r###"local z = { function() - local z = 5 + ||local z = 5|| end } -"###, - Range::from_values(Some(50), Some(121)) +"### ), @r###" local z = { @@ -352,12 +339,11 @@ fn test_nested_range_table_2() { format( r###"local z = { [(function() - return random_func () + ||return random_func ()|| end)()] = true } -"###, - Range::from_values(Some(41), Some(121)) +"### ), @r###" local z = { @@ -374,10 +360,9 @@ fn test_nested_range_binop() { insta::assert_snapshot!( format( r###"local z =( 1 + (function() - local p = q + ||local p = q|| end)()) -"###, - Range::from_values(Some(40), Some(75)) +"### ), @r###" local z =( 1 + (function() From ac0a6fc3d947ae605da217ea7724baa2d48d2444 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 13:02:39 +0100 Subject: [PATCH 7/8] Fix format_field not in range --- src/context.rs | 17 ++++------------- src/formatters/table.rs | 29 ++--------------------------- 2 files changed, 6 insertions(+), 40 deletions(-) diff --git a/src/context.rs b/src/context.rs index 8605072d..248ed181 100644 --- a/src/context.rs +++ b/src/context.rs @@ -106,12 +106,10 @@ impl Context { } if let Some(range) = self.range { - let mut in_range = true; - if let Some(start_bound) = range.start { if let Some(node_start) = node.start_position() { if node_start.bytes() < start_bound { - in_range = false; + return FormatNode::NotInRange; } } } @@ -119,20 +117,13 @@ impl Context { if let Some(end_bound) = range.end { if let Some(node_end) = node.end_position() { if node_end.bytes() > end_bound { - in_range = false; + return FormatNode::NotInRange; } } } - - if in_range { - FormatNode::Normal - } else { - FormatNode::NotInRange - } - } else { - // No range provided, therefore always in formatting range - FormatNode::Normal } + + FormatNode::Normal } pub fn should_omit_string_parens(&self) -> bool { diff --git a/src/formatters/table.rs b/src/formatters/table.rs index 8f1079ad..ed43f31e 100644 --- a/src/formatters/table.rs +++ b/src/formatters/table.rs @@ -4,7 +4,6 @@ use crate::{ formatters::{ expression::{format_expression, hang_expression, is_brackets_string}, general::{format_contained_span, format_end_token, format_token_reference, EndTokenType}, - stmt::stmt_block::format_expression_block, trivia::{strip_trivia, FormatTriviaType, UpdateLeadingTrivia, UpdateTrailingTrivia}, trivia_util::{self, table_field_trailing_trivia}, }, @@ -105,39 +104,15 @@ fn handle_field_key_equals_comments( (key_leading_comments, equal) } -/// Only formats a field present inside of a block -fn format_field_block(ctx: &Context, field: &Field, shape: Shape) -> Field { - match field { - Field::ExpressionKey { - brackets, - key, - equal, - value, - } => Field::ExpressionKey { - brackets: brackets.to_owned(), - key: format_expression_block(ctx, key, shape), - equal: equal.to_owned(), - value: format_expression_block(ctx, value, shape), - }, - Field::NameKey { key, equal, value } => Field::NameKey { - key: key.to_owned(), - equal: equal.to_owned(), - value: format_expression_block(ctx, value, shape), - }, - Field::NoKey(expression) => Field::NoKey(format_expression_block(ctx, expression, shape)), - other => unreachable!("unknown node {:?}", other), - } -} - fn format_field( ctx: &Context, field: &Field, table_type: TableType, shape: Shape, ) -> (Field, Vec) { - match ctx.should_format_node(field) { + match dbg!(ctx.should_format_node(field)) { FormatNode::Skip => return (field.to_owned(), Vec::new()), - FormatNode::NotInRange => return (format_field_block(ctx, field, shape), Vec::new()), + FormatNode::NotInRange => unreachable!("called format_field on a field not in range"), _ => (), } From 9cfde0e569dd8218ef0ddadc27d2a44f3d66b107 Mon Sep 17 00:00:00 2001 From: JohnnyMorganz Date: Sat, 25 Jun 2022 13:12:07 +0100 Subject: [PATCH 8/8] Add no range start and end tests --- src/context.rs | 20 +++++++++----------- tests/test_ranges.rs | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/src/context.rs b/src/context.rs index 248ed181..6e73ee4a 100644 --- a/src/context.rs +++ b/src/context.rs @@ -106,20 +106,18 @@ impl Context { } if let Some(range) = self.range { - if let Some(start_bound) = range.start { - if let Some(node_start) = node.start_position() { - if node_start.bytes() < start_bound { - return FormatNode::NotInRange; - } + match (range.start, node.start_position()) { + (Some(start_bound), Some(node_start)) if node_start.bytes() < start_bound => { + return FormatNode::NotInRange } - } + _ => (), + }; - if let Some(end_bound) = range.end { - if let Some(node_end) = node.end_position() { - if node_end.bytes() > end_bound { - return FormatNode::NotInRange; - } + match (range.end, node.end_position()) { + (Some(end_bound), Some(node_end)) if node_end.bytes() > end_bound => { + return FormatNode::NotInRange } + _ => (), } } diff --git a/tests/test_ranges.rs b/tests/test_ranges.rs index 3d151810..d3812b6f 100644 --- a/tests/test_ranges.rs +++ b/tests/test_ranges.rs @@ -1,5 +1,15 @@ use stylua_lib::{format_code, Config, OutputVerification, Range}; +fn format_range(input: &str, range: Range) -> String { + format_code( + input, + Config::default(), + Some(range), + OutputVerification::None, + ) + .unwrap() +} + fn format(input: &str) -> String { let start_point = input.find("||"); let end_point = input.rfind("||"); @@ -370,3 +380,34 @@ fn test_nested_range_binop() { end)()) "###); } + +#[test] +fn test_no_range_start() { + insta::assert_snapshot!( + format_range( + r###"local z = 2 +local e = 5 +"###, + Range::from_values(None, Some(20)) + ), + @r###" + local z = 2 + local e = 5 + "###); +} + +#[test] +fn test_no_range_end() { + insta::assert_snapshot!( + format_range( + r###"local z = 2 +local e = 5 +"###, + Range::from_values(Some(20), None) + ), + @r###" + + local z = 2 + local e = 5 + "###); +}