diff --git a/crates/ruff_python_formatter/src/lib.rs b/crates/ruff_python_formatter/src/lib.rs index dcbf68acc9..75de5ac303 100644 --- a/crates/ruff_python_formatter/src/lib.rs +++ b/crates/ruff_python_formatter/src/lib.rs @@ -3,12 +3,15 @@ use ruff_text_size::TextRange; use rustpython_parser::ast::Mod; use rustpython_parser::lexer::lex; use rustpython_parser::{parse_tokens, Mode}; +use std::borrow::Cow; use ruff_formatter::format_element::tag::VerbatimKind; use ruff_formatter::formatter::Formatter; -use ruff_formatter::prelude::{source_position, source_text_slice, ContainsNewlines, Tag}; +use ruff_formatter::prelude::{ + dynamic_text, source_position, source_text_slice, ContainsNewlines, Tag, +}; use ruff_formatter::{ - format, write, Buffer, Format, FormatContext, FormatElement, FormatResult, Formatted, + format, normalize_newlines, write, Buffer, Format, FormatElement, FormatResult, Formatted, IndentStyle, Printed, SimpleFormatOptions, SourceCode, }; use ruff_python_ast::node::AstNode; @@ -145,14 +148,29 @@ pub(crate) const fn verbatim_text(range: TextRange) -> VerbatimText { VerbatimText(range) } -impl Format for VerbatimText { - fn fmt(&self, f: &mut Formatter) -> FormatResult<()> { +impl Format> for VerbatimText { + fn fmt(&self, f: &mut PyFormatter) -> FormatResult<()> { f.write_element(FormatElement::Tag(Tag::StartVerbatim( VerbatimKind::Verbatim { length: self.0.len(), }, )))?; - write!(f, [source_text_slice(self.0, ContainsNewlines::Detect)])?; + + match normalize_newlines(f.context().locator().slice(self.0), ['\r']) { + Cow::Borrowed(_) => { + write!(f, [source_text_slice(self.0, ContainsNewlines::Detect)])?; + } + Cow::Owned(cleaned) => { + write!( + f, + [ + dynamic_text(&cleaned, Some(self.0.start())), + source_position(self.0.end()) + ] + )?; + } + } + f.write_element(FormatElement::Tag(Tag::EndVerbatim))?; Ok(()) }