From 0c567ed955c9240cb05a48ffc39deefa9ab211cc Mon Sep 17 00:00:00 2001 From: chaoliang yan Date: Thu, 23 Apr 2026 12:35:43 +1000 Subject: [PATCH] fix(lsp): report unused suppressions without rules (#2607) * fix(lsp): report unused suppressions without rules * Update crates/lsp/src/lib.rs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: Herrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com> --------- Signed-off-by: Herrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com> Co-authored-by: lawrence3699 Co-authored-by: Herrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- crates/lsp/src/lib.rs | 14 +++++--------- crates/lsp/tests/basic.rs | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/crates/lsp/src/lib.rs b/crates/lsp/src/lib.rs index fac448da..aa03d862 100644 --- a/crates/lsp/src/lib.rs +++ b/crates/lsp/src/lib.rs @@ -285,16 +285,12 @@ impl Backend { let mut fixes = Fixes::new(); let injections = root.get_injections(|lang| L::from_str(lang).ok()); let docs = std::iter::once(root).chain(injections.iter()); - let doc_and_rules = docs.filter_map(|injected| { - let rule_refs = rules.get_rule_from_lang(&path, injected.lang().clone()); - if rule_refs.is_empty() { - None - } else { - Some((injected, rule_refs)) - } - }); // iterate over all main doc and injected docs - for (injected, rule_refs) in doc_and_rules { + for injected in docs { + let rule_refs = rules.get_rule_from_lang(&path, injected.lang().clone()); + if rule_refs.is_empty() && !injected.source().contains("ast-grep-ignore") { + continue; + } let unused_suppression_rule = CombinedScan::unused_config(Severity::Hint, injected.lang().clone()); let mut scan = CombinedScan::new(rule_refs); diff --git a/crates/lsp/tests/basic.rs b/crates/lsp/tests/basic.rs index ea435e17..b914dc6b 100644 --- a/crates/lsp/tests/basic.rs +++ b/crates/lsp/tests/basic.rs @@ -507,6 +507,38 @@ fix: |- ); } +#[tokio::test] +async fn test_unused_suppression_in_injected_language_without_rules() { + let yamls = r#" +id: no-inline-style +language: Html +message: Avoid inline style +rule: + pattern:
$$$CHILDREN
+"#; + let mut client = create_lsp_framed(yamls).await; + + let file_uri = "file:///Users/codes/ast-grep-vscode/test.html"; + let file_content = + "\n"; + send_did_open_framed(&mut client, file_uri, "html", file_content).await; + + let diagnostics = wait_for_diagnostics(&mut client) + .await + .expect("No diagnostics received"); + let diagnostics = diagnostics + .as_array() + .expect("Diagnostics should be an array") + .to_owned(); + + assert_eq!( + diagnostics.len(), + 1, + "Expected 1 unused-suppression diagnostic from injected script" + ); + assert_eq!(diagnostics[0]["code"], "unused-suppression"); +} + #[tokio::test] async fn test_overlap_line_code_edit() { let yamls = r"