Skip to content

Commit 2e79d01

Browse files
committed
fix(semantic): panic when brackets are unmatched (#12001)
fixes #11992
1 parent d6563f8 commit 2e79d01

File tree

2 files changed

+31
-5
lines changed

2 files changed

+31
-5
lines changed

crates/oxc_semantic/src/jsdoc/parser/jsdoc.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ impl<'a> JSDoc<'a> {
3838
mod test {
3939
use oxc_allocator::Allocator;
4040
use oxc_parser::Parser;
41-
use oxc_span::SourceType;
41+
use oxc_span::{SourceType, Span};
4242

43-
use crate::{Semantic, SemanticBuilder};
43+
use crate::{Semantic, SemanticBuilder, jsdoc::parser::jsdoc_parts::JSDocCommentPart};
4444

4545
fn build_semantic<'a>(allocator: &'a Allocator, source_text: &'a str) -> Semantic<'a> {
4646
let source_type = SourceType::default();
@@ -323,4 +323,25 @@ line2
323323
let tag = tags.next().unwrap();
324324
assert_eq!(tag.kind.parsed(), "example");
325325
}
326+
327+
#[test]
328+
fn parses_issue_11992() {
329+
let allocator = Allocator::default();
330+
let semantic = build_semantic(
331+
&allocator,
332+
"/**@property [
333+
*/",
334+
);
335+
let jsdoc = semantic.jsdoc().iter_all().next().unwrap();
336+
337+
let mut tags = jsdoc.tags().iter();
338+
assert_eq!(tags.len(), 1);
339+
340+
let tag = tags.next().unwrap();
341+
assert_eq!(
342+
tag.type_name_comment(),
343+
(None, None, JSDocCommentPart::new(" [\n", Span::new(12, 15)))
344+
);
345+
assert_eq!(tag.kind.parsed(), "property");
346+
}
326347
}

crates/oxc_semantic/src/jsdoc/parser/utils.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ pub fn find_type_name_range(s: &str) -> Option<(usize, usize)> {
6161

6262
// Everything is a token
6363
if let Some(start) = start {
64-
return Some((start, s.len()));
64+
if bracket == 0 {
65+
return Some((start, s.len()));
66+
}
6567
}
6668

6769
None
@@ -133,10 +135,13 @@ t9b: number;
133135
("n.n8", Some("n.n8")),
134136
("n[].n9", Some("n[].n9")),
135137
(r#"[ n10 = ["{}", "[]"] ]"#, Some(r#"[ n10 = ["{}", "[]"] ]"#)),
136-
("[n11... c11", Some("[n11... c11")),
137-
("[n12[]\nc12", Some("[n12[]\nc12")),
138+
("[n11... c11]", Some("[n11... c11]")),
139+
("[n12[]\nc12]", Some("[n12[]\nc12]")),
138140
("n12.n12", Some("n12.n12")),
139141
("n13[].n13", Some("n13[].n13")),
142+
// if square brackets are unmatched, `None`
143+
("[n12[]\nc12", None),
144+
("[n12\nc12", None),
140145
] {
141146
assert_eq!(find_type_name_range(actual).map(|(s, e)| &actual[s..e]), expect);
142147
}

0 commit comments

Comments
 (0)