From 637cd1dea485ca8927e916c3b70b58697498921e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arnaud=20Barr=C3=A9?= Date: Sun, 3 Mar 2024 07:58:57 +0100 Subject: [PATCH] fix(ast): support TSIndexSignature.readonly (#2579) [playground](https://oxc-project.github.io/oxc/playground/?code=3YCAAIDKgICAgICAgIC0GwpuZs97oWDqPM4xvCuoRB73mPOSrYb%2BTQEZf3b8RF0G%2B60jF5tYXUE9Me2%2FmMqVEwVy%2FiBIlyIMX6PqBpqsSmIXTJcsRqi4f3%2Bj6ICA) --- crates/oxc_ast/src/ast/ts.rs | 1 + crates/oxc_ast/src/ast_builder.rs | 2 ++ crates/oxc_parser/src/ts/types.rs | 12 ++++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) 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()) }