feat(css/parser): Improve parser api (#2847)

swc_css_parser:
 - Allow parsing as more types.
This commit is contained in:
Alexander Akait 2021-11-23 14:53:58 +03:00 committed by GitHub
parent c1e99eee3e
commit 839a99e7fd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 59 deletions

View File

@ -278,21 +278,13 @@ where
let span = self.input.cur_span()?;
let src = match cur!(self) {
Token::Str { .. } => {
let str = self.parse()?;
Ok(ImportSource::Str(str))
}
Token::Str { .. } => Ok(ImportSource::Str(self.parse()?)),
Token::Function { value, .. } if *value.to_ascii_lowercase() == js_word!("url") => {
let func = self.parse()?;
Ok(ImportSource::Fn(func))
}
Token::Url { .. } => {
let url = self.parse()?;
Ok(ImportSource::Url(url))
}
Token::Url { .. } => Ok(ImportSource::Url(self.parse()?)),
_ => Err(Error::new(
span,
ErrorKind::Expected("url('https://example.com') or 'https://example.com'"),
@ -520,7 +512,7 @@ where
let span = self.input.cur_span()?;
if is!(self, Ident) {
self.parse_id().map(KeyframeSelector::Ident)
self.parse().map(KeyframeSelector::Ident)
} else if is!(self, Percent) {
self.parse().map(KeyframeSelector::Percent)
} else {
@ -706,12 +698,12 @@ where
query,
})
} else if is!(self, Ident) {
let ident = self.parse_id()?;
let ident = self.parse()?;
MediaQuery::Ident(ident)
} else if eat!(self, "(") {
if is!(self, Ident) {
let span = self.input.cur_span()?;
let id = self.parse_id()?;
let id = self.parse()?;
self.input.skip_ws()?;
@ -844,13 +836,13 @@ where
let start = self.input.cur_span()?.lo;
let ident = if is!(self, Ident) {
Some(self.parse_id()?)
Some(self.parse()?)
} else {
None
};
let pseudo = if eat!(self, ":") {
Some(self.parse_id()?)
Some(self.parse()?)
} else {
None
};

View File

@ -1,8 +1,5 @@
use self::input::{Buffer, ParserInput};
use crate::{
error::{Error, ErrorKind},
Parse,
};
use crate::{error::Error, Parse};
use std::mem::take;
use swc_common::Span;
use swc_css_ast::*;
@ -85,20 +82,6 @@ where
pub fn parse_all(&mut self) -> PResult<Stylesheet> {
self.parse()
}
fn parse_id(&mut self) -> PResult<Ident> {
let span = self.input.cur_span()?;
if !is!(self, Ident) {
return Err(Error::new(span, ErrorKind::Expected("Ident")));
}
match bump!(self) {
Token::Ident { value, raw } => Ok(Ident { span, value, raw }),
_ => {
unreachable!()
}
}
}
}
#[derive(Clone, Copy)]

View File

@ -157,7 +157,7 @@ where
self.input.skip_ws()?;
let property = self.parse_id()?;
let property = self.parse()?;
self.input.skip_ws()?;

View File

@ -192,16 +192,7 @@ where
let span = self.input.cur_span()?;
match cur!(self) {
Token::Str { .. } => {
let token = bump!(self);
match token {
Token::Str { value, raw } => return Ok(Value::Str(Str { span, value, raw })),
_ => {
unreachable!()
}
}
}
Token::Str { .. } => return Ok(Value::Str(self.parse()?)),
Token::Num { .. } => return self.parse_numeric_value(),
@ -211,7 +202,7 @@ where
Token::Dimension { .. } => return self.parse_numeric_value(),
Token::Ident { .. } => return self.parse_value_ident_or_fn(),
Token::Ident { .. } => return Ok(Value::Ident(self.parse()?)),
tok!("[") => return self.parse_square_brackets_value().map(From::from),
@ -260,20 +251,7 @@ where
}));
}
Token::Url { .. } => {
let url = match bump!(self) {
Token::Url { value, raw } => (value, raw),
_ => {
unreachable!()
}
};
return Ok(Value::Url(UrlValue {
span: span!(self, span.lo),
url: url.0,
raw: url.1,
}));
}
Token::Url { .. } => return Ok(Value::Url(self.parse()?)),
_ => {}
}
@ -575,6 +553,26 @@ where
}
}
impl<I> Parse<Ident> for Parser<I>
where
I: ParserInput,
{
fn parse(&mut self) -> PResult<Ident> {
let span = self.input.cur_span()?;
if !is!(self, Ident) {
return Err(Error::new(span, ErrorKind::Expected("Ident")));
}
match bump!(self) {
Token::Ident { value, raw } => Ok(Ident { span, value, raw }),
_ => {
unreachable!()
}
}
}
}
impl<I> Parse<PercentValue> for Parser<I>
where
I: ParserInput,