diff --git a/crates/core/src/binding.rs b/crates/core/src/binding.rs index f0f7d2d66..13e83f48d 100644 --- a/crates/core/src/binding.rs +++ b/crates/core/src/binding.rs @@ -137,12 +137,22 @@ pub(crate) fn adjust_padding<'a>( }; let mut result = String::new(); let snippet = &src[range.start as usize..range.end as usize]; - let mut lines = snippet.split('\n'); + let mut lines = snippet.split('\n').peekable(); // assumes codebase uses spaces for indentation let delta: isize = (new_padding as isize) - (pad_strip_amount as isize); let padding = " ".repeat(pad_strip_amount); let new_padding = " ".repeat(new_padding); let mut index = offset; + if src[newline_index.unwrap_or_default()..range.start as usize] + .trim() + .is_empty() + && lines.peek().is_some() + { + result.push('\n'); + result.push_str(&new_padding); + adjust_ranges(substitutions, index, new_padding.len() as isize + 1); + } + result.push_str(lines.next().unwrap_or_default()); index += result.len(); for line in lines { diff --git a/crates/core/src/test.rs b/crates/core/src/test.rs index b962029ca..d4a4e3767 100644 --- a/crates/core/src/test.rs +++ b/crates/core/src/test.rs @@ -13608,3 +13608,34 @@ remove_unused_imports()"# }) .unwrap(); } + +#[test] +fn preserves_python_blocks() { + run_test_expected({ + TestArgExpected { + pattern: r#" + |engine marzano(0.1) + |language python + | + |`def $method($args): $body` => `def $method($args): $body` + |"# + .trim_margin() + .unwrap(), + source: r#" + |def foo(args): + | print("bar") + | print("thing") + |"# + .trim_margin() + .unwrap(), + expected: r#" + |def foo(args): + | print("bar") + | print("thing") + |"# + .trim_margin() + .unwrap(), + } + }) + .unwrap(); +} diff --git a/vendor/tree-sitter-facade b/vendor/tree-sitter-facade index a26c147ce..89e307176 160000 --- a/vendor/tree-sitter-facade +++ b/vendor/tree-sitter-facade @@ -1 +1 @@ -Subproject commit a26c147cea7049a5d2c42006499371b346b52648 +Subproject commit 89e307176a1e99504a2516ee6fdc066826aa7bfd