From 4734b0601b9f8bf7232f9bc97fdb31117ebcb4d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kat=20March=C3=A1n?= Date: Thu, 19 Dec 2024 12:54:42 -0800 Subject: [PATCH] feat(compliance): update to latest 2.0 spec (#103) --- src/lib.rs | 2 +- src/v2_parser.rs | 2 +- tests/test_cases/expected_kdl/esc_multiple_newlines.kdl | 1 + tests/test_cases/expected_kdl/escline_after_semicolon.kdl | 2 ++ tests/test_cases/expected_kdl/escline_alone.kdl | 1 + tests/test_cases/expected_kdl/escline_empty_line.kdl | 1 + tests/test_cases/expected_kdl/escline_end_of_node.kdl | 2 ++ tests/test_cases/expected_kdl/escline_in_child_block.kdl | 4 ++++ tests/test_cases/expected_kdl/escline_node_type.kdl | 1 + tests/test_cases/expected_kdl/escline_slashdash.kdl | 1 + .../expected_kdl/multiline_string_double_backslash.kdl | 1 + .../expected_kdl/multiline_string_escape_delimiter.kdl | 1 + .../expected_kdl/multiline_string_escape_newline_at_end.kdl | 1 + tests/test_cases/input/esc_multiple_newlines.kdl | 4 ++++ tests/test_cases/input/escline_after_semicolon.kdl | 2 ++ tests/test_cases/input/escline_alone.kdl | 1 + tests/test_cases/input/escline_empty_line.kdl | 3 +++ tests/test_cases/input/escline_end_of_node.kdl | 3 +++ tests/test_cases/input/escline_in_child_block.kdl | 5 +++++ tests/test_cases/input/escline_node.kdl | 1 + tests/test_cases/input/escline_node_type.kdl | 2 ++ tests/test_cases/input/escline_slashdash.kdl | 4 ++++ tests/test_cases/input/multiline_string_double_backslash.kdl | 4 ++++ tests/test_cases/input/multiline_string_escape_delimiter.kdl | 3 +++ .../input/multiline_string_escape_newline_at_end.kdl | 4 ++++ .../input/multiline_string_escape_newline_at_end_fail.kdl | 4 ++++ .../input/multiline_string_non_literal_prefix_fail.kdl | 4 ++++ 27 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 tests/test_cases/expected_kdl/esc_multiple_newlines.kdl create mode 100644 tests/test_cases/expected_kdl/escline_after_semicolon.kdl create mode 100644 tests/test_cases/expected_kdl/escline_alone.kdl create mode 100644 tests/test_cases/expected_kdl/escline_empty_line.kdl create mode 100644 tests/test_cases/expected_kdl/escline_end_of_node.kdl create mode 100644 tests/test_cases/expected_kdl/escline_in_child_block.kdl create mode 100644 tests/test_cases/expected_kdl/escline_node_type.kdl create mode 100644 tests/test_cases/expected_kdl/escline_slashdash.kdl create mode 100644 tests/test_cases/expected_kdl/multiline_string_double_backslash.kdl create mode 100644 tests/test_cases/expected_kdl/multiline_string_escape_delimiter.kdl create mode 100644 tests/test_cases/expected_kdl/multiline_string_escape_newline_at_end.kdl create mode 100644 tests/test_cases/input/esc_multiple_newlines.kdl create mode 100644 tests/test_cases/input/escline_after_semicolon.kdl create mode 100644 tests/test_cases/input/escline_alone.kdl create mode 100644 tests/test_cases/input/escline_empty_line.kdl create mode 100644 tests/test_cases/input/escline_end_of_node.kdl create mode 100644 tests/test_cases/input/escline_in_child_block.kdl create mode 100644 tests/test_cases/input/escline_node_type.kdl create mode 100644 tests/test_cases/input/escline_slashdash.kdl create mode 100644 tests/test_cases/input/multiline_string_double_backslash.kdl create mode 100644 tests/test_cases/input/multiline_string_escape_delimiter.kdl create mode 100644 tests/test_cases/input/multiline_string_escape_newline_at_end.kdl create mode 100644 tests/test_cases/input/multiline_string_escape_newline_at_end_fail.kdl create mode 100644 tests/test_cases/input/multiline_string_non_literal_prefix_fail.kdl diff --git a/src/lib.rs b/src/lib.rs index af026a1..fbad7fb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,7 @@ //! `kdl` is a "document-oriented" parser and API for the [KDL Document //! Language](https://kdl.dev), a node-based, human-friendly configuration and //! serialization format. -//! +//! //! Unlike serde-based implementations, this crate preserves formatting when //! editing, as well as when inserting or changing values with custom //! formatting. This is most useful when working with human-maintained KDL diff --git a/src/v2_parser.rs b/src/v2_parser.rs index 01f35ef..6f3a347 100644 --- a/src/v2_parser.rs +++ b/src/v2_parser.rs @@ -866,7 +866,7 @@ fn badval_ty_char(input: &mut Input<'_>) -> PResult<()> { /// `line-space := newline | ws | single-line-comment` fn line_space(input: &mut Input<'_>) -> PResult<()> { - alt((newline, ws, single_line_comment)).parse_next(input) + alt((node_space, newline, single_line_comment)).parse_next(input) } /// `node-space := ws* escline ws* | ws+` diff --git a/tests/test_cases/expected_kdl/esc_multiple_newlines.kdl b/tests/test_cases/expected_kdl/esc_multiple_newlines.kdl new file mode 100644 index 0000000..032ed17 --- /dev/null +++ b/tests/test_cases/expected_kdl/esc_multiple_newlines.kdl @@ -0,0 +1 @@ +node "12" diff --git a/tests/test_cases/expected_kdl/escline_after_semicolon.kdl b/tests/test_cases/expected_kdl/escline_after_semicolon.kdl new file mode 100644 index 0000000..3e545b1 --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_after_semicolon.kdl @@ -0,0 +1,2 @@ +node +node diff --git a/tests/test_cases/expected_kdl/escline_alone.kdl b/tests/test_cases/expected_kdl/escline_alone.kdl new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_alone.kdl @@ -0,0 +1 @@ + diff --git a/tests/test_cases/expected_kdl/escline_empty_line.kdl b/tests/test_cases/expected_kdl/escline_empty_line.kdl new file mode 100644 index 0000000..64f5a0a --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_empty_line.kdl @@ -0,0 +1 @@ +node diff --git a/tests/test_cases/expected_kdl/escline_end_of_node.kdl b/tests/test_cases/expected_kdl/escline_end_of_node.kdl new file mode 100644 index 0000000..422c2b7 --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_end_of_node.kdl @@ -0,0 +1,2 @@ +a +b diff --git a/tests/test_cases/expected_kdl/escline_in_child_block.kdl b/tests/test_cases/expected_kdl/escline_in_child_block.kdl new file mode 100644 index 0000000..9b05e30 --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_in_child_block.kdl @@ -0,0 +1,4 @@ +parent { + child + child +} diff --git a/tests/test_cases/expected_kdl/escline_node_type.kdl b/tests/test_cases/expected_kdl/escline_node_type.kdl new file mode 100644 index 0000000..c790643 --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_node_type.kdl @@ -0,0 +1 @@ +(type)node diff --git a/tests/test_cases/expected_kdl/escline_slashdash.kdl b/tests/test_cases/expected_kdl/escline_slashdash.kdl new file mode 100644 index 0000000..64f5a0a --- /dev/null +++ b/tests/test_cases/expected_kdl/escline_slashdash.kdl @@ -0,0 +1 @@ +node diff --git a/tests/test_cases/expected_kdl/multiline_string_double_backslash.kdl b/tests/test_cases/expected_kdl/multiline_string_double_backslash.kdl new file mode 100644 index 0000000..38ad0e5 --- /dev/null +++ b/tests/test_cases/expected_kdl/multiline_string_double_backslash.kdl @@ -0,0 +1 @@ +node "a\\ b\na\\b" diff --git a/tests/test_cases/expected_kdl/multiline_string_escape_delimiter.kdl b/tests/test_cases/expected_kdl/multiline_string_escape_delimiter.kdl new file mode 100644 index 0000000..025d655 --- /dev/null +++ b/tests/test_cases/expected_kdl/multiline_string_escape_delimiter.kdl @@ -0,0 +1 @@ +node "\"\"\"" diff --git a/tests/test_cases/expected_kdl/multiline_string_escape_newline_at_end.kdl b/tests/test_cases/expected_kdl/multiline_string_escape_newline_at_end.kdl new file mode 100644 index 0000000..56fe48f --- /dev/null +++ b/tests/test_cases/expected_kdl/multiline_string_escape_newline_at_end.kdl @@ -0,0 +1 @@ +node " a" diff --git a/tests/test_cases/input/esc_multiple_newlines.kdl b/tests/test_cases/input/esc_multiple_newlines.kdl new file mode 100644 index 0000000..f3d91c4 --- /dev/null +++ b/tests/test_cases/input/esc_multiple_newlines.kdl @@ -0,0 +1,4 @@ +node "1\ + + +2" diff --git a/tests/test_cases/input/escline_after_semicolon.kdl b/tests/test_cases/input/escline_after_semicolon.kdl new file mode 100644 index 0000000..59a4ab8 --- /dev/null +++ b/tests/test_cases/input/escline_after_semicolon.kdl @@ -0,0 +1,2 @@ +node; \ +node diff --git a/tests/test_cases/input/escline_alone.kdl b/tests/test_cases/input/escline_alone.kdl new file mode 100644 index 0000000..57ddad2 --- /dev/null +++ b/tests/test_cases/input/escline_alone.kdl @@ -0,0 +1 @@ +\ diff --git a/tests/test_cases/input/escline_empty_line.kdl b/tests/test_cases/input/escline_empty_line.kdl new file mode 100644 index 0000000..1777a83 --- /dev/null +++ b/tests/test_cases/input/escline_empty_line.kdl @@ -0,0 +1,3 @@ +\ + +node diff --git a/tests/test_cases/input/escline_end_of_node.kdl b/tests/test_cases/input/escline_end_of_node.kdl new file mode 100644 index 0000000..87dd42b --- /dev/null +++ b/tests/test_cases/input/escline_end_of_node.kdl @@ -0,0 +1,3 @@ +a \ + +b diff --git a/tests/test_cases/input/escline_in_child_block.kdl b/tests/test_cases/input/escline_in_child_block.kdl new file mode 100644 index 0000000..dfbe682 --- /dev/null +++ b/tests/test_cases/input/escline_in_child_block.kdl @@ -0,0 +1,5 @@ +parent { + child + \ // comment + child +} diff --git a/tests/test_cases/input/escline_node.kdl b/tests/test_cases/input/escline_node.kdl index 1c5b5f3..215f634 100644 --- a/tests/test_cases/input/escline_node.kdl +++ b/tests/test_cases/input/escline_node.kdl @@ -1,2 +1,3 @@ node1 +\ node2 diff --git a/tests/test_cases/input/escline_node_type.kdl b/tests/test_cases/input/escline_node_type.kdl new file mode 100644 index 0000000..fb22096 --- /dev/null +++ b/tests/test_cases/input/escline_node_type.kdl @@ -0,0 +1,2 @@ +\ +(type)node diff --git a/tests/test_cases/input/escline_slashdash.kdl b/tests/test_cases/input/escline_slashdash.kdl new file mode 100644 index 0000000..8cb0956 --- /dev/null +++ b/tests/test_cases/input/escline_slashdash.kdl @@ -0,0 +1,4 @@ +node +\ +/- +node diff --git a/tests/test_cases/input/multiline_string_double_backslash.kdl b/tests/test_cases/input/multiline_string_double_backslash.kdl new file mode 100644 index 0000000..7289aa9 --- /dev/null +++ b/tests/test_cases/input/multiline_string_double_backslash.kdl @@ -0,0 +1,4 @@ +node """ +a\\ b +a\\\ b +""" diff --git a/tests/test_cases/input/multiline_string_escape_delimiter.kdl b/tests/test_cases/input/multiline_string_escape_delimiter.kdl new file mode 100644 index 0000000..d873e8c --- /dev/null +++ b/tests/test_cases/input/multiline_string_escape_delimiter.kdl @@ -0,0 +1,3 @@ +node """ +\""" +""" diff --git a/tests/test_cases/input/multiline_string_escape_newline_at_end.kdl b/tests/test_cases/input/multiline_string_escape_newline_at_end.kdl new file mode 100644 index 0000000..045bf6c --- /dev/null +++ b/tests/test_cases/input/multiline_string_escape_newline_at_end.kdl @@ -0,0 +1,4 @@ +node """ + a + \ +""" diff --git a/tests/test_cases/input/multiline_string_escape_newline_at_end_fail.kdl b/tests/test_cases/input/multiline_string_escape_newline_at_end_fail.kdl new file mode 100644 index 0000000..692c8c2 --- /dev/null +++ b/tests/test_cases/input/multiline_string_escape_newline_at_end_fail.kdl @@ -0,0 +1,4 @@ +node """ +a + \ +""" diff --git a/tests/test_cases/input/multiline_string_non_literal_prefix_fail.kdl b/tests/test_cases/input/multiline_string_non_literal_prefix_fail.kdl new file mode 100644 index 0000000..bb7f188 --- /dev/null +++ b/tests/test_cases/input/multiline_string_non_literal_prefix_fail.kdl @@ -0,0 +1,4 @@ +node """ +\s escaped prefix + literal prefix + """