diff --git a/.changeset/fixanalyzer_suppression_comment_fails_with_inner_comments_in_functions.md b/.changeset/fixanalyzer_suppression_comment_fails_with_inner_comments_in_functions.md new file mode 100644 index 000000000000..ef0c048213ca --- /dev/null +++ b/.changeset/fixanalyzer_suppression_comment_fails_with_inner_comments_in_functions.md @@ -0,0 +1,5 @@ +--- +biome_analyze: patch +--- + +# fix suppression comment fails with inner comments in functions diff --git a/crates/biome_analyze/src/lib.rs b/crates/biome_analyze/src/lib.rs index 7df64cc5a2b1..72f32e202932 100644 --- a/crates/biome_analyze/src/lib.rs +++ b/crates/biome_analyze/src/lib.rs @@ -2,7 +2,6 @@ use biome_console::markup; use biome_parser::AnyParse; -use std::cmp::Ordering; use std::collections::{BTreeMap, BinaryHeap}; use std::fmt::{Debug, Display, Formatter}; use std::ops; @@ -450,22 +449,20 @@ where let index = self.suppressions .line_suppressions - .binary_search_by(|suppression| { - if suppression.text_range.end() < entry.text_range.start() { - Ordering::Less - } else if entry.text_range.end() < suppression.text_range.start() { - Ordering::Greater - } else { - Ordering::Equal - } + .partition_point(|suppression| { + suppression.text_range.end() < entry.text_range.start() }); - index - .ok() - .map(|index| &mut self.suppressions.line_suppressions[index]) + if index >= self.suppressions.line_suppressions.len() { + None + } else { + Some(&mut self.suppressions.line_suppressions[index]) + } } }; + println!("suppression in analyzer yyyyy: {:?}", suppression); + let suppression = suppression.filter(|suppression| { if suppression.suppress_all { return true; diff --git a/crates/biome_js_analyze/src/lib.rs b/crates/biome_js_analyze/src/lib.rs index b342e9c0fd75..84c631a87117 100644 --- a/crates/biome_js_analyze/src/lib.rs +++ b/crates/biome_js_analyze/src/lib.rs @@ -874,6 +874,50 @@ let d; ); } + #[test] + fn suppression_range_should_report_when_contains_inner_comment() { + const SOURCE: &str = " +// biome-ignore lint/complexity/useArrowFunction: single rule +const foo0 = function (bar: string) { + // biome-ignore lint/style/noParameterAssign: single rule + bar = 'baz'; +};"; + + let parsed = parse(SOURCE, JsFileSource::js_module(), JsParserOptions::default()); + + let enabled_rules = vec![ + RuleFilter::Rule("style", "noParameterAssign"), + RuleFilter::Rule("complexity", "useArrowFunction"), + ]; + + let filter = AnalysisFilter { + categories: RuleCategoriesBuilder::default().with_lint().build(), + enabled_rules: Some(enabled_rules.as_slice()), + ..AnalysisFilter::default() + }; + let options = AnalyzerOptions::default(); + analyze( + &parsed.tree(), + filter, + &options, + Vec::new(), + JsFileSource::js_module(), + Default::default(), + |signal| { + if let Some(diag) = signal.diagnostic() { + let error = diag + .with_file_path("dummyFile") + .with_file_source_code(SOURCE); + let text = print_diagnostic_to_string(&error); + eprintln!("{text}"); + panic!("Unexpected diagnostic"); + } + + ControlFlow::::Continue(()) + }, + ); + } + #[test] fn unused_range_suppression() { const SOURCE: &str = "