mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-03 07:04:53 +00:00

The Ruff autoformatter is going to be based on an intermediate representation (IR) formatted via [Wadler's algorithm](https://homepages.inf.ed.ac.uk/wadler/papers/prettier/prettier.pdf). This is architecturally similar to [Rome](https://github.com/rome/tools), Prettier, [Skip](https://github.com/skiplang/skip/blob/master/src/tools/printer/printer.sk), and others. This PR adds a fork of the `rome_formatter` crate from [Rome](https://github.com/rome/tools), renamed here to `ruff_formatter`, which provides generic definitions for a formatter IR as well as a generic IR printer. (We've also pulled in `rome_rowan`, `rome_text_size`, and `rome_text_edit`, though some of these will be removed in future PRs.) Why fork? `rome_formatter` contains code that's specific to Rome's AST representation (e.g., it relies on a fork of rust-analyzer's `rowan`), and we'll likely want to support different abstractions and formatting capabilities (there are already a few changes coming in future PRs). Once we've dropped `ruff_rowan` and trimmed down `ruff_formatter` to the code we currently need, it's also not a huge surface area to maintain and update.
79 lines
2.2 KiB
Rust
79 lines
2.2 KiB
Rust
use {
|
|
ruff_text_size::{TextRange, TextSize},
|
|
std::ops,
|
|
};
|
|
|
|
fn size(x: u32) -> TextSize {
|
|
TextSize::from(x)
|
|
}
|
|
|
|
fn range(x: ops::Range<u32>) -> TextRange {
|
|
TextRange::new(x.start.into(), x.end.into())
|
|
}
|
|
|
|
#[test]
|
|
fn sum() {
|
|
let xs: Vec<TextSize> = vec![size(0), size(1), size(2)];
|
|
assert_eq!(xs.iter().sum::<TextSize>(), size(3));
|
|
assert_eq!(xs.into_iter().sum::<TextSize>(), size(3));
|
|
}
|
|
|
|
#[test]
|
|
fn math() {
|
|
assert_eq!(size(10) + size(5), size(15));
|
|
assert_eq!(size(10) - size(5), size(5));
|
|
}
|
|
|
|
#[test]
|
|
fn checked_math() {
|
|
assert_eq!(size(1).checked_add(size(1)), Some(size(2)));
|
|
assert_eq!(size(1).checked_sub(size(1)), Some(size(0)));
|
|
assert_eq!(size(1).checked_sub(size(2)), None);
|
|
assert_eq!(size(!0).checked_add(size(1)), None);
|
|
}
|
|
|
|
#[test]
|
|
#[rustfmt::skip]
|
|
fn contains() {
|
|
assert!( range(2..4).contains_range(range(2..3)));
|
|
assert!( ! range(2..4).contains_range(range(1..3)));
|
|
}
|
|
|
|
#[test]
|
|
fn intersect() {
|
|
assert_eq!(range(1..2).intersect(range(2..3)), Some(range(2..2)));
|
|
assert_eq!(range(1..5).intersect(range(2..3)), Some(range(2..3)));
|
|
assert_eq!(range(1..2).intersect(range(3..4)), None);
|
|
}
|
|
|
|
#[test]
|
|
fn cover() {
|
|
assert_eq!(range(1..2).cover(range(2..3)), range(1..3));
|
|
assert_eq!(range(1..5).cover(range(2..3)), range(1..5));
|
|
assert_eq!(range(1..2).cover(range(4..5)), range(1..5));
|
|
}
|
|
|
|
#[test]
|
|
fn cover_offset() {
|
|
assert_eq!(range(1..3).cover_offset(size(0)), range(0..3));
|
|
assert_eq!(range(1..3).cover_offset(size(1)), range(1..3));
|
|
assert_eq!(range(1..3).cover_offset(size(2)), range(1..3));
|
|
assert_eq!(range(1..3).cover_offset(size(3)), range(1..3));
|
|
assert_eq!(range(1..3).cover_offset(size(4)), range(1..4));
|
|
}
|
|
|
|
#[test]
|
|
#[rustfmt::skip]
|
|
fn contains_point() {
|
|
assert!( ! range(1..3).contains(size(0)));
|
|
assert!( range(1..3).contains(size(1)));
|
|
assert!( range(1..3).contains(size(2)));
|
|
assert!( ! range(1..3).contains(size(3)));
|
|
assert!( ! range(1..3).contains(size(4)));
|
|
|
|
assert!( ! range(1..3).contains_inclusive(size(0)));
|
|
assert!( range(1..3).contains_inclusive(size(1)));
|
|
assert!( range(1..3).contains_inclusive(size(2)));
|
|
assert!( range(1..3).contains_inclusive(size(3)));
|
|
assert!( ! range(1..3).contains_inclusive(size(4)));
|
|
}
|