mirror of
https://github.com/swc-project/swc.git
synced 2024-10-04 20:28:43 +03:00
feat(css/parser): Improve parser api (#2847)
swc_css_parser: - Allow parsing as more types.
This commit is contained in:
parent
c1e99eee3e
commit
839a99e7fd
@ -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
|
||||
};
|
||||
|
@ -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)]
|
||||
|
@ -157,7 +157,7 @@ where
|
||||
|
||||
self.input.skip_ws()?;
|
||||
|
||||
let property = self.parse_id()?;
|
||||
let property = self.parse()?;
|
||||
|
||||
self.input.skip_ws()?;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user