Skip to content

Commit f1e5b20

Browse files
committed
fix(parse/html): handle unclosed elements more gracefully
1 parent de27f6f commit f1e5b20

File tree

5 files changed

+57
-32
lines changed

5 files changed

+57
-32
lines changed

crates/biome_html_factory/src/generated/node_factory.rs

+28-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/biome_html_formatter/src/html/auxiliary/element.rs

+19-12
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ impl FormatNodeRule<HtmlElement> for FormatHtmlElement {
2828
closing_element,
2929
} = node.as_fields();
3030

31-
let closing_element = closing_element?;
3231
let opening_element = opening_element?;
3332
let tag_name = opening_element.name()?;
3433
let tag_name = tag_name
@@ -62,9 +61,13 @@ impl FormatNodeRule<HtmlElement> for FormatHtmlElement {
6261
.last_token()
6362
.is_some_and(|tok| tok.has_trailing_whitespace())
6463
|| closing_element
65-
.l_angle_token()
66-
.ok()
67-
.is_some_and(|tok| tok.has_leading_whitespace_or_newline());
64+
.as_ref()
65+
.map(|e| {
66+
e.l_angle_token()
67+
.ok()
68+
.is_some_and(|tok| tok.has_leading_whitespace_or_newline())
69+
})
70+
.unwrap_or_default();
6871

6972
// "Borrowing" in this context refers to tokens in nodes that would normally be
7073
// formatted by that node's formatter, but are instead formatted by a sibling
@@ -98,7 +101,7 @@ impl FormatNodeRule<HtmlElement> for FormatHtmlElement {
98101
None
99102
};
100103
let borrowed_closing_tag = if should_borrow_closing_tag {
101-
Some(closing_element.clone())
104+
closing_element.clone()
102105
} else {
103106
None
104107
};
@@ -147,13 +150,17 @@ impl FormatNodeRule<HtmlElement> for FormatHtmlElement {
147150
}
148151
}
149152
}
150-
FormatNodeRule::fmt(
151-
&FormatHtmlClosingElement::default().with_options(FormatHtmlClosingElementOptions {
152-
tag_borrowed: should_borrow_closing_tag,
153-
}),
154-
&closing_element,
155-
f,
156-
)?;
153+
if let Some(closing_element) = closing_element {
154+
FormatNodeRule::fmt(
155+
&FormatHtmlClosingElement::default().with_options(
156+
FormatHtmlClosingElementOptions {
157+
tag_borrowed: should_borrow_closing_tag,
158+
},
159+
),
160+
&closing_element,
161+
f,
162+
)?;
163+
}
157164

158165
Ok(())
159166
}

crates/biome_html_syntax/src/generated/nodes.rs

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/biome_html_syntax/src/generated/nodes_mut.rs

+5-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

xtask/codegen/html.ungram

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ HtmlSelfClosingElement =
8484
HtmlElement =
8585
opening_element: HtmlOpeningElement
8686
children: HtmlElementList
87-
closing_element: HtmlClosingElement
87+
closing_element: HtmlClosingElement?
8888

8989

9090
// <a href="">

0 commit comments

Comments
 (0)