Skip to content

Commit

Permalink
fix(html/parser): Fix spans (#4877)
Browse files Browse the repository at this point in the history
  • Loading branch information
alexander-akait committed Jun 7, 2022
1 parent bdc3797 commit 70760d2
Show file tree
Hide file tree
Showing 3,031 changed files with 5,766 additions and 10,887 deletions.
The diff you're trying to view is too large. We only load the first 3000 changed files.
137 changes: 77 additions & 60 deletions crates/swc_html_parser/src/parser/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use active_formatting_element_stack::*;
use doctypes::*;
use node::*;
use open_elements_stack::*;
use swc_common::Span;
use swc_common::{Span, DUMMY_SP};
use swc_html_ast::*;

use self::input::{Buffer, ParserInput};
Expand Down Expand Up @@ -387,26 +387,32 @@ where
attributes.extend(additional_attributes)
}

// Elements and text after `</html>` are moving into `<body>`
let end_html = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => element.span.hi(),
};
let end_children = match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => span.hi(),
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
};
let end = if end_html >= end_children {
end_html
let span = if element.span.is_dummy() {
element.span
} else {
end_children
// Elements and text after `</html>` are moving into `<body>`
let end_html = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => element.span.hi(),
};
let end_children = match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => span.hi(),
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
};
let end = if end_html >= end_children {
end_html
} else {
end_children
};

Span::new(element.span.lo(), end, Default::default())
};

Child::Element(Element {
span: Span::new(element.span.lo(), end, Default::default()),
span,
children: new_children,
content: None,
attributes,
Expand All @@ -421,26 +427,32 @@ where
attributes.extend(additional_attributes);
}

// Elements and text after `</body>` are moving into `<body>`
let end_body = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => element.span.hi(),
};
let end_children = match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => span.hi(),
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
};
let end = if end_body >= end_children {
end_body
let span = if element.span.is_dummy() {
element.span
} else {
end_children
// Elements and text after `</body>` are moving into `<body>`
let end_body = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => element.span.hi(),
};
let end_children = match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => span.hi(),
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
};
let end = if end_body >= end_children {
end_body
} else {
end_children
};

Span::new(element.span.lo(), end, Default::default())
};

Child::Element(Element {
span: Span::new(element.span.lo(), end, Default::default()),
span,
children: new_children,
content: None,
attributes,
Expand Down Expand Up @@ -472,19 +484,27 @@ where
})
}
_ => {
let end = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => span.hi(),
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
},
let span = if element.span.is_dummy() {
element.span
} else {
let end = match node.end_tag_span.take() {
Some(end_tag_span) => end_tag_span.hi(),
_ => match new_children.last() {
Some(Child::DocumentType(DocumentType { span, .. })) => {
span.hi()
}
Some(Child::Element(Element { span, .. })) => span.hi(),
Some(Child::Comment(Comment { span, .. })) => span.hi(),
Some(Child::Text(Text { span, .. })) => span.hi(),
_ => element.span.hi(),
},
};

Span::new(element.span.lo(), end, Default::default())
};

Child::Element(Element {
span: Span::new(element.span.lo(), end, Default::default()),
span,
children: new_children,
content: None,
attributes,
Expand Down Expand Up @@ -1313,7 +1333,7 @@ where
}

let document_type = Node::new(Data::DocumentType(DocumentType {
span: span!(self, token_and_info.span.lo()),
span: token_and_info.span,
name: name.clone(),
public_id: public_id.clone(),
system_id: system_id.clone(),
Expand Down Expand Up @@ -1454,7 +1474,7 @@ where
..
} if tag_name == "html" => {
let element = Node::new(Data::Element(Element {
span: span!(self, token_and_info.span.lo()),
span: token_and_info.span,
namespace: Namespace::HTML,
tag_name: tag_name.into(),
attributes: attributes
Expand Down Expand Up @@ -7171,11 +7191,7 @@ where
};
let new_element = self.create_element_for_token(
token_and_info.token.clone(),
Span::new(
token_and_info.span.lo(),
token_and_info.span.hi(),
Default::default(),
),
token_and_info.span,
Some(Namespace::HTML),
None,
);
Expand Down Expand Up @@ -7399,7 +7415,7 @@ where

fn create_fake_html_element(&self) -> RcNode {
Node::new(Data::Element(Element {
span: Default::default(),
span: DUMMY_SP,
tag_name: "html".into(),
namespace: Namespace::HTML,
attributes: vec![],
Expand All @@ -7413,7 +7429,7 @@ where
TokenAndInfo {
span: match span {
Some(span) => span,
_ => Default::default(),
_ => DUMMY_SP,
},
acknowledged: false,
token: Token::StartTag {
Expand Down Expand Up @@ -8161,7 +8177,7 @@ where
let index = children.len() - 1;

children[index] = Node::new(Data::Text(Text {
span: swc_common::Span::new(first_pos, last_pos, Default::default()),
span: Span::new(first_pos, last_pos, Default::default()),
value: new_value.into(),
}));

Expand Down Expand Up @@ -8193,11 +8209,7 @@ where
let last_pos = token_and_info.span.hi();

children[i - 1] = Node::new(Data::Text(Text {
span: swc_common::Span::new(
first_pos,
last_pos,
Default::default(),
),
span: Span::new(first_pos, last_pos, Default::default()),
value: new_value.into(),
}));

Expand Down Expand Up @@ -8245,10 +8257,9 @@ where
// Create an element for the token in the given namespace, with the
// intended parent being the element in which the adjusted insertion
// location finds itself.
let last_pos = self.input.last_pos()?;
let node = self.create_element_for_token(
token_and_info.token.clone(),
Span::new(token_and_info.span.lo(), last_pos, Default::default()),
token_and_info.span,
Some(namespace),
adjust_attributes,
);
Expand Down Expand Up @@ -8333,6 +8344,12 @@ where

fn update_end_tag_span(&self, node: Option<&RcNode>, token_and_info: &TokenAndInfo) {
if let Some(node) = node {
let span = get_span!(node);

if span.is_dummy() {
return;
}

let mut end_tag_span = node.end_tag_span.borrow_mut();

*end_tag_span = Some(token_and_info.span);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_html_parser/tests/fixture/document/output.json
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 348,
"end": 0,
"ctxt": 0
},
"tagName": "tbody",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 416,
"end": 0,
"ctxt": 0
},
"tagName": "tbody",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 37,
"end": 0,
"ctxt": 0
},
"tagName": "html",
Expand All @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 25,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand All @@ -46,7 +46,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 37,
"end": 0,
"ctxt": 0
},
"tagName": "body",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,6 @@

x Element

x Child

x Element

x Child
,-[$DIR/tests/fixture/element/isindex/input.html:1:1]
1 | <!doctype html><isindex>x</isindex>x
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
"type": "Element",
"span": {
"start": 0,
"end": 30,
"end": 0,
"ctxt": 0
},
"tagName": "head",
Expand Down

1 comment on commit 70760d2

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Benchmark suite Current: 70760d2 Previous: da09c1c Ratio
es/full/minify/libraries/antd 2318126886 ns/iter (± 64561632) 1971494540 ns/iter (± 72407620) 1.18
es/full/minify/libraries/d3 612575583 ns/iter (± 6676879) 492714049 ns/iter (± 19054818) 1.24
es/full/minify/libraries/echarts 2812728108 ns/iter (± 14014573) 2409592864 ns/iter (± 9079780) 1.17
es/full/minify/libraries/jquery 127971555 ns/iter (± 2299685) 107431678 ns/iter (± 1240776) 1.19
es/full/minify/libraries/lodash 182397170 ns/iter (± 1079093) 156651500 ns/iter (± 1267917) 1.16
es/full/minify/libraries/moment 74949184 ns/iter (± 953699) 62989406 ns/iter (± 368904) 1.19
es/full/minify/libraries/react 23662882 ns/iter (± 296121) 20230288 ns/iter (± 102584) 1.17
es/full/minify/libraries/terser 639356654 ns/iter (± 6352177) 527938164 ns/iter (± 6421600) 1.21
es/full/minify/libraries/three 809309998 ns/iter (± 8615855) 652769111 ns/iter (± 14693819) 1.24
es/full/minify/libraries/typescript 5358488490 ns/iter (± 40959647) 4594097404 ns/iter (± 25075839) 1.17
es/full/minify/libraries/victory 1085000586 ns/iter (± 31483961) 876134477 ns/iter (± 7580526) 1.24
es/full/minify/libraries/vue 203792523 ns/iter (± 3080517) 161616824 ns/iter (± 1762288) 1.26
es/full/codegen/es3 39982 ns/iter (± 341) 34400 ns/iter (± 170) 1.16
es/full/codegen/es5 39459 ns/iter (± 539) 34347 ns/iter (± 162) 1.15
es/full/codegen/es2015 39777 ns/iter (± 463) 34392 ns/iter (± 166) 1.16
es/full/codegen/es2016 39711 ns/iter (± 694) 34372 ns/iter (± 148) 1.16
es/full/codegen/es2017 39505 ns/iter (± 508) 34320 ns/iter (± 155) 1.15
es/full/codegen/es2018 39843 ns/iter (± 393) 34330 ns/iter (± 134) 1.16
es/full/codegen/es2019 39999 ns/iter (± 293) 34343 ns/iter (± 153) 1.16
es/full/codegen/es2020 39892 ns/iter (± 768) 34339 ns/iter (± 154) 1.16
es/full/all/es3 224847120 ns/iter (± 7311109) 192743328 ns/iter (± 756187) 1.17
es/full/all/es5 212966918 ns/iter (± 8601787) 182783437 ns/iter (± 669555) 1.17
es/full/all/es2015 171861073 ns/iter (± 6769295) 145214169 ns/iter (± 709279) 1.18
es/full/all/es2016 166551624 ns/iter (± 6498915) 144216544 ns/iter (± 796442) 1.15
es/full/all/es2017 166879646 ns/iter (± 5383244) 144480003 ns/iter (± 683550) 1.16
es/full/all/es2018 163635404 ns/iter (± 6796421) 142220423 ns/iter (± 771651) 1.15
es/full/all/es2019 163413008 ns/iter (± 6759129) 141403895 ns/iter (± 725082) 1.16
es/full/all/es2020 156375089 ns/iter (± 3065195) 136592703 ns/iter (± 665244) 1.14
es/full/parser 674517 ns/iter (± 202753) 591439 ns/iter (± 59727) 1.14
es/full/base/fixer 32159 ns/iter (± 466) 28741 ns/iter (± 202) 1.12
es/full/base/resolver_and_hygiene 163047 ns/iter (± 2796) 139171 ns/iter (± 1678) 1.17
serialization of ast node 217 ns/iter (± 24) 182 ns/iter (± 15) 1.19
serialization of serde 218 ns/iter (± 3) 182 ns/iter (± 0) 1.20

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.