use crate::parser::CssParser;
use crate::syntax::at_rule::layer::LayerNameList;
use crate::syntax::at_rule::media::MediaQueryList;
use crate::syntax::at_rule::supports::parse_any_supports_condition;
use crate::syntax::value::url::{is_at_url_function, parse_url_function};
use crate::syntax::{is_at_declaration, is_at_string, parse_declaration, parse_string};
use biome_css_syntax::CssSyntaxKind::*;
use biome_css_syntax::T;
use biome_parser::parse_lists::ParseSeparatedList;
use biome_parser::parsed_syntax::ParsedSyntax::Present;
use biome_parser::prelude::ParsedSyntax::Absent;
use biome_parser::prelude::*;
#[inline]
pub(crate) fn is_at_import_at_rule(p: &mut CssParser) -> bool {
p.at(T![import])
}
#[inline]
pub(crate) fn parse_import_at_rule(p: &mut CssParser) -> ParsedSyntax {
if !is_at_import_at_rule(p) {
return Absent;
}
let m = p.start();
p.bump(T![import]);
let kind = if is_at_import_url(p) {
parse_import_url(p).ok();
CSS_IMPORT_AT_RULE
} else {
CSS_BOGUS_AT_RULE
};
if is_at_import_named_layer(p) {
parse_import_named_layer(p).ok();
} else if is_at_import_anonymous_layer(p) {
parse_import_anonymous_layer(p).ok();
}
if is_at_import_supports(p) {
parse_import_supports(p).ok(); }
MediaQueryList::new(T![;]).parse_list(p);
p.expect(T![;]);
Present(m.complete(p, kind))
}
#[inline]
pub(crate) fn is_at_import_url(p: &mut CssParser) -> bool {
is_at_url_function(p) || is_at_string(p)
}
#[inline]
pub(crate) fn parse_import_url(p: &mut CssParser) -> ParsedSyntax {
if !is_at_import_url(p) {
return Absent;
}
if is_at_url_function(p) {
parse_url_function(p)
} else {
parse_string(p)
}
}
#[inline]
pub(crate) fn is_at_import_anonymous_layer(p: &mut CssParser) -> bool {
p.at(T![layer])
}
#[inline]
pub(crate) fn parse_import_anonymous_layer(p: &mut CssParser) -> ParsedSyntax {
if !is_at_import_anonymous_layer(p) {
return Absent;
}
let m = p.start();
p.bump(T![layer]);
Present(m.complete(p, CSS_IMPORT_ANONYMOUS_LAYER))
}
#[inline]
pub(crate) fn is_at_import_named_layer(p: &mut CssParser) -> bool {
p.at(T![layer]) && p.nth_at(1, T!['('])
}
#[inline]
pub(crate) fn parse_import_named_layer(p: &mut CssParser) -> ParsedSyntax {
if !is_at_import_named_layer(p) {
return Absent;
}
let m = p.start();
p.bump(T![layer]);
p.bump(T!['(']);
LayerNameList.parse_list(p);
p.expect(T![')']);
Present(m.complete(p, CSS_IMPORT_NAMED_LAYER))
}
#[inline]
pub(crate) fn is_at_import_supports(p: &mut CssParser) -> bool {
p.at(T![supports])
}
#[inline]
pub(crate) fn parse_import_supports(p: &mut CssParser) -> ParsedSyntax {
if !is_at_import_supports(p) {
return Absent;
}
let m = p.start();
p.bump(T![supports]);
p.bump(T!['(']);
if is_at_declaration(p) {
parse_declaration(p).ok(); } else {
parse_any_supports_condition(p).ok(); }
p.expect(T![')']);
Present(m.complete(p, CSS_IMPORT_SUPPORTS))
}