| 24 | type Rule: Parse<'a> + NodeWithMetadata<M>; |
| 25 | |
| 26 | fn parse_stylesheet<I>(p: &mut Parser<'a, I>) -> Result<(Vec<'a, Self::Rule>, M)> |
| 27 | where |
| 28 | I: Iterator<Item = Cursor> + Clone, |
| 29 | { |
| 30 | let mut rules: Vec<'a, Self::Rule> = Vec::new_in(p.bump()); |
| 31 | let mut meta: M = Default::default(); |
| 32 | loop { |
| 33 | // While by default the parser will skip whitespace, the Rule type may be a whitespace sensitive |
| 34 | // node, for example `ComponentValues`. As such whitespace needs to be consumed here, before Declarations and |
| 35 | // Rules are parsed. |
| 36 | if p.parse_if_peek::<T![' ']>()?.is_some() || p.parse_if_peek::<T![CdcOrCdo]>()?.is_some() { |
| 37 | continue; |
| 38 | } |
| 39 | |
| 40 | // need to peek as last tokens may be whitespace. |
| 41 | if p.at_end() || p.peek_n(1) == Kind::Eof { |
| 42 | return Ok((rules, meta)); |
| 43 | } |
| 44 | let rule = p.parse::<Self::Rule>()?; |
| 45 | meta = meta.merge(rule.metadata()); |
| 46 | rules.push(rule); |
| 47 | } |
| 48 | } |
| 49 | } |