Skip to content

Commit 1d4c263

Browse files
authored
Fix Haml pre-processing crash when there is no \n at the end of the file (#18155)
This PR fixes a Haml pre-processing issue where a crash occurs if there is no trailing `\n` at the end of the file and the code before it was considered Ruby code. This happens in situations where Ruby code was used. E.g.: ``` - index = 0 - index += 1 ``` In this situation when we see the `-` on the second line, then we will find the whole indented block and parse it as Ruby code instead. The block ands at the last `\n`, but since we reach the end of the file, there is no `\n`. Right now we incorrectly reset the internal cursor to the last known `\n` position. This means that the `start` of the Ruby block will be _after_ the `end` of the Ruby block and the Haml parser will crash. To solve this, once we reach the end of the file, we don't reset the cursor to the wrong position. Fixes: #17379 (comment) ## Test plan 1. Added a regression test that did fail before the fix, and doesn't anymore
1 parent 5131237 commit 1d4c263

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515
- Support Leptos `class:` attributes when extracting classes ([#18093](https://github.com/tailwindlabs/tailwindcss/pull/18093))
1616
- Fix "Cannot read properties of undefined" crash on malformed arbitrary value ([#18133](https://github.com/tailwindlabs/tailwindcss/pull/18133))
1717
- Upgrade: Migrate `-mt-[0px]` to `mt-[0px]` instead of the other way around ([#18154](https://github.com/tailwindlabs/tailwindcss/pull/18154))
18+
- Fix Haml pre-processing crash when there is no `\n` at the end of the file ([#18155](https://github.com/tailwindlabs/tailwindcss/pull/18155))
1819

1920
## [4.1.7] - 2025-05-15
2021

crates/oxide/src/extractor/pre_processors/haml.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,11 @@ impl Haml {
330330
cursor.advance();
331331
}
332332

333+
// We didn't find a newline, we reached the end of the input
334+
if last_known_newline_position == last_newline_position {
335+
return cursor.pos;
336+
}
337+
333338
// Move the cursor to the last newline position
334339
cursor.move_to(last_newline_position);
335340

@@ -446,4 +451,16 @@ mod tests {
446451
"#;
447452
Haml::test_extract_contains(input, vec!["flex", "items-center"]);
448453
}
454+
455+
// https://github.com/tailwindlabs/tailwindcss/issues/17379#issuecomment-2910108646
456+
#[test]
457+
fn test_crash_missing_newline() {
458+
// The empty `""` will introduce a newline
459+
let good = ["- index = 0", "- index += 1", ""].join("\n");
460+
Haml::test_extract_contains(&good, vec!["index"]);
461+
462+
// This used to crash before the fix
463+
let bad = ["- index = 0", "- index += 1"].join("\n");
464+
Haml::test_extract_contains(&bad, vec!["index"]);
465+
}
449466
}

0 commit comments

Comments
 (0)