Compare commits

...

1 Commits

Author SHA1 Message Date
14c9a418b6 feat(natu): support preceding suppressions 2026-09-30 11:03:32 -04:00
3 changed files with 35 additions and 0 deletions

View File

@@ -22,6 +22,8 @@ let
root = root + "/registry";
};
# TODO: Refactor guest-module composition.
# NOLINT(single_use_binding)
guestModules = import ./guests.nix {
inherit
inputs

View File

@@ -77,6 +77,27 @@ fn natu_preserves_suppressed_bindings() -> googletest::Result<()> {
Ok(())
}
#[gtest]
fn natu_preserves_preceding_suppressed_binding() -> googletest::Result<()> {
let report = natu::future_sight(vec![SourceFile {
path: PathBuf::from("testdata/preceding_nolint.nix"),
source: r#"
let
# NOLINT(single_use_binding)
value = {
nested = true;
};
in
value
"#
.into(),
}])
.or_fail()?;
expect_that!(report.is_clean(), is_true());
Ok(())
}
#[gtest]
fn natu_reports_select_dependency_order() -> googletest::Result<()> {
let report = natu::future_sight(vec![SourceFile {

View File

@@ -127,6 +127,18 @@ pub fn run_rules(file: &ast::ParsedFile, graph: &ScopeGraph, source: &str) -> Ve
pub fn is_suppressed(source: &str, range: ast::SourceRange, rule_id: &str) -> bool {
let line = source[range.start..].lines().next().unwrap_or_default();
line_suppresses(line, rule_id) || preceding_line_suppresses(source, range, rule_id)
}
fn preceding_line_suppresses(source: &str, range: ast::SourceRange, rule_id: &str) -> bool {
let Some((preceding_source, _current_line)) = source[..range.start].rsplit_once('\n') else {
return false;
};
let preceding_line = preceding_source.lines().next_back().unwrap_or_default();
line_suppresses(preceding_line, rule_id)
}
fn line_suppresses(line: &str, rule_id: &str) -> bool {
let Some(comment) = line.split_once('#').map(|(_, comment)| comment.trim()) else {
return false;
};