diff --git a/crates/taplo/src/formatter/mod.rs b/crates/taplo/src/formatter/mod.rs index d5565c869..c64e029a4 100644 --- a/crates/taplo/src/formatter/mod.rs +++ b/crates/taplo/src/formatter/mod.rs @@ -804,11 +804,15 @@ fn format_key(node: SyntaxNode, formatted: &mut String, _options: &Options, _con fn format_value(node: SyntaxNode, options: &Options, context: &Context) -> impl FormattedItem { let mut value = String::new(); let mut comment = None; + + let mut scoped_options = options.clone(); + context.update_options(&mut scoped_options, node.text_range()); + for c in node.children_with_tokens() { match c { NodeOrToken::Node(n) => match n.kind() { ARRAY => { - let formatted = format_array(n, options, context); + let formatted = format_array(n, &scoped_options, context); let c = formatted.trailing_comment(); @@ -818,10 +822,10 @@ fn format_value(node: SyntaxNode, options: &Options, context: &Context) -> impl } debug_assert!(value.is_empty()); - formatted.write_to(&mut value, options); + formatted.write_to(&mut value, &scoped_options); } INLINE_TABLE => { - let formatted = format_inline_table(n, options, context); + let formatted = format_inline_table(n, &scoped_options, context); let c = formatted.trailing_comment(); @@ -832,7 +836,7 @@ fn format_value(node: SyntaxNode, options: &Options, context: &Context) -> impl debug_assert!(value.is_empty()); - formatted.write_to(&mut value, options); + formatted.write_to(&mut value, &scoped_options); } _ => unreachable!(), }, diff --git a/crates/taplo/src/tests/formatter.rs b/crates/taplo/src/tests/formatter.rs index ecd27fd26..9c956d6f1 100644 --- a/crates/taplo/src/tests/formatter.rs +++ b/crates/taplo/src/tests/formatter.rs @@ -1,7 +1,6 @@ use difference::Changeset; -use crate::formatter; -use crate::formatter::Options; +use crate::formatter::{self, Options, OptionsIncomplete}; macro_rules! assert_format { ($expected:expr, $actual:expr) => { @@ -1176,3 +1175,31 @@ a = "b" # comment assert_format!(expected, &formatted); } + +#[test] +fn test_entry_rule() { + let src = r#" +[foo] +sort_me = ["3", "2", "1"] +sort_me_not = ["3", "2", "1"] +"#; + + let expected = r#" +[foo] +sort_me = ["1", "2", "3"] +sort_me_not = ["3", "2", "1"] +"#; + + let dom = crate::parser::parse(src).into_dom(); + let scopes = [( + "foo.sort_me", + OptionsIncomplete { + reorder_arrays: Some(true), + ..Default::default() + }, + )]; + let formatted = + crate::formatter::format_with_path_scopes(dom, Options::default(), &[], scopes).unwrap(); + + assert_format!(expected, &formatted); +}