From 956d57468367ddfd7ff87cb98954a3006edad4b9 Mon Sep 17 00:00:00 2001 From: Alexander Akait <4567934+alexander-akait@users.noreply.github.com> Date: Fri, 28 Oct 2022 06:14:08 +0300 Subject: [PATCH] feat(css/parser): Improve error reporting (#6274) --- .../src/parser/selectors/mod.rs | 10 +- crates/swc_css_parser/tests/fixture.rs | 3 - .../at-rule/media/condition-1/output.json | 347 ++++++++++++++++-- .../media/condition-1/output.swc-stderr | 6 + .../at-rule/media/condition/output.json | 235 ++++++++++-- .../at-rule/media/condition/output.swc-stderr | 6 + .../tests/recovery/at-rule/unknown/input.css | 1 - .../recovery/at-rule/unknown/output.json | 30 -- .../recovery/at-rule/unknown/span.rust-debug | 30 -- .../recovery/cdo-and-cdc/output.swc-stderr | 2 +- 10 files changed, 527 insertions(+), 143 deletions(-) delete mode 100644 crates/swc_css_parser/tests/recovery/at-rule/unknown/input.css delete mode 100644 crates/swc_css_parser/tests/recovery/at-rule/unknown/output.json delete mode 100644 crates/swc_css_parser/tests/recovery/at-rule/unknown/span.rust-debug diff --git a/crates/swc_css_parser/src/parser/selectors/mod.rs b/crates/swc_css_parser/src/parser/selectors/mod.rs index f2eefb6d1114..094a87779f7a 100644 --- a/crates/swc_css_parser/src/parser/selectors/mod.rs +++ b/crates/swc_css_parser/src/parser/selectors/mod.rs @@ -403,8 +403,8 @@ where I: ParserInput, { fn parse(&mut self) -> PResult { - let span = self.input.cur_span(); - let start_pos = span.lo; + let start_span = self.input.cur_span(); + let start_pos = start_span.lo; let mut nesting_selector = None; @@ -459,12 +459,12 @@ where } } - let span = span!(self, start_pos); - if nesting_selector.is_none() && type_selector.is_none() && subclass_selectors.is_empty() { - return Err(Error::new(span, ErrorKind::InvalidSelector)); + return Err(Error::new(start_span, ErrorKind::InvalidSelector)); } + let span = span!(self, start_pos); + Ok(CompoundSelector { span, nesting_selector, diff --git a/crates/swc_css_parser/tests/fixture.rs b/crates/swc_css_parser/tests/fixture.rs index a7f347fb0866..8e429ffc1add 100644 --- a/crates/swc_css_parser/tests/fixture.rs +++ b/crates/swc_css_parser/tests/fixture.rs @@ -581,11 +581,8 @@ fn span_visualizer_line_comment(input: PathBuf) { #[testing::fixture( "tests/recovery/**/input.css", exclude( - "at-rule/media/condition/input.css", - "at-rule/media/condition-1/input.css", "at-rule/page/invalid-nesting/input.css", "at-rule/page/without-page/input.css", - "at-rule/unknown/input.css", "function/calc/division/input.css", "function/calc/space/input.css", "function/var/input.css", diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.json b/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.json index 5137f966d669..32b88d609968 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.json +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.json @@ -24,60 +24,325 @@ "raw": "media" }, "prelude": { - "type": "MediaQueryList", + "type": "ListOfComponentValues", "span": { - "start": 49, - "end": 59, + "start": 7, + "end": 60, "ctxt": 0 }, - "queries": [ + "children": [ { - "type": "MediaQuery", + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "SimpleBlock", + "span": { + "start": 8, + "end": 22, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 9, + "ctxt": 0 + }, + "token": "LParen" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 9, + "end": 15, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "update", + "raw": "update" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 15, + "end": 16, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 16, + "end": 17, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 17, + "end": 21, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "slow", + "raw": "slow" + } + } + } + ] + }, + { + "type": "PreservedToken", + "span": { + "start": 22, + "end": 23, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 23, + "end": 26, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "and", + "raw": "and" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 26, + "end": 27, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "SimpleBlock", + "span": { + "start": 27, + "end": 40, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 27, + "end": 28, + "ctxt": 0 + }, + "token": "LParen" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 28, + "end": 33, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "hover", + "raw": "hover" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 33, + "end": 34, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 34, + "end": 35, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 35, + "end": 39, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "none", + "raw": "none" + } + } + } + ] + }, + { + "type": "PreservedToken", + "span": { + "start": 40, + "end": 41, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 41, + "end": 48, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "unknown", + "raw": "unknown" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 48, + "end": 49, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "SimpleBlock", "span": { "start": 49, "end": 59, "ctxt": 0 }, - "modifier": null, - "mediaType": null, - "keyword": null, - "condition": { - "type": "MediaCondition", + "name": { + "type": "PreservedToken", "span": { "start": 49, - "end": 59, + "end": 50, "ctxt": 0 }, - "conditions": [ - { - "type": "MediaFeaturePlain", - "span": { - "start": 49, - "end": 59, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 50, - "end": 55, - "ctxt": 0 - }, + "token": "LParen" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 50, + "end": 55, + "ctxt": 0 + }, + "token": { + "Ident": { "value": "color", "raw": "color" - }, - "value": { - "type": "Number", - "span": { - "start": 57, - "end": 58, - "ctxt": 0 - }, + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 55, + "end": 56, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 56, + "end": 57, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 57, + "end": 58, + "ctxt": 0 + }, + "token": { + "Number": { "value": 1.0, - "raw": "1" + "raw": "1", + "type": "integer" } } - ] + } + ] + }, + { + "type": "PreservedToken", + "span": { + "start": 59, + "end": 60, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } } } ] @@ -89,7 +354,15 @@ "end": 62, "ctxt": 0 }, - "name": "{", + "name": { + "type": "PreservedToken", + "span": { + "start": 60, + "end": 61, + "ctxt": 0 + }, + "token": "LBrace" + }, "value": [] } } diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.swc-stderr b/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.swc-stderr index e69de29bb2d1..066d4b992137 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/condition-1/output.swc-stderr @@ -0,0 +1,6 @@ + + x Unexpected tokens in at-rule prelude + ,-[$DIR/tests/recovery/at-rule/media/condition-1/input.css:1:1] + 1 | @media (update: slow) and (hover: none) unknown (color: 1) {} + : ^^^^^^^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.json b/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.json index cf466206eead..46749b2239c0 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.json +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.json @@ -24,60 +24,215 @@ "raw": "media" }, "prelude": { - "type": "MediaQueryList", + "type": "ListOfComponentValues", "span": { - "start": 31, - "end": 44, + "start": 7, + "end": 45, "ctxt": 0 }, - "queries": [ + "children": [ { - "type": "MediaQuery", + "type": "PreservedToken", + "span": { + "start": 7, + "end": 8, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "SimpleBlock", + "span": { + "start": 8, + "end": 22, + "ctxt": 0 + }, + "name": { + "type": "PreservedToken", + "span": { + "start": 8, + "end": 9, + "ctxt": 0 + }, + "token": "LParen" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 9, + "end": 15, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "update", + "raw": "update" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 15, + "end": 16, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 16, + "end": 17, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 17, + "end": 21, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "slow", + "raw": "slow" + } + } + } + ] + }, + { + "type": "PreservedToken", + "span": { + "start": 22, + "end": 23, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 23, + "end": 30, + "ctxt": 0 + }, + "token": { + "Ident": { + "value": "unknown", + "raw": "unknown" + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 30, + "end": 31, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "SimpleBlock", "span": { "start": 31, "end": 44, "ctxt": 0 }, - "modifier": null, - "mediaType": null, - "keyword": null, - "condition": { - "type": "MediaCondition", + "name": { + "type": "PreservedToken", "span": { "start": 31, - "end": 44, + "end": 32, "ctxt": 0 }, - "conditions": [ - { - "type": "MediaFeaturePlain", - "span": { - "start": 31, - "end": 44, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 32, - "end": 37, - "ctxt": 0 - }, + "token": "LParen" + }, + "value": [ + { + "type": "PreservedToken", + "span": { + "start": 32, + "end": 37, + "ctxt": 0 + }, + "token": { + "Ident": { "value": "hover", "raw": "hover" - }, - "value": { - "type": "Ident", - "span": { - "start": 39, - "end": 43, - "ctxt": 0 - }, + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 37, + "end": 38, + "ctxt": 0 + }, + "token": "Colon" + }, + { + "type": "PreservedToken", + "span": { + "start": 38, + "end": 39, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } + } + }, + { + "type": "PreservedToken", + "span": { + "start": 39, + "end": 43, + "ctxt": 0 + }, + "token": { + "Ident": { "value": "none", "raw": "none" } } - ] + } + ] + }, + { + "type": "PreservedToken", + "span": { + "start": 44, + "end": 45, + "ctxt": 0 + }, + "token": { + "WhiteSpace": { + "value": " " + } } } ] @@ -89,7 +244,15 @@ "end": 47, "ctxt": 0 }, - "name": "{", + "name": { + "type": "PreservedToken", + "span": { + "start": 45, + "end": 46, + "ctxt": 0 + }, + "token": "LBrace" + }, "value": [] } } diff --git a/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.swc-stderr b/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.swc-stderr index e69de29bb2d1..967c0273b145 100644 --- a/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/at-rule/media/condition/output.swc-stderr @@ -0,0 +1,6 @@ + + x Unexpected tokens in at-rule prelude + ,-[$DIR/tests/recovery/at-rule/media/condition/input.css:1:1] + 1 | @media (update: slow) unknown (hover: none) {} + : ^^^^^^^ + `---- diff --git a/crates/swc_css_parser/tests/recovery/at-rule/unknown/input.css b/crates/swc_css_parser/tests/recovery/at-rule/unknown/input.css deleted file mode 100644 index 2daa7e9e96ab..000000000000 --- a/crates/swc_css_parser/tests/recovery/at-rule/unknown/input.css +++ /dev/null @@ -1 +0,0 @@ -@import-normalize; diff --git a/crates/swc_css_parser/tests/recovery/at-rule/unknown/output.json b/crates/swc_css_parser/tests/recovery/at-rule/unknown/output.json deleted file mode 100644 index f2b2e03b3373..000000000000 --- a/crates/swc_css_parser/tests/recovery/at-rule/unknown/output.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "type": "Stylesheet", - "span": { - "start": 1, - "end": 20, - "ctxt": 0 - }, - "rules": [ - { - "type": "AtRule", - "span": { - "start": 1, - "end": 19, - "ctxt": 0 - }, - "name": { - "type": "Ident", - "span": { - "start": 2, - "end": 18, - "ctxt": 0 - }, - "value": "import-normalize", - "raw": "import-normalize" - }, - "prelude": null, - "block": null - } - ] -} diff --git a/crates/swc_css_parser/tests/recovery/at-rule/unknown/span.rust-debug b/crates/swc_css_parser/tests/recovery/at-rule/unknown/span.rust-debug deleted file mode 100644 index b557883069a5..000000000000 --- a/crates/swc_css_parser/tests/recovery/at-rule/unknown/span.rust-debug +++ /dev/null @@ -1,30 +0,0 @@ - - x Stylesheet - ,-[$DIR/tests/recovery/at-rule/unknown/input.css:1:1] - 1 | @import-normalize; - : ^^^^^^^^^^^^^^^^^^^ - `---- - - x Rule - ,-[$DIR/tests/recovery/at-rule/unknown/input.css:1:1] - 1 | @import-normalize; - : ^^^^^^^^^^^^^^^^^^ - `---- - - x AtRule - ,-[$DIR/tests/recovery/at-rule/unknown/input.css:1:1] - 1 | @import-normalize; - : ^^^^^^^^^^^^^^^^^^ - `---- - - x AtRuleName - ,-[$DIR/tests/recovery/at-rule/unknown/input.css:1:1] - 1 | @import-normalize; - : ^^^^^^^^^^^^^^^^ - `---- - - x Ident - ,-[$DIR/tests/recovery/at-rule/unknown/input.css:1:1] - 1 | @import-normalize; - : ^^^^^^^^^^^^^^^^ - `---- diff --git a/crates/swc_css_parser/tests/recovery/cdo-and-cdc/output.swc-stderr b/crates/swc_css_parser/tests/recovery/cdo-and-cdc/output.swc-stderr index 03f9e26b938e..4230f7b44f2e 100644 --- a/crates/swc_css_parser/tests/recovery/cdo-and-cdc/output.swc-stderr +++ b/crates/swc_css_parser/tests/recovery/cdo-and-cdc/output.swc-stderr @@ -20,5 +20,5 @@ x Invalid selector ,-[$DIR/tests/recovery/cdo-and-cdc/input.css:1:1] 1 | - : ^ + : ^^^ `----