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..c6eeb0188b0d --- /dev/null +++ b/.changeset/fixanalyzer_suppression_comment_fails_with_inner_comments_in_functions.md @@ -0,0 +1,18 @@ +--- +cli: patch +biome_analyze: patch +--- + +# Suppression comment should not fail with inner comments in functions + +The follwing code: + +```ts +// biome-ignore lint/complexity/useArrowFunction: not work +const foo0 = function (bar: string) { + // biome-ignore lint/style/noParameterAssign: work + bar = "baz"; +}; +``` + +The suppression comment `// biome-ignore lint/style/noParameterAssign: work` will not be invalid. \ No newline at end of file diff --git a/crates/biome_analyze/src/lib.rs b/crates/biome_analyze/src/lib.rs index a3ac9345ea80..21d7831aa0cf 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; @@ -448,19 +447,15 @@ 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]) + } } }; diff --git a/crates/biome_js_analyze/src/lib.rs b/crates/biome_js_analyze/src/lib.rs index b342e9c0fd75..350f341ebf8b 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::ts(), JsParserOptions::default()); + + let enabled_rules = vec![ + RuleFilter::Rule("complexity", "useArrowFunction"), + RuleFilter::Rule("style", "noParameterAssign"), + ]; + + let filter = AnalysisFilter { + enabled_rules: Some(enabled_rules.as_slice()), + ..AnalysisFilter::default() + }; + let options = AnalyzerOptions::default(); + let root = parsed.tree(); + analyze( + &root, + filter, + &options, + Vec::new(), + JsFileSource::ts(), + 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 = "