diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ae047347e008c..dfda88dfb4aa5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -419,6 +419,13 @@ Summary 159.43 ± 2.48 times faster than 'pycodestyle crates/ruff/resources/test/cpython' ``` +To benchmark a subset of rules, e.g. `LineTooLong` and `DocLineTooLong`: + +```shell +cargo build --release && hyperfine --warmup 10 \ + "./target/release/ruff ./crates/ruff/resources/test/cpython/ --no-cache -e --select W505,E501" +``` + You can run `poetry install` from `./scripts/benchmarks` to create a working environment for the above. All reported benchmarks were computed using the versions specified by `./scripts/benchmarks/pyproject.toml` on Python 3.11. diff --git a/crates/ruff/src/rules/pycodestyle/helpers.rs b/crates/ruff/src/rules/pycodestyle/helpers.rs index f99524e74312a..c3976a81853a7 100644 --- a/crates/ruff/src/rules/pycodestyle/helpers.rs +++ b/crates/ruff/src/rules/pycodestyle/helpers.rs @@ -53,16 +53,8 @@ pub(super) fn is_overlong( task_tags: &[String], tab_size: TabSize, ) -> Option { - let mut start_offset = line.start(); let mut width = LineWidth::new(tab_size); - - for c in line.chars() { - if width < limit { - start_offset += c.text_len(); - } - width = width.add_char(c); - } - + width = width.add_str(line.as_str()); if width <= limit { return None; } @@ -91,6 +83,17 @@ pub(super) fn is_overlong( } } + // Obtain the start offset of the part of te line that exceeds the limit + let mut start_offset = line.start(); + let mut start_width = LineWidth::new(tab_size); + for c in line.chars() { + if start_width < limit { + start_offset += c.text_len(); + start_width = start_width.add_char(c); + } else { + break; + } + } Some(Overlong { range: TextRange::new(start_offset, line.end()), width: width.get(),