diff --git a/CHANGELOG.md b/CHANGELOG.md index d162f3b..defd5fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,18 @@ Types of changes - Security in case of vulnerabilities. --> +### Fixed + +- Multiline strings are handled as utf-8 correctly, preventing panics + on utf-8 whitespace like: + + ```nix + '' + foo + \u{2002}bar + '' + ``` + ## [0.5.0] - 2022-02-23 ### Changed diff --git a/src/alejandra_engine/src/rules/string.rs b/src/alejandra_engine/src/rules/string.rs index 87d61b1..5b85f6c 100644 --- a/src/alejandra_engine/src/rules/string.rs +++ b/src/alejandra_engine/src/rules/string.rs @@ -73,7 +73,7 @@ pub fn rule( if !line.is_empty() { indentation = usize::min( indentation, - line.len() - line.trim_start().len(), + line.chars().count() - line.trim_start().chars().count(), ); } } @@ -85,8 +85,8 @@ pub fn rule( lines = lines .iter() .map(|line| { - if indentation < line.len() { - line[indentation..line.len()].to_string() + if indentation < line.chars().count() { + line.chars().skip(indentation).collect::() } else { line.to_string() } diff --git a/src/alejandra_engine/tests/cases/string/in b/src/alejandra_engine/tests/cases/string/in index 5d5fc8f..177faca 100644 --- a/src/alejandra_engine/tests/cases/string/in +++ b/src/alejandra_engine/tests/cases/string/in @@ -1,4 +1,8 @@ [ + '' + foo + bar +'' "" ### " diff --git a/src/alejandra_engine/tests/cases/string/out b/src/alejandra_engine/tests/cases/string/out index e1bfe23..670f6f4 100644 --- a/src/alejandra_engine/tests/cases/string/out +++ b/src/alejandra_engine/tests/cases/string/out @@ -1,4 +1,8 @@ [ + '' + foo + bar + '' "" ### "