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 <lawrence3699@users.noreply.github.com>
Co-authored-by: Herrington Darkholme <2883231+HerringtonDarkholme@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
chaoliang yan
2026-04-23 12:35:43 +10:00
committed by GitHub
parent a8a0718c8d
commit 0c567ed955
2 changed files with 37 additions and 9 deletions
+5 -9
View File
@@ -285,16 +285,12 @@ impl<L: LSPLang> Backend<L> {
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);
+32
View File
@@ -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: <div style=$STYLE>$$$CHILDREN</div>
"#;
let mut client = create_lsp_framed(yamls).await;
let file_uri = "file:///Users/codes/ast-grep-vscode/test.html";
let file_content =
"<script lang=typescript>// ast-grep-ignore: no-alert\nconsole.log('Hello, world!')</script>\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"