mirror of
https://github.com/ast-grep/ast-grep.git
synced 2026-05-06 06:06:46 -04:00
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:
@@ -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);
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user