diff --git a/crates/oxc_semantic/src/jsdoc/parser/jsdoc.rs b/crates/oxc_semantic/src/jsdoc/parser/jsdoc.rs index 17d6818a7bef8..73e5c8aac8d03 100644 --- a/crates/oxc_semantic/src/jsdoc/parser/jsdoc.rs +++ b/crates/oxc_semantic/src/jsdoc/parser/jsdoc.rs @@ -38,9 +38,9 @@ impl<'a> JSDoc<'a> { mod test { use oxc_allocator::Allocator; use oxc_parser::Parser; - use oxc_span::SourceType; + use oxc_span::{SourceType, Span}; - use crate::{Semantic, SemanticBuilder}; + use crate::{Semantic, SemanticBuilder, jsdoc::parser::jsdoc_parts::JSDocCommentPart}; fn build_semantic<'a>(allocator: &'a Allocator, source_text: &'a str) -> Semantic<'a> { let source_type = SourceType::default(); @@ -323,4 +323,25 @@ line2 let tag = tags.next().unwrap(); assert_eq!(tag.kind.parsed(), "example"); } + + #[test] + fn parses_issue_11992() { + let allocator = Allocator::default(); + let semantic = build_semantic( + &allocator, + "/**@property [ +*/", + ); + let jsdoc = semantic.jsdoc().iter_all().next().unwrap(); + + let mut tags = jsdoc.tags().iter(); + assert_eq!(tags.len(), 1); + + let tag = tags.next().unwrap(); + assert_eq!( + tag.type_name_comment(), + (None, None, JSDocCommentPart::new(" [\n", Span::new(12, 15))) + ); + assert_eq!(tag.kind.parsed(), "property"); + } } diff --git a/crates/oxc_semantic/src/jsdoc/parser/utils.rs b/crates/oxc_semantic/src/jsdoc/parser/utils.rs index baa4943c71cac..dbe1bf44e432c 100644 --- a/crates/oxc_semantic/src/jsdoc/parser/utils.rs +++ b/crates/oxc_semantic/src/jsdoc/parser/utils.rs @@ -61,7 +61,9 @@ pub fn find_type_name_range(s: &str) -> Option<(usize, usize)> { // Everything is a token if let Some(start) = start { - return Some((start, s.len())); + if bracket == 0 { + return Some((start, s.len())); + } } None @@ -133,10 +135,13 @@ t9b: number; ("n.n8", Some("n.n8")), ("n[].n9", Some("n[].n9")), (r#"[ n10 = ["{}", "[]"] ]"#, Some(r#"[ n10 = ["{}", "[]"] ]"#)), - ("[n11... c11", Some("[n11... c11")), - ("[n12[]\nc12", Some("[n12[]\nc12")), + ("[n11... c11]", Some("[n11... c11]")), + ("[n12[]\nc12]", Some("[n12[]\nc12]")), ("n12.n12", Some("n12.n12")), ("n13[].n13", Some("n13[].n13")), + // if square brackets are unmatched, `None` + ("[n12[]\nc12", None), + ("[n12\nc12", None), ] { assert_eq!(find_type_name_range(actual).map(|(s, e)| &actual[s..e]), expect); }