Skip to content

Commit 33806b8

Browse files
Fixed panic in missing_copyright_notice (#7029)
1 parent afcd00d commit 33806b8

File tree

4 files changed

+76
-7
lines changed

4 files changed

+76
-7
lines changed

crates/ruff/src/rules/flake8_copyright/mod.rs

+11
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ import os
149149
# Content Content Content Content Content Content Content Content Content Content
150150
151151
# Copyright 2023
152+
"#
153+
.trim(),
154+
&settings::Settings::for_rules(vec![Rule::MissingCopyrightNotice]),
155+
);
156+
assert_messages!(diagnostics);
157+
}
158+
159+
#[test]
160+
fn char_boundary() {
161+
let diagnostics = test_snippet(
162+
r#"কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক
152163
"#
153164
.trim(),
154165
&settings::Settings::for_rules(vec![Rule::MissingCopyrightNotice]),

crates/ruff/src/rules/flake8_copyright/rules/missing_copyright_notice.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use ruff_text_size::{TextRange, TextSize};
2-
31
use ruff_diagnostics::{Diagnostic, Violation};
42
use ruff_macros::{derive_message_formats, violation};
53
use ruff_source_file::Locator;
4+
use ruff_text_size::{TextRange, TextSize};
65

76
use crate::settings::Settings;
87

@@ -33,11 +32,7 @@ pub(crate) fn missing_copyright_notice(
3332
}
3433

3534
// Only search the first 1024 bytes in the file.
36-
let contents = if locator.len() < 1024 {
37-
locator.contents()
38-
} else {
39-
locator.up_to(TextSize::from(1024))
40-
};
35+
let contents = locator.up_to(locator.floor_char_boundary(TextSize::new(1024)));
4136

4237
// Locate the copyright notice.
4338
if let Some(match_) = settings.flake8_copyright.notice_rgx.find(contents) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
---
2+
source: crates/ruff/src/rules/flake8_copyright/mod.rs
3+
---
4+
<filename>:1:1: CPY001 Missing copyright notice at top of file
5+
|
6+
1 | কককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককককক
7+
| CPY001
8+
|
9+
10+

crates/ruff_source_file/src/locator.rs

+53
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,59 @@ impl<'a> Locator<'a> {
388388
&self.contents[usize::from(offset)..]
389389
}
390390

391+
/// Finds the closest [`TextSize`] not exceeding the offset for which `is_char_boundary` is
392+
/// `true`.
393+
///
394+
/// Can be replaced with `str#floor_char_boundary` once it's stable.
395+
///
396+
/// ## Examples
397+
///
398+
/// ```
399+
/// # use ruff_text_size::{Ranged, TextRange, TextSize};
400+
/// # use ruff_source_file::Locator;
401+
///
402+
/// let locator = Locator::new("Hello");
403+
///
404+
/// assert_eq!(
405+
/// locator.floor_char_boundary(TextSize::from(0)),
406+
/// TextSize::from(0)
407+
/// );
408+
///
409+
/// assert_eq!(
410+
/// locator.floor_char_boundary(TextSize::from(5)),
411+
/// TextSize::from(5)
412+
/// );
413+
///
414+
/// let locator = Locator::new("α");
415+
///
416+
/// assert_eq!(
417+
/// locator.floor_char_boundary(TextSize::from(0)),
418+
/// TextSize::from(0)
419+
/// );
420+
///
421+
/// assert_eq!(
422+
/// locator.floor_char_boundary(TextSize::from(1)),
423+
/// TextSize::from(0)
424+
/// );
425+
///
426+
/// assert_eq!(
427+
/// locator.floor_char_boundary(TextSize::from(2)),
428+
/// TextSize::from(2)
429+
/// );
430+
/// ```
431+
pub fn floor_char_boundary(&self, offset: TextSize) -> TextSize {
432+
if offset >= self.text_len() {
433+
self.text_len()
434+
} else {
435+
// We know that the character boundary is within four bytes.
436+
(0u32..=3u32)
437+
.map(TextSize::from)
438+
.filter_map(|index| offset.checked_sub(index))
439+
.find(|offset| self.contents.is_char_boundary(offset.to_usize()))
440+
.unwrap_or_default()
441+
}
442+
}
443+
391444
/// Take the source code between the given [`TextRange`].
392445
#[inline]
393446
pub fn slice<T: Ranged>(&self, ranged: T) -> &'a str {

0 commit comments

Comments
 (0)