feat(natu): support preceding suppressions
This commit is contained in:
@@ -22,6 +22,8 @@ let
|
|||||||
root = root + "/registry";
|
root = root + "/registry";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# TODO: Split base modules from aggregate modules before moving guest-module composition into modules.nix.
|
||||||
|
# NOLINT(single_use_binding)
|
||||||
guestModules = import ./guests.nix {
|
guestModules = import ./guests.nix {
|
||||||
inherit
|
inherit
|
||||||
inputs
|
inputs
|
||||||
|
|||||||
@@ -77,6 +77,27 @@ fn natu_preserves_suppressed_bindings() -> googletest::Result<()> {
|
|||||||
Ok(())
|
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]
|
#[gtest]
|
||||||
fn natu_reports_select_dependency_order() -> googletest::Result<()> {
|
fn natu_reports_select_dependency_order() -> googletest::Result<()> {
|
||||||
let report = natu::future_sight(vec![SourceFile {
|
let report = natu::future_sight(vec![SourceFile {
|
||||||
|
|||||||
@@ -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 {
|
pub fn is_suppressed(source: &str, range: ast::SourceRange, rule_id: &str) -> bool {
|
||||||
let line = source[range.start..].lines().next().unwrap_or_default();
|
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 {
|
let Some(comment) = line.split_once('#').map(|(_, comment)| comment.trim()) else {
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user