diff --git a/ecmascript/parser/src/lexer/state.rs b/ecmascript/parser/src/lexer/state.rs index bcce10acfe83..a9863df2d98f 100644 --- a/ecmascript/parser/src/lexer/state.rs +++ b/ecmascript/parser/src/lexer/state.rs @@ -219,7 +219,7 @@ impl<'a, I: Input> Iterator for Lexer<'a, I> { } } - if self.syntax.jsx() && !self.ctx.in_property_name { + if self.syntax.jsx() && !self.ctx.in_property_name && !self.ctx.in_type { //jsx if self.state.context.current() == Some(TokenContext::JSXExpr) { return self.read_jsx_token(); diff --git a/ecmascript/parser/src/parser/typescript.rs b/ecmascript/parser/src/parser/typescript.rs index f15d02e4a240..120328bbeba9 100644 --- a/ecmascript/parser/src/parser/typescript.rs +++ b/ecmascript/parser/src/parser/typescript.rs @@ -373,24 +373,28 @@ impl Parser { /// `tsParseTypeParameter` pub(super) fn parse_ts_type_params(&mut self) -> PResult { - let start = cur_pos!(self); + self.in_type().parse_with(|p| { + p.ts_in_no_context(|p| { + let start = cur_pos!(p); - if !is!(self, '<') && !is!(self, JSXTagStart) { - unexpected!(self, "< (jsx tag start)") - } - bump!(self); // '<' - - let params = self.parse_ts_bracketed_list( - ParsingContext::TypeParametersOrArguments, - |p| p.parse_ts_type_param(), // bracket - false, - // skip_first_token - true, - )?; + if !is!(p, '<') && !is!(p, JSXTagStart) { + unexpected!(p, "< (jsx tag start)") + } + bump!(p); // '<' - Ok(TsTypeParamDecl { - span: span!(self, start), - params, + let params = p.parse_ts_bracketed_list( + ParsingContext::TypeParametersOrArguments, + |p| p.parse_ts_type_param(), // bracket + false, + // skip_first_token + true, + )?; + + Ok(TsTypeParamDecl { + span: span!(p, start), + params, + }) + }) }) }