From 6360bdad31bcab923d53cff922f318a98da80a62 Mon Sep 17 00:00:00 2001 From: Boshen Date: Thu, 6 Apr 2023 21:02:30 +0800 Subject: [PATCH] fix(parser): fix [+in] context in `CallArguments` (#265) relates #255 --- crates/oxc_parser/src/js/expression.rs | 13 +++++++------ crates/oxc_parser/src/js/statement.rs | 7 +------ crates/oxc_parser/src/lib.rs | 7 ++++++- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/crates/oxc_parser/src/js/expression.rs b/crates/oxc_parser/src/js/expression.rs index f27755ad6..81bd23666 100644 --- a/crates/oxc_parser/src/js/expression.rs +++ b/crates/oxc_parser/src/js/expression.rs @@ -13,7 +13,7 @@ use crate::{ diagnostics, lexer::{Kind, TokenValue}, list::SeparatedList, - Parser, + Context, Parser, }; impl<'a> Parser<'a> { @@ -635,7 +635,9 @@ impl<'a> Parser<'a> { // parse `new ident` without arguments let arguments = if self.at(Kind::LParen) { - CallArguments::parse(self)?.elements + // ArgumentList[Yield, Await] : + // AssignmentExpression[+In, ?Yield, ?Await] + self.with_context(Context::In, CallArguments::parse)?.elements } else { self.ast.new_vec() }; @@ -743,10 +745,9 @@ impl<'a> Parser<'a> { optional: bool, type_parameters: Option>>, ) -> Result> { - let has_in = self.ctx.has_in(); - self.ctx = self.ctx.and_in(true); - let call_arguments = CallArguments::parse(self)?; - self.ctx = self.ctx.and_in(has_in); + // ArgumentList[Yield, Await] : + // AssignmentExpression[+In, ?Yield, ?Await] + let call_arguments = self.with_context(Context::In, CallArguments::parse)?; Ok(self.ast.call_expression( self.end_span(lhs_span), lhs, diff --git a/crates/oxc_parser/src/js/statement.rs b/crates/oxc_parser/src/js/statement.rs index ffd6b78f9..e34bc8329 100644 --- a/crates/oxc_parser/src/js/statement.rs +++ b/crates/oxc_parser/src/js/statement.rs @@ -7,12 +7,7 @@ use super::{ grammar::CoverGrammar, list::SwitchCases, }; -use crate::{ - diagnostics, - lexer::Kind, - list::NormalList, - Parser, {Context, StatementContext}, -}; +use crate::{diagnostics, lexer::Kind, list::NormalList, Context, Parser, StatementContext}; impl<'a> Parser<'a> { /// diff --git a/crates/oxc_parser/src/lib.rs b/crates/oxc_parser/src/lib.rs index 8d62fdff6..b8cc2dc2e 100644 --- a/crates/oxc_parser/src/lib.rs +++ b/crates/oxc_parser/src/lib.rs @@ -286,7 +286,12 @@ mod test { assert!(!ret.errors.is_empty()); } - let pass = ["async(...null)", "null?async():null", "switch(null){case async():}"]; + let pass = [ + "async(...null)", + "null?async():null", + "switch(null){case async():}", + "for(new null(null in null);;);", + ]; for source in pass { let ret = Parser::new(&allocator, source, source_type).parse();