diff --git a/crates/oxc_jsdoc/src/parser/jsdoc.rs b/crates/oxc_jsdoc/src/parser/jsdoc.rs index 4f3c98ad63553..b7e7a70b8ed7d 100644 --- a/crates/oxc_jsdoc/src/parser/jsdoc.rs +++ b/crates/oxc_jsdoc/src/parser/jsdoc.rs @@ -63,4 +63,21 @@ mod test { assert_eq!(tags[2].kind.parsed(), "param"); assert_eq!(tags[3].kind.parsed(), "example"); } + + #[test] + fn parses_tags_after_math_interval_notation() { + let source = "\ + * Random float in [min, max). + * @param {number} min - Minimum float value. + * @param {number} max - Maximum float value. + * @returns {number} Random float in [min, max). + "; + #[expect(clippy::cast_possible_truncation)] + let jsdoc = super::JSDoc::new(source, Span::new(0, source.len() as u32)); + let tags = jsdoc.tags(); + assert_eq!(tags.len(), 3); + assert_eq!(tags[0].kind.parsed(), "param"); + assert_eq!(tags[1].kind.parsed(), "param"); + assert_eq!(tags[2].kind.parsed(), "returns"); + } } diff --git a/crates/oxc_jsdoc/src/parser/parse.rs b/crates/oxc_jsdoc/src/parser/parse.rs index 0838c6d959938..3b45d0c56f33e 100644 --- a/crates/oxc_jsdoc/src/parser/parse.rs +++ b/crates/oxc_jsdoc/src/parser/parse.rs @@ -101,6 +101,11 @@ pub fn parse_jsdoc( '\n' => { in_double_quotes = false; in_single_quotes = false; + // Parentheses and square-bracket syntaxes are line-oriented in JSDoc. + // Reset them on each new line so prose such as `[min, max)` does not + // block parsing subsequent `@tag` lines. + brace_depth = 0; + square_brace_depth = 0; } '{' => curly_brace_depth += 1, '}' => curly_brace_depth = curly_brace_depth.saturating_sub(1), diff --git a/crates/oxc_linter/src/rules/jsdoc/require_param.rs b/crates/oxc_linter/src/rules/jsdoc/require_param.rs index 6cb976a4f8e8a..dfeec1a29b9d9 100644 --- a/crates/oxc_linter/src/rules/jsdoc/require_param.rs +++ b/crates/oxc_linter/src/rules/jsdoc/require_param.rs @@ -350,6 +350,21 @@ fn test() { None, None, ), + ( + " + /** + * Random float in [min, max). + * @param {number} min - Minimum float value. + * @param {number} max - Maximum float value. + * @returns {number} Random float in [min, max). + */ + function randomRange(min, max) { + return min + Math.random() * (max - min); + } + ", + None, + None, + ), (" /** diff --git a/crates/oxc_linter/src/rules/jsdoc/require_returns.rs b/crates/oxc_linter/src/rules/jsdoc/require_returns.rs index 54662ed942f82..d0e3fdb51852a 100644 --- a/crates/oxc_linter/src/rules/jsdoc/require_returns.rs +++ b/crates/oxc_linter/src/rules/jsdoc/require_returns.rs @@ -333,6 +333,21 @@ fn test() { None, None, ), + ( + " + /** + * Random float in [min, max). + * @param {number} min - Minimum float value. + * @param {number} max - Maximum float value. + * @returns {number} Random float in [min, max). + */ + function randomRange(min, max) { + return min + Math.random() * (max - min); + } + ", + None, + None, + ), ( " /**