use crate::parser::CssParser;
use crate::syntax::selector::selector_lex_context;
use biome_css_syntax::CssSyntaxKind::{CSS_NESTED_SELECTOR, CSS_NESTED_SELECTOR_LIST};
use biome_css_syntax::{CssSyntaxKind, T};
use biome_parser::parse_lists::ParseNodeList;
use biome_parser::parse_recovery::{RecoveryError, RecoveryResult};
use biome_parser::parsed_syntax::ParsedSyntax;
use biome_parser::parsed_syntax::ParsedSyntax::{Absent, Present};
use biome_parser::Parser;
pub(crate) struct NestedSelectorList;
impl ParseNodeList for NestedSelectorList {
type Kind = CssSyntaxKind;
type Parser<'source> = CssParser<'source>;
const LIST_KIND: CssSyntaxKind = CSS_NESTED_SELECTOR_LIST;
fn parse_element(&mut self, p: &mut CssParser) -> ParsedSyntax {
parse_nested_selector(p)
}
fn is_at_list_end(&self, p: &mut CssParser) -> bool {
!p.at(T![&])
}
fn recover(&mut self, _p: &mut CssParser, parsed_element: ParsedSyntax) -> RecoveryResult {
match parsed_element {
Absent => Err(RecoveryError::AlreadyRecovered),
Present(m) => Ok(m),
}
}
}
#[inline]
fn is_at_nested_selector(p: &mut CssParser) -> bool {
p.at(T![&])
}
#[inline]
fn parse_nested_selector(p: &mut CssParser) -> ParsedSyntax {
if !is_at_nested_selector(p) {
return Absent;
}
let m = p.start();
let context = selector_lex_context(p);
p.bump_with_context(T![&], context);
Present(m.complete(p, CSS_NESTED_SELECTOR))
}