use super::*;
#[parser]
impl<'a, I: Input> Parser<'a, I> {
pub(super) fn parse_ident_ref(&mut self) -> PResult<'a, Ident> {
let ctx = self.ctx();
self.parse_ident(!ctx.in_generator, !ctx.in_async)
}
pub(super) fn parse_label_ident(&mut self) -> PResult<'a, Ident> {
let ctx = self.ctx();
self.parse_ident(!ctx.in_generator, !ctx.in_async)
}
pub(super) fn parse_ident_name(&mut self) -> PResult<'a, Ident> {
let start = cur_pos!();
let w = match cur!(true) {
Ok(&Word(..)) => match bump!() {
Word(w) => w,
_ => unreachable!(),
},
_ => syntax_error!(SyntaxError::ExpectedIdent),
};
Ok(Ident::new(w.into(), span!(start)))
}
pub(super) fn parse_ident(&mut self, incl_yield: bool, incl_await: bool) -> PResult<'a, Ident> {
let start = cur_pos!();
let word = self.parse_with(|p| {
let strict = p.ctx().strict;
let w = match cur!(true) {
Ok(&Word(..)) => match bump!() {
Word(w) => w,
_ => unreachable!(),
},
_ => syntax_error!(SyntaxError::ExpectedIdent),
};
match w {
Ident(js_word!("enum")) => {
syntax_error!(p.input.prev_span(), SyntaxError::InvalidIdentInStrict)
}
Keyword(Yield)
| Ident(js_word!("static"))
| Ident(js_word!("implements"))
| Ident(js_word!("interface"))
| Ident(js_word!("let"))
| Ident(js_word!("package"))
| Ident(js_word!("private"))
| Ident(js_word!("protected"))
| Ident(js_word!("public"))
if strict =>
{
syntax_error!(p.input.prev_span(), SyntaxError::InvalidIdentInStrict)
}
_ => {}
}
match w {
Keyword(Await) if p.ctx().module => {
syntax_error!(p.input.prev_span(), SyntaxError::ExpectedIdent)
}
Keyword(Let) => Ok(w.into()),
Ident(ident) => Ok(ident),
Keyword(Yield) if incl_yield => Ok(js_word!("yield")),
Keyword(Await) if incl_await => Ok(js_word!("await")),
Keyword(..) | Null | True | False => {
syntax_error!(p.input.prev_span(), SyntaxError::ExpectedIdent)
}
}
})?;
Ok(Ident::new(word, span!(start)))
}
}
pub(super) trait MaybeOptionalIdentParser<'a, Ident> {
fn parse_maybe_opt_binding_ident(&mut self) -> PResult<'a, Ident>;
}
impl<'a, I: Input> MaybeOptionalIdentParser<'a, Ident> for Parser<'a, I> {
fn parse_maybe_opt_binding_ident(&mut self) -> PResult<'a, Ident> {
self.parse_binding_ident()
}
}
impl<'a, I: Input> MaybeOptionalIdentParser<'a, Option<Ident>> for Parser<'a, I> {
fn parse_maybe_opt_binding_ident(&mut self) -> PResult<'a, Option<Ident>> {
self.parse_opt_binding_ident()
}
}