diff --git a/crates/oxc_ast/src/ast/ts.rs b/crates/oxc_ast/src/ast/ts.rs index 3738334f1..ab6e2076c 100644 --- a/crates/oxc_ast/src/ast/ts.rs +++ b/crates/oxc_ast/src/ast/ts.rs @@ -582,6 +582,7 @@ pub struct TSIndexSignature<'a> { pub span: Span, pub parameters: Vec<'a, Box<'a, TSIndexSignatureName<'a>>>, pub type_annotation: Box<'a, TSTypeAnnotation<'a>>, + pub readonly: bool, } #[derive(Debug, Hash)] diff --git a/crates/oxc_ast/src/ast_builder.rs b/crates/oxc_ast/src/ast_builder.rs index dfc125142..37814fa08 100644 --- a/crates/oxc_ast/src/ast_builder.rs +++ b/crates/oxc_ast/src/ast_builder.rs @@ -1365,11 +1365,13 @@ impl<'a> AstBuilder<'a> { span: Span, parameters: Vec<'a, Box<'a, TSIndexSignatureName<'a>>>, type_annotation: Box<'a, TSTypeAnnotation<'a>>, + readonly: bool, ) -> TSSignature<'a> { TSSignature::TSIndexSignature(self.alloc(TSIndexSignature { span, parameters, type_annotation, + readonly, })) } diff --git a/crates/oxc_parser/src/ts/types.rs b/crates/oxc_parser/src/ts/types.rs index 11866f08c..8f68b6852 100644 --- a/crates/oxc_parser/src/ts/types.rs +++ b/crates/oxc_parser/src/ts/types.rs @@ -1077,8 +1077,11 @@ impl<'a> ParserImpl<'a> { pub(crate) fn parse_ts_index_signature_member(&mut self) -> Result> { let span = self.start_span(); + let mut readonly = false; while self.is_nth_at_modifier(0, false) { - if !self.eat(Kind::Readonly) { + if self.eat(Kind::Readonly) { + readonly = true; + } else { return Err(self.unexpected()); } } @@ -1093,7 +1096,12 @@ impl<'a> ParserImpl<'a> { if let Some(type_annotation) = type_annotation { self.bump(Kind::Comma); self.bump(Kind::Semicolon); - Ok(self.ast.ts_index_signature(self.end_span(span), parameters, type_annotation)) + Ok(self.ast.ts_index_signature( + self.end_span(span), + parameters, + type_annotation, + readonly, + )) } else { Err(self.unexpected()) }