diff --git a/crates/ruff_python_codegen/src/stylist.rs b/crates/ruff_python_codegen/src/stylist.rs index 087d82a29abe76..65b0cae16c26bc 100644 --- a/crates/ruff_python_codegen/src/stylist.rs +++ b/crates/ruff_python_codegen/src/stylist.rs @@ -55,6 +55,9 @@ fn detect_quote(tokens: &[LexResult], locator: &Locator) -> Quote { triple_quoted: false, .. } => Some(*range), + // No need to check if it's triple-quoted as f-strings cannot be used + // as docstrings. + Tok::FStringStart => Some(*range), _ => None, }); @@ -248,6 +251,14 @@ x = ( Quote::Single ); + let contents = r#"x = f'1'"#; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).quote(), + Quote::Single + ); + let contents = r#"x = "1""#; let locator = Locator::new(contents); let tokens: Vec<_> = lex(contents, Mode::Module).collect(); @@ -256,6 +267,14 @@ x = ( Quote::Double ); + let contents = r#"x = f"1""#; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).quote(), + Quote::Double + ); + let contents = r#"s = "It's done.""#; let locator = Locator::new(contents); let tokens: Vec<_> = lex(contents, Mode::Module).collect(); @@ -301,6 +320,41 @@ a = "v" Stylist::from_tokens(&tokens, &locator).quote(), Quote::Double ); + + // Detect from f-string appearing after docstring + let contents = r#" +"""Module docstring.""" + +a = f'v' +"#; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).quote(), + Quote::Single + ); + + let contents = r#" +'''Module docstring.''' + +a = f"v" +"#; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).quote(), + Quote::Double + ); + + let contents = r#" +f'''Module docstring.''' +"#; + let locator = Locator::new(contents); + let tokens: Vec<_> = lex(contents, Mode::Module).collect(); + assert_eq!( + Stylist::from_tokens(&tokens, &locator).quote(), + Quote::Single + ); } #[test]