Skip to content

Commit 578b106

Browse files
committed
fix broken stylerule parsing
1 parent 7f8b771 commit 578b106

File tree

3 files changed

+18
-4
lines changed

3 files changed

+18
-4
lines changed

crates/hdx_ast/src/css/selector/mod.rs

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use hdx_atom::Atom;
22
use hdx_lexer::Token;
33
use hdx_parser::{
4-
diagnostics, expect, unexpected, unexpected_ident, Parse, Parser, Result as ParserResult, Span, Spanned,
4+
diagnostics, discard, expect, unexpected, unexpected_ident, Parse, Parser, Result as ParserResult, Span, Spanned,
55
};
66
use hdx_writer::{CssWriter, Result as WriterResult, WriteCss};
77
#[cfg(feature = "serde")]
@@ -72,6 +72,9 @@ impl<'a> Parse<'a> for Selector<'a> {
7272
}
7373
}
7474
}
75+
// Given selector parsing is Whitespace sensitive, trailing whitespace should be
76+
// discarded before moving onto the next parser which is likely a block parser
77+
discard!(parser, Token::Whitespace);
7578
Ok(Self { components: parser.boxup(components) }.spanned(span.end(parser.pos())))
7679
}
7780
}

crates/hdx_ast/src/css/stylerule.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,15 @@ impl<'a> Parse<'a> for StyleDeclaration<'a> {
5757
fn parse(parser: &mut Parser<'a>) -> ParserResult<Spanned<Self>> {
5858
let span = parser.span();
5959
expect!(parser, Token::LeftCurly);
60+
parser.advance();
6061
let mut declarations = parser.new_vec();
6162
let mut rules = parser.new_vec();
6263
loop {
6364
match parser.cur() {
64-
Token::RightCurly => break,
65+
Token::RightCurly => {
66+
parser.advance();
67+
break;
68+
}
6569
t @ Token::Eof => unexpected!(parser, t),
6670
_ => {
6771
let checkpoint = parser.checkpoint();
@@ -96,13 +100,21 @@ impl<'a> WriteCss<'a> for StyleDeclaration<'a> {
96100
}
97101

98102
#[cfg(test)]
99-
mod tests {
103+
mod test {
104+
use oxc_allocator::Allocator;
100105

101106
use super::*;
107+
use crate::test_helpers::test_write;
102108

103109
#[test]
104110
fn size_test() {
105111
use std::mem::size_of;
106112
assert_eq!(size_of::<StyleRule>(), 16);
107113
}
114+
115+
#[test]
116+
fn test_writes() {
117+
let allocator = Allocator::default();
118+
test_write::<StyleRule>(&allocator, "body {}", "body{}");
119+
}
108120
}

crates/hdx_parser/src/traits.rs

-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,6 @@ pub trait QualifiedRule<'a>: Sized + Parse<'a> {
8383
// https://drafts.csswg.org/css-syntax-3/#consume-a-qualified-rule
8484
fn parse_qualified_rule(parser: &mut Parser<'a>) -> Result<(Spanned<Self::Prelude>, Spanned<Self::Block>)> {
8585
let prelude = Self::parse_prelude(parser)?;
86-
expect!(parser, Token::LeftCurly);
8786
Ok((prelude, Self::parse_block(parser)?))
8887
}
8988
}

0 commit comments

Comments
 (0)