From f9a64503c82873a73358cd8d910fc5a4b80f3f59 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Fri, 31 May 2024 15:04:36 -0400 Subject: [PATCH] Use char index rather than position for indent slice (#11645) ## Summary A beginner's mistake :) Closes https://github.com/astral-sh/ruff/issues/11641. --- crates/ruff_python_codegen/src/stylist.rs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/crates/ruff_python_codegen/src/stylist.rs b/crates/ruff_python_codegen/src/stylist.rs index 0ceedcb1bc..37115690a1 100644 --- a/crates/ruff_python_codegen/src/stylist.rs +++ b/crates/ruff_python_codegen/src/stylist.rs @@ -106,7 +106,13 @@ fn detect_indention(tokens: &[LexResult], locator: &Locator) -> Indentation { } TokenKind::NonLogicalNewline => { let line = locator.line(range.end()); - let indent_index = line.chars().position(|c| !c.is_whitespace()); + let indent_index = line.char_indices().find_map(|(i, c)| { + if c.is_whitespace() { + None + } else { + Some(i) + } + }); if let Some(indent_index) = indent_index { if indent_index > 0 { let whitespace = &line[..indent_index]; @@ -223,6 +229,20 @@ x = ( &Indentation(" ".to_string()) ); + let contents = r" +x = ( + 1, + 2, + 3, +) +"; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).indentation(), + &Indentation(" ".to_string()) + ); + // formfeed indent, see `detect_indention` comment. let contents = r" class FormFeedIndent: