mirror of
https://github.com/astral-sh/ruff.git
synced 2025-09-27 20:42:10 +00:00
Removing trailing whitespace inside multiline strings is unsafe (#9744)
Fix #8037.
This commit is contained in:
parent
7992583908
commit
6e225cb57c
7 changed files with 89 additions and 2 deletions
46
crates/ruff_python_index/src/multiline_ranges.rs
Normal file
46
crates/ruff_python_index/src/multiline_ranges.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
use ruff_python_parser::Tok;
|
||||
use ruff_text_size::TextRange;
|
||||
|
||||
/// Stores the range of all multiline strings in a file sorted by
|
||||
/// [`TextRange::start`].
|
||||
pub struct MultilineRanges {
|
||||
ranges: Vec<TextRange>,
|
||||
}
|
||||
|
||||
impl MultilineRanges {
|
||||
/// Returns `true` if the given range is inside a multiline string.
|
||||
pub fn intersects(&self, target: TextRange) -> bool {
|
||||
self.ranges
|
||||
.binary_search_by(|range| {
|
||||
if range.contains_range(target) {
|
||||
std::cmp::Ordering::Equal
|
||||
} else if range.end() < target.start() {
|
||||
std::cmp::Ordering::Less
|
||||
} else {
|
||||
std::cmp::Ordering::Greater
|
||||
}
|
||||
})
|
||||
.is_ok()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub(crate) struct MultilineRangesBuilder {
|
||||
ranges: Vec<TextRange>,
|
||||
}
|
||||
|
||||
impl MultilineRangesBuilder {
|
||||
pub(crate) fn visit_token(&mut self, token: &Tok, range: TextRange) {
|
||||
if let Tok::String { triple_quoted, .. } = token {
|
||||
if *triple_quoted {
|
||||
self.ranges.push(range);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn finish(self) -> MultilineRanges {
|
||||
MultilineRanges {
|
||||
ranges: self.ranges,
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue