From d164f812d5910c7160a20e210f994088f7fdbb76 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Fri, 24 Jan 2025 15:09:57 +0800 Subject: [PATCH] fix(es/parser): Parse `yield (v: T)=>v` --- crates/swc_ecma_parser/src/parser/expr.rs | 47 +++++++++++------------ 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/crates/swc_ecma_parser/src/parser/expr.rs b/crates/swc_ecma_parser/src/parser/expr.rs index d727473527a9..d782df1d3784 100644 --- a/crates/swc_ecma_parser/src/parser/expr.rs +++ b/crates/swc_ecma_parser/src/parser/expr.rs @@ -39,34 +39,32 @@ impl Parser { pub(super) fn parse_assignment_expr(&mut self) -> PResult> { trace_cur!(self, parse_assignment_expr); - if self.input.syntax().typescript() && self.input.syntax().jsx() { + if self.input.syntax().typescript() && is!(self, JSXTagStart) { // Note: When the JSX plugin is on, type assertions (` x`) aren't valid // syntax. - if is!(self, JSXTagStart) { - let cur_context = self.input.token_context().current(); - debug_assert_eq!(cur_context, Some(TokenContext::JSXOpeningTag)); - // Only time j_oTag is pushed is right after j_expr. + let cur_context = self.input.token_context().current(); + debug_assert_eq!(cur_context, Some(TokenContext::JSXOpeningTag)); + // Only time j_oTag is pushed is right after j_expr. + debug_assert_eq!( + self.input.token_context().0[self.input.token_context().len() - 2], + TokenContext::JSXExpr + ); + + let res = self.try_parse_ts(|p| p.parse_assignment_expr_base().map(Some)); + if let Some(res) = res { + return Ok(res); + } else { debug_assert_eq!( - self.input.token_context().0[self.input.token_context().len() - 2], - TokenContext::JSXExpr + self.input.token_context().current(), + Some(TokenContext::JSXOpeningTag) ); - - let res = self.try_parse_ts(|p| p.parse_assignment_expr_base().map(Some)); - if let Some(res) = res { - return Ok(res); - } else { - debug_assert_eq!( - self.input.token_context().current(), - Some(TokenContext::JSXOpeningTag) - ); - self.input.token_context_mut().pop(); - debug_assert_eq!( - self.input.token_context().current(), - Some(TokenContext::JSXExpr) - ); - self.input.token_context_mut().pop(); - } + self.input.token_context_mut().pop(); + debug_assert_eq!( + self.input.token_context().current(), + Some(TokenContext::JSXExpr) + ); + self.input.token_context_mut().pop(); } } @@ -2004,7 +2002,8 @@ impl Parser { } if is!(self, ';') - || (!is!(self, '*') + || (!is!(self, '<') + && !is!(self, '*') && !is!(self, '/') && !is!(self, "/=") && !cur!(self, false)