diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 2665262f0fe..a85de35e442 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -5009,6 +5009,50 @@ impl TsInferTypeBuilder { )) } } +pub fn ts_initialized_property_signature_class_member( + modifiers: TsPropertySignatureModifierList, + name: AnyJsClassMemberName, + value: JsInitializerClause, +) -> TsInitializedPropertySignatureClassMemberBuilder { + TsInitializedPropertySignatureClassMemberBuilder { + modifiers, + name, + value, + question_mark_token: None, + semicolon_token: None, + } +} +pub struct TsInitializedPropertySignatureClassMemberBuilder { + modifiers: TsPropertySignatureModifierList, + name: AnyJsClassMemberName, + value: JsInitializerClause, + question_mark_token: Option, + semicolon_token: Option, +} +impl TsInitializedPropertySignatureClassMemberBuilder { + pub fn with_question_mark_token(mut self, question_mark_token: SyntaxToken) -> Self { + self.question_mark_token = Some(question_mark_token); + self + } + pub fn with_semicolon_token(mut self, semicolon_token: SyntaxToken) -> Self { + self.semicolon_token = Some(semicolon_token); + self + } + pub fn build(self) -> TsInitializedPropertySignatureClassMember { + TsInitializedPropertySignatureClassMember::unwrap_cast(SyntaxNode::new_detached( + JsSyntaxKind::TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER, + [ + Some(SyntaxElement::Node(self.modifiers.into_syntax())), + Some(SyntaxElement::Node(self.name.into_syntax())), + self.question_mark_token + .map(|token| SyntaxElement::Token(token)), + Some(SyntaxElement::Node(self.value.into_syntax())), + self.semicolon_token + .map(|token| SyntaxElement::Token(token)), + ], + )) + } +} pub fn ts_instantiation_expression( expression: AnyJsExpression, arguments: TsTypeArguments, diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index 7c870860a65..89ba5a6eb34 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -7628,6 +7628,53 @@ impl SyntaxFactory for JsSyntaxFactory { } slots.into_node(TS_INFER_TYPE, children) } + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER => { + let mut elements = (&children).into_iter(); + let mut slots: RawNodeSlots<5usize> = RawNodeSlots::default(); + let mut current_element = elements.next(); + if let Some(element) = ¤t_element { + if TsPropertySignatureModifierList::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if AnyJsClassMemberName::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if element.kind() == T ! [?] { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if JsInitializerClause::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if element.kind() == T ! [;] { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if current_element.is_some() { + return RawSyntaxNode::new( + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER.to_bogus(), + children.into_iter().map(Some), + ); + } + slots.into_node(TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER, children) + } TS_INSTANTIATION_EXPRESSION => { let mut elements = (&children).into_iter(); let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index 4ac106fc095..9abbf6b4951 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -4005,6 +4005,19 @@ impl IntoFormat for rome_js_syntax::TsPropertySignatureClassMem FormatOwnedWithRule :: new (self , crate :: ts :: classes :: property_signature_class_member :: FormatTsPropertySignatureClassMember :: default ()) } } +impl FormatRule < rome_js_syntax :: TsInitializedPropertySignatureClassMember > for crate :: ts :: classes :: initialized_property_signature_class_member :: FormatTsInitializedPropertySignatureClassMember { type Context = JsFormatContext ; # [inline (always)] fn fmt (& self , node : & rome_js_syntax :: TsInitializedPropertySignatureClassMember , f : & mut JsFormatter) -> FormatResult < () > { FormatNodeRule :: < rome_js_syntax :: TsInitializedPropertySignatureClassMember > :: fmt (self , node , f) } } +impl AsFormat for rome_js_syntax::TsInitializedPropertySignatureClassMember { + type Format < 'a > = FormatRefWithRule < 'a , rome_js_syntax :: TsInitializedPropertySignatureClassMember , crate :: ts :: classes :: initialized_property_signature_class_member :: FormatTsInitializedPropertySignatureClassMember > ; + fn format(&self) -> Self::Format<'_> { + FormatRefWithRule :: new (self , crate :: ts :: classes :: initialized_property_signature_class_member :: FormatTsInitializedPropertySignatureClassMember :: default ()) + } +} +impl IntoFormat for rome_js_syntax::TsInitializedPropertySignatureClassMember { + type Format = FormatOwnedWithRule < rome_js_syntax :: TsInitializedPropertySignatureClassMember , crate :: ts :: classes :: initialized_property_signature_class_member :: FormatTsInitializedPropertySignatureClassMember > ; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule :: new (self , crate :: ts :: classes :: initialized_property_signature_class_member :: FormatTsInitializedPropertySignatureClassMember :: default ()) + } +} impl FormatRule for crate::ts::classes::method_signature_class_member::FormatTsMethodSignatureClassMember { diff --git a/crates/rome_js_formatter/src/js/any/class_member.rs b/crates/rome_js_formatter/src/js/any/class_member.rs index ea93d7d6799..bec9c7ae174 100644 --- a/crates/rome_js_formatter/src/js/any/class_member.rs +++ b/crates/rome_js_formatter/src/js/any/class_member.rs @@ -16,6 +16,9 @@ impl FormatRule for FormatAnyJsClassMember { AnyJsClassMember::JsSetterClassMember(node) => node.format().fmt(f), AnyJsClassMember::TsConstructorSignatureClassMember(node) => node.format().fmt(f), AnyJsClassMember::TsPropertySignatureClassMember(node) => node.format().fmt(f), + AnyJsClassMember::TsInitializedPropertySignatureClassMember(node) => { + node.format().fmt(f) + } AnyJsClassMember::TsMethodSignatureClassMember(node) => node.format().fmt(f), AnyJsClassMember::TsGetterSignatureClassMember(node) => node.format().fmt(f), AnyJsClassMember::TsSetterSignatureClassMember(node) => node.format().fmt(f), diff --git a/crates/rome_js_formatter/src/js/classes/property_class_member.rs b/crates/rome_js_formatter/src/js/classes/property_class_member.rs index 4ce1c22a03d..fd92389db7c 100644 --- a/crates/rome_js_formatter/src/js/classes/property_class_member.rs +++ b/crates/rome_js_formatter/src/js/classes/property_class_member.rs @@ -4,7 +4,7 @@ use crate::utils::{AnyJsAssignmentLike, FormatSemicolon}; use rome_formatter::write; use rome_js_syntax::{ AnyJsClassMember, AnyJsClassMemberName, JsInitializerClause, JsPropertyClassMember, - JsSyntaxToken, TsPropertySignatureClassMember, + JsSyntaxToken, TsInitializedPropertySignatureClassMember, TsPropertySignatureClassMember, }; use rome_rowan::{declare_node_union, SyntaxResult}; @@ -28,7 +28,7 @@ impl FormatNodeRule for FormatJsPropertyClassMember { } declare_node_union! { - pub(crate) AnyJsPropertyClassMember = JsPropertyClassMember | TsPropertySignatureClassMember + pub(crate) AnyJsPropertyClassMember = JsPropertyClassMember | TsPropertySignatureClassMember | TsInitializedPropertySignatureClassMember } impl AnyJsPropertyClassMember { @@ -36,6 +36,9 @@ impl AnyJsPropertyClassMember { match self { AnyJsPropertyClassMember::JsPropertyClassMember(property) => property.name(), AnyJsPropertyClassMember::TsPropertySignatureClassMember(property) => property.name(), + AnyJsPropertyClassMember::TsInitializedPropertySignatureClassMember(property) => { + property.name() + } } } @@ -43,6 +46,9 @@ impl AnyJsPropertyClassMember { match self { AnyJsPropertyClassMember::JsPropertyClassMember(property) => property.value(), AnyJsPropertyClassMember::TsPropertySignatureClassMember(_) => None, + AnyJsPropertyClassMember::TsInitializedPropertySignatureClassMember(property) => { + property.value().ok() + } } } @@ -54,6 +60,7 @@ impl AnyJsPropertyClassMember { AnyJsPropertyClassMember::TsPropertySignatureClassMember(property) => { property.property_annotation().is_some() } + AnyJsPropertyClassMember::TsInitializedPropertySignatureClassMember(_) => false, } } } @@ -130,7 +137,8 @@ fn needs_semicolon(property: &AnyJsPropertyClassMember) -> SyntaxResult { // Computed members may be misinterpreted as array accessors/array types member @ AnyJsClassMember::JsPropertyClassMember(_) - | member @ AnyJsClassMember::TsPropertySignatureClassMember(_) => match member.name()? { + | member @ AnyJsClassMember::TsPropertySignatureClassMember(_) + | member @ AnyJsClassMember::TsInitializedPropertySignatureClassMember(_) => match member.name()? { Some(name) => name.is_computed(), None => false, }, @@ -175,6 +183,9 @@ fn has_modifiers(member: &AnyJsClassMember) -> bool { AnyJsClassMember::TsPropertySignatureClassMember(property) => { property.modifiers().is_empty() } + AnyJsClassMember::TsInitializedPropertySignatureClassMember(property) => { + property.modifiers().is_empty() + } AnyJsClassMember::TsSetterSignatureClassMember(setter) => setter.modifiers().is_empty(), }; diff --git a/crates/rome_js_formatter/src/ts/classes/initialized_property_signature_class_member.rs b/crates/rome_js_formatter/src/ts/classes/initialized_property_signature_class_member.rs new file mode 100644 index 00000000000..a1c37d30a0b --- /dev/null +++ b/crates/rome_js_formatter/src/ts/classes/initialized_property_signature_class_member.rs @@ -0,0 +1,31 @@ +use crate::js::classes::property_class_member::{ + AnyJsPropertyClassMember, FormatClassPropertySemicolon, +}; +use crate::prelude::*; +use crate::utils::AnyJsAssignmentLike; +use rome_formatter::write; +use rome_js_syntax::TsInitializedPropertySignatureClassMember; +#[derive(Debug, Clone, Default)] +pub(crate) struct FormatTsInitializedPropertySignatureClassMember; +impl FormatNodeRule + for FormatTsInitializedPropertySignatureClassMember +{ + fn fmt_fields( + &self, + node: &TsInitializedPropertySignatureClassMember, + f: &mut JsFormatter, + ) -> FormatResult<()> { + let semicolon_token = node.semicolon_token(); + + write!( + f, + [ + AnyJsAssignmentLike::from(node.clone()), + FormatClassPropertySemicolon::new( + &AnyJsPropertyClassMember::from(node.clone()), + semicolon_token.as_ref() + ) + ] + ) + } +} diff --git a/crates/rome_js_formatter/src/ts/classes/mod.rs b/crates/rome_js_formatter/src/ts/classes/mod.rs index c66c9d46c1a..dfd8eebf6bd 100644 --- a/crates/rome_js_formatter/src/ts/classes/mod.rs +++ b/crates/rome_js_formatter/src/ts/classes/mod.rs @@ -4,6 +4,7 @@ pub(crate) mod constructor_signature_class_member; pub(crate) mod extends_clause; pub(crate) mod getter_signature_class_member; pub(crate) mod index_signature_class_member; +pub(crate) mod initialized_property_signature_class_member; pub(crate) mod method_signature_class_member; pub(crate) mod property_signature_class_member; pub(crate) mod setter_signature_class_member; diff --git a/crates/rome_js_formatter/src/utils/assignment_like.rs b/crates/rome_js_formatter/src/utils/assignment_like.rs index ba3588b5397..60d4fcfb6d1 100644 --- a/crates/rome_js_formatter/src/utils/assignment_like.rs +++ b/crates/rome_js_formatter/src/utils/assignment_like.rs @@ -13,7 +13,8 @@ use rome_js_syntax::{ AnyTsVariableAnnotation, JsAssignmentExpression, JsInitializerClause, JsLiteralMemberName, JsObjectAssignmentPattern, JsObjectAssignmentPatternProperty, JsObjectBindingPattern, JsPropertyClassMember, JsPropertyClassMemberFields, JsPropertyObjectMember, JsSyntaxKind, - JsVariableDeclarator, TsIdentifierBinding, TsPropertySignatureClassMember, + JsVariableDeclarator, TsIdentifierBinding, TsInitializedPropertySignatureClassMember, + TsInitializedPropertySignatureClassMemberFields, TsPropertySignatureClassMember, TsPropertySignatureClassMemberFields, TsTypeAliasDeclaration, TsTypeArguments, }; use rome_rowan::{declare_node_union, AstNode, SyntaxNodeOptionExt, SyntaxResult}; @@ -27,7 +28,8 @@ declare_node_union! { JsVariableDeclarator | TsTypeAliasDeclaration | JsPropertyClassMember | - TsPropertySignatureClassMember + TsPropertySignatureClassMember | + TsInitializedPropertySignatureClassMember } declare_node_union! { @@ -337,6 +339,10 @@ impl AnyJsAssignmentLike { AnyJsAssignmentLike::TsPropertySignatureClassMember(_) => { unreachable!("TsPropertySignatureClassMember doesn't have any right side. If you're here, `has_only_left_hand_side` hasn't been called") } + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember(n) => { + // SAFETY: Calling `unwrap` here is safe because we check `has_only_left_hand_side` variant at the beginning of the `layout` function + n.value().unwrap().into() + } }; Ok(right) @@ -363,6 +369,9 @@ impl AnyJsAssignmentLike { AnyJsAssignmentLike::TsPropertySignatureClassMember( property_signature_class_member, ) => Ok(property_signature_class_member.name()?.into()), + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember( + property_signature_class_member, + ) => Ok(property_signature_class_member.name()?.into()), } } @@ -470,6 +479,26 @@ impl AnyJsAssignmentLike { (u8::from(f.options().tab_width()) + MIN_OVERLAP_FOR_BREAK) as usize; Ok(width < text_width_for_break) } + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember( + property_signature_class_member, + ) => { + let TsInitializedPropertySignatureClassMemberFields { + modifiers, + name, + question_mark_token, + value: _, + semicolon_token: _, + } = property_signature_class_member.as_fields(); + + write!(f, [modifiers.format(), space(),])?; + + let width = write_member_name(&name?.into(), f)?; + + write!(f, [question_mark_token.format()])?; + let text_width_for_break = + (u8::from(f.options().tab_width()) + MIN_OVERLAP_FOR_BREAK) as usize; + Ok(width < text_width_for_break) + } } } @@ -507,6 +536,13 @@ impl AnyJsAssignmentLike { } // this variant doesn't have any operator AnyJsAssignmentLike::TsPropertySignatureClassMember(_) => Ok(()), + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember( + property_class_member, + ) => { + let initializer = property_class_member.value()?; + let eq_token = initializer.eq_token()?; + write!(f, [space(), eq_token.format()]) + } } } @@ -574,12 +610,30 @@ impl AnyJsAssignmentLike { } // this variant doesn't have any right part AnyJsAssignmentLike::TsPropertySignatureClassMember(_) => Ok(()), + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember( + property_class_member, + ) => { + let initializer = property_class_member.value()?; + let expression = initializer.expression()?; + write!( + f, + [ + space(), + format_leading_comments(initializer.syntax()), + with_assignment_layout(&expression, Some(layout)), + format_trailing_comments(initializer.syntax()) + ] + ) + } } } fn write_suppressed_initializer(&self, f: &mut JsFormatter) -> FormatResult<()> { let initializer = match self { AnyJsAssignmentLike::JsPropertyClassMember(class_member) => class_member.value(), + AnyJsAssignmentLike::TsInitializedPropertySignatureClassMember(class_member) => { + Some(class_member.value()?) + } AnyJsAssignmentLike::JsVariableDeclarator(variable_declarator) => { variable_declarator.initializer() } diff --git a/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts b/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts new file mode 100644 index 00000000000..342e8bed4c9 --- /dev/null +++ b/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts @@ -0,0 +1,10 @@ +declare class A { + readonly prop = "value"; + + +} +export class B { + + declare readonly prop = "value__value__value__value__value__value__value"; + +} diff --git a/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts.snap b/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts.snap new file mode 100644 index 00000000000..c027d48e7ac --- /dev/null +++ b/crates/rome_js_formatter/tests/specs/ts/class/readonly_ambient_property.ts.snap @@ -0,0 +1,48 @@ +--- +source: crates/rome_formatter_test/src/snapshot_builder.rs +assertion_line: 212 +info: ts/class/readonly_ambient_property.ts +--- + +# Input + +```ts +declare class A { + readonly prop = "value"; + + +} +export class B { + + declare readonly prop = "value__value__value__value__value__value__value"; + +} + +``` + + +============================= + +# Outputs + +## Output 1 + +----- +Indent style: Tab +Line width: 80 +Quote style: Double Quotes +Quote properties: As needed +Trailing comma: All +Semicolons: Always +----- + +```ts +declare class A { + readonly prop = "value"; +} +export class B { + declare readonly prop = "value__value__value__value__value__value__value"; +} +``` + + diff --git a/crates/rome_js_parser/src/syntax/class.rs b/crates/rome_js_parser/src/syntax/class.rs index fdc278ec9dc..9c3d8b3fac6 100644 --- a/crates/rome_js_parser/src/syntax/class.rs +++ b/crates/rome_js_parser/src/syntax/class.rs @@ -901,7 +901,7 @@ fn parse_property_class_member_body( member_marker: Marker, modifiers: &ClassMemberModifiers, ) -> CompletedMarker { - parse_ts_property_annotation(p, modifiers).ok(); + let annotation = parse_ts_property_annotation(p, modifiers).ok(); // test class_await_property_initializer // // SCRIPT @@ -926,10 +926,12 @@ fn parse_property_class_member_body( expect_member_semi(p, &member_marker, "class property"); let is_signature = modifiers.is_signature() || p.state().in_ambient_context(); - let kind = if is_signature { - TS_PROPERTY_SIGNATURE_CLASS_MEMBER - } else { + let kind = if !is_signature { JS_PROPERTY_CLASS_MEMBER + } else if initializer_syntax.is_present() { + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER + } else { + TS_PROPERTY_SIGNATURE_CLASS_MEMBER }; let member = member_marker.complete(p, kind); @@ -945,13 +947,33 @@ fn parse_property_class_member_body( initializer.range(p), )); } else if modifiers.has(ModifierKind::Declare) || p.state().in_ambient_context() { - // test_err ts ts_property_initializer_ambient_context - // declare class A { prop = "test" } - // class B { declare prop = "test" } - p.error(p.err_builder( - "Initializers are not allowed in ambient contexts.", - initializer.range(p), - )); + // test ts ts_readonly_property_initializer_ambient_context + // declare class A { readonly prop = "test"; } + // class B { declare readonly prop = "test"; } + // declare class A { private readonly prop = "test"; } + // class B { declare private readonly prop = "test"; } + // declare class A { static readonly prop = "test"; } + // class B { declare static readonly prop = "test"; } + + if !modifiers.has(ModifierKind::Readonly) { + // test_err ts ts_property_initializer_ambient_context + // declare class A { prop = "test"; } + // class B { declare prop = "test"; } + + p.error(p.err_builder( + "In ambient contexts, properties with initializers need to be readonly.", + initializer.range(p), + )); + } else if let Some(annotation) = annotation { + // test_err ts ts_annotated_property_initializer_ambient_context + // declare class T { readonly b: string = "test"; } + // class T { declare readonly b: string = "test"; } + + p.error(p.err_builder( + "In ambient contexts, properties cannot have both a type annotation and an initializer.", + initializer.range(p), + ).detail(annotation.range(p), "The type annotation is here:")); + } } } @@ -1860,7 +1882,9 @@ impl ClassMemberModifiers { let list_kind = match member_kind { JS_PROPERTY_CLASS_MEMBER => JS_PROPERTY_MODIFIER_LIST, - TS_PROPERTY_SIGNATURE_CLASS_MEMBER => TS_PROPERTY_SIGNATURE_MODIFIER_LIST, + TS_PROPERTY_SIGNATURE_CLASS_MEMBER | TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER => { + TS_PROPERTY_SIGNATURE_MODIFIER_LIST + } JS_GETTER_CLASS_MEMBER | JS_SETTER_CLASS_MEMBER | JS_METHOD_CLASS_MEMBER => { JS_METHOD_MODIFIER_LIST } @@ -2075,6 +2099,7 @@ impl ClassMemberModifiers { member_kind, JS_PROPERTY_CLASS_MEMBER | TS_PROPERTY_SIGNATURE_CLASS_MEMBER + | TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER | TS_INDEX_SIGNATURE_CLASS_MEMBER | JS_BOGUS_MEMBER | TS_PROPERTY_PARAMETER @@ -2122,7 +2147,9 @@ impl ClassMemberModifiers { )); } else if !matches!( member_kind, - JS_PROPERTY_CLASS_MEMBER | TS_PROPERTY_SIGNATURE_CLASS_MEMBER + JS_PROPERTY_CLASS_MEMBER + | TS_PROPERTY_SIGNATURE_CLASS_MEMBER + | TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER ) { return Some(p.err_builder( "'declare' modifier is only allowed on properties.", @@ -2150,6 +2177,7 @@ impl ClassMemberModifiers { | TS_METHOD_SIGNATURE_CLASS_MEMBER | JS_PROPERTY_CLASS_MEMBER | TS_PROPERTY_SIGNATURE_CLASS_MEMBER + | TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER | JS_SETTER_CLASS_MEMBER | TS_SETTER_SIGNATURE_CLASS_MEMBER | JS_GETTER_CLASS_MEMBER diff --git a/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.rast b/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.rast new file mode 100644 index 00000000000..fb702b85ac9 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.rast @@ -0,0 +1,190 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + TsDeclareStatement { + declare_token: DECLARE_KW@0..8 "declare" [] [Whitespace(" ")], + declaration: JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@8..14 "class" [] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@14..16 "T" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@16..18 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + JsBogusMember { + items: [ + TsPropertySignatureModifierList [ + TsReadonlyModifier { + modifier_token: READONLY_KW@18..27 "readonly" [] [Whitespace(" ")], + }, + ], + JsLiteralMemberName { + value: IDENT@27..28 "b" [] [], + }, + TsTypeAnnotation { + colon_token: COLON@28..30 ":" [] [Whitespace(" ")], + ty: TsStringType { + string_token: STRING_KW@30..37 "string" [] [Whitespace(" ")], + }, + }, + JsInitializerClause { + eq_token: EQ@37..39 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@39..45 "\"test\"" [] [], + }, + }, + SEMICOLON@45..47 ";" [] [Whitespace(" ")], + ], + }, + ], + r_curly_token: R_CURLY@47..48 "}" [] [], + }, + }, + JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@48..55 "class" [Newline("\n")] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@55..57 "T" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@57..59 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + JsBogusMember { + items: [ + TsPropertySignatureModifierList [ + TsDeclareModifier { + modifier_token: DECLARE_KW@59..67 "declare" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@67..76 "readonly" [] [Whitespace(" ")], + }, + ], + JsLiteralMemberName { + value: IDENT@76..77 "b" [] [], + }, + TsTypeAnnotation { + colon_token: COLON@77..79 ":" [] [Whitespace(" ")], + ty: TsStringType { + string_token: STRING_KW@79..86 "string" [] [Whitespace(" ")], + }, + }, + JsInitializerClause { + eq_token: EQ@86..88 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@88..94 "\"test\"" [] [], + }, + }, + SEMICOLON@94..96 ";" [] [Whitespace(" ")], + ], + }, + ], + r_curly_token: R_CURLY@96..97 "}" [] [], + }, + ], + eof_token: EOF@97..98 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..98 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..97 + 0: TS_DECLARE_STATEMENT@0..48 + 0: DECLARE_KW@0..8 "declare" [] [Whitespace(" ")] + 1: JS_CLASS_DECLARATION@8..48 + 0: (empty) + 1: CLASS_KW@8..14 "class" [] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@14..16 + 0: IDENT@14..16 "T" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@16..18 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@18..47 + 0: JS_BOGUS_MEMBER@18..47 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@18..27 + 0: TS_READONLY_MODIFIER@18..27 + 0: READONLY_KW@18..27 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@27..28 + 0: IDENT@27..28 "b" [] [] + 2: TS_TYPE_ANNOTATION@28..37 + 0: COLON@28..30 ":" [] [Whitespace(" ")] + 1: TS_STRING_TYPE@30..37 + 0: STRING_KW@30..37 "string" [] [Whitespace(" ")] + 3: JS_INITIALIZER_CLAUSE@37..45 + 0: EQ@37..39 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@39..45 + 0: JS_STRING_LITERAL@39..45 "\"test\"" [] [] + 4: SEMICOLON@45..47 ";" [] [Whitespace(" ")] + 8: R_CURLY@47..48 "}" [] [] + 1: JS_CLASS_DECLARATION@48..97 + 0: (empty) + 1: CLASS_KW@48..55 "class" [Newline("\n")] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@55..57 + 0: IDENT@55..57 "T" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@57..59 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@59..96 + 0: JS_BOGUS_MEMBER@59..96 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@59..76 + 0: TS_DECLARE_MODIFIER@59..67 + 0: DECLARE_KW@59..67 "declare" [] [Whitespace(" ")] + 1: TS_READONLY_MODIFIER@67..76 + 0: READONLY_KW@67..76 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@76..77 + 0: IDENT@76..77 "b" [] [] + 2: TS_TYPE_ANNOTATION@77..86 + 0: COLON@77..79 ":" [] [Whitespace(" ")] + 1: TS_STRING_TYPE@79..86 + 0: STRING_KW@79..86 "string" [] [Whitespace(" ")] + 3: JS_INITIALIZER_CLAUSE@86..94 + 0: EQ@86..88 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@88..94 + 0: JS_STRING_LITERAL@88..94 "\"test\"" [] [] + 4: SEMICOLON@94..96 ";" [] [Whitespace(" ")] + 8: R_CURLY@96..97 "}" [] [] + 3: EOF@97..98 "" [Newline("\n")] [] +-- +ts_annotated_property_initializer_ambient_context.ts:1:38 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × In ambient contexts, properties cannot have both a type annotation and an initializer. + + > 1 │ declare class T { readonly b: string = "test"; } + │ ^^^^^^^^ + 2 │ class T { declare readonly b: string = "test"; } + 3 │ + + i The type annotation is here: + + > 1 │ declare class T { readonly b: string = "test"; } + │ ^^^^^^^^ + 2 │ class T { declare readonly b: string = "test"; } + 3 │ + +-- +ts_annotated_property_initializer_ambient_context.ts:2:38 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + + × In ambient contexts, properties cannot have both a type annotation and an initializer. + + 1 │ declare class T { readonly b: string = "test"; } + > 2 │ class T { declare readonly b: string = "test"; } + │ ^^^^^^^^ + 3 │ + + i The type annotation is here: + + 1 │ declare class T { readonly b: string = "test"; } + > 2 │ class T { declare readonly b: string = "test"; } + │ ^^^^^^^^ + 3 │ + +-- +declare class T { readonly b: string = "test"; } +class T { declare readonly b: string = "test"; } diff --git a/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.ts b/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.ts new file mode 100644 index 00000000000..77eb608be1b --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_annotated_property_initializer_ambient_context.ts @@ -0,0 +1,2 @@ +declare class T { readonly b: string = "test"; } +class T { declare readonly b: string = "test"; } diff --git a/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.rast b/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.rast index 08acfa7a318..9a00d4758ee 100644 --- a/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.rast +++ b/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.rast @@ -15,67 +15,67 @@ JsModule { implements_clause: missing (optional), l_curly_token: L_CURLY@16..18 "{" [] [Whitespace(" ")], members: JsClassMemberList [ - JsBogusMember { - items: [ - TsPropertySignatureModifierList [], - JsLiteralMemberName { - value: IDENT@18..23 "prop" [] [Whitespace(" ")], - }, - JsInitializerClause { - eq_token: EQ@23..25 "=" [] [Whitespace(" ")], - expression: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@25..32 "\"test\"" [] [Whitespace(" ")], - }, + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [], + name: JsLiteralMemberName { + value: IDENT@18..23 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@23..25 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@25..31 "\"test\"" [] [], }, - ], + }, + semicolon_token: SEMICOLON@31..33 ";" [] [Whitespace(" ")], }, ], - r_curly_token: R_CURLY@32..33 "}" [] [], + r_curly_token: R_CURLY@33..34 "}" [] [], }, }, JsClassDeclaration { abstract_token: missing (optional), - class_token: CLASS_KW@33..40 "class" [Newline("\n")] [Whitespace(" ")], + class_token: CLASS_KW@34..41 "class" [Newline("\n")] [Whitespace(" ")], id: JsIdentifierBinding { - name_token: IDENT@40..42 "B" [] [Whitespace(" ")], + name_token: IDENT@41..43 "B" [] [Whitespace(" ")], }, type_parameters: missing (optional), extends_clause: missing (optional), implements_clause: missing (optional), - l_curly_token: L_CURLY@42..44 "{" [] [Whitespace(" ")], + l_curly_token: L_CURLY@43..45 "{" [] [Whitespace(" ")], members: JsClassMemberList [ - JsBogusMember { - items: [ - TsPropertySignatureModifierList [ - TsDeclareModifier { - modifier_token: DECLARE_KW@44..52 "declare" [] [Whitespace(" ")], - }, - ], - JsLiteralMemberName { - value: IDENT@52..57 "prop" [] [Whitespace(" ")], - }, - JsInitializerClause { - eq_token: EQ@57..59 "=" [] [Whitespace(" ")], - expression: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@59..66 "\"test\"" [] [Whitespace(" ")], - }, + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsDeclareModifier { + modifier_token: DECLARE_KW@45..53 "declare" [] [Whitespace(" ")], }, ], + name: JsLiteralMemberName { + value: IDENT@53..58 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@58..60 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@60..66 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@66..68 ";" [] [Whitespace(" ")], }, ], - r_curly_token: R_CURLY@66..67 "}" [] [], + r_curly_token: R_CURLY@68..69 "}" [] [], }, ], - eof_token: EOF@67..68 "" [Newline("\n")] [], + eof_token: EOF@69..70 "" [Newline("\n")] [], } -0: JS_MODULE@0..68 +0: JS_MODULE@0..70 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..67 - 0: TS_DECLARE_STATEMENT@0..33 + 2: JS_MODULE_ITEM_LIST@0..69 + 0: TS_DECLARE_STATEMENT@0..34 0: DECLARE_KW@0..8 "declare" [] [Whitespace(" ")] - 1: JS_CLASS_DECLARATION@8..33 + 1: JS_CLASS_DECLARATION@8..34 0: (empty) 1: CLASS_KW@8..14 "class" [] [Whitespace(" ")] 2: JS_IDENTIFIER_BINDING@14..16 @@ -84,58 +84,62 @@ JsModule { 4: (empty) 5: (empty) 6: L_CURLY@16..18 "{" [] [Whitespace(" ")] - 7: JS_CLASS_MEMBER_LIST@18..32 - 0: JS_BOGUS_MEMBER@18..32 + 7: JS_CLASS_MEMBER_LIST@18..33 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@18..33 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@18..18 1: JS_LITERAL_MEMBER_NAME@18..23 0: IDENT@18..23 "prop" [] [Whitespace(" ")] - 2: JS_INITIALIZER_CLAUSE@23..32 + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@23..31 0: EQ@23..25 "=" [] [Whitespace(" ")] - 1: JS_STRING_LITERAL_EXPRESSION@25..32 - 0: JS_STRING_LITERAL@25..32 "\"test\"" [] [Whitespace(" ")] - 8: R_CURLY@32..33 "}" [] [] - 1: JS_CLASS_DECLARATION@33..67 + 1: JS_STRING_LITERAL_EXPRESSION@25..31 + 0: JS_STRING_LITERAL@25..31 "\"test\"" [] [] + 4: SEMICOLON@31..33 ";" [] [Whitespace(" ")] + 8: R_CURLY@33..34 "}" [] [] + 1: JS_CLASS_DECLARATION@34..69 0: (empty) - 1: CLASS_KW@33..40 "class" [Newline("\n")] [Whitespace(" ")] - 2: JS_IDENTIFIER_BINDING@40..42 - 0: IDENT@40..42 "B" [] [Whitespace(" ")] + 1: CLASS_KW@34..41 "class" [Newline("\n")] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@41..43 + 0: IDENT@41..43 "B" [] [Whitespace(" ")] 3: (empty) 4: (empty) 5: (empty) - 6: L_CURLY@42..44 "{" [] [Whitespace(" ")] - 7: JS_CLASS_MEMBER_LIST@44..66 - 0: JS_BOGUS_MEMBER@44..66 - 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@44..52 - 0: TS_DECLARE_MODIFIER@44..52 - 0: DECLARE_KW@44..52 "declare" [] [Whitespace(" ")] - 1: JS_LITERAL_MEMBER_NAME@52..57 - 0: IDENT@52..57 "prop" [] [Whitespace(" ")] - 2: JS_INITIALIZER_CLAUSE@57..66 - 0: EQ@57..59 "=" [] [Whitespace(" ")] - 1: JS_STRING_LITERAL_EXPRESSION@59..66 - 0: JS_STRING_LITERAL@59..66 "\"test\"" [] [Whitespace(" ")] - 8: R_CURLY@66..67 "}" [] [] - 3: EOF@67..68 "" [Newline("\n")] [] + 6: L_CURLY@43..45 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@45..68 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@45..68 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@45..53 + 0: TS_DECLARE_MODIFIER@45..53 + 0: DECLARE_KW@45..53 "declare" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@53..58 + 0: IDENT@53..58 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@58..66 + 0: EQ@58..60 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@60..66 + 0: JS_STRING_LITERAL@60..66 "\"test\"" [] [] + 4: SEMICOLON@66..68 ";" [] [Whitespace(" ")] + 8: R_CURLY@68..69 "}" [] [] + 3: EOF@69..70 "" [Newline("\n")] [] -- ts_property_initializer_ambient_context.ts:1:24 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Initializers are not allowed in ambient contexts. + × In ambient contexts, properties with initializers need to be readonly. - > 1 │ declare class A { prop = "test" } + > 1 │ declare class A { prop = "test"; } │ ^^^^^^^^ - 2 │ class B { declare prop = "test" } + 2 │ class B { declare prop = "test"; } 3 │ -- ts_property_initializer_ambient_context.ts:2:24 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ - × Initializers are not allowed in ambient contexts. + × In ambient contexts, properties with initializers need to be readonly. - 1 │ declare class A { prop = "test" } - > 2 │ class B { declare prop = "test" } + 1 │ declare class A { prop = "test"; } + > 2 │ class B { declare prop = "test"; } │ ^^^^^^^^ 3 │ -- -declare class A { prop = "test" } -class B { declare prop = "test" } +declare class A { prop = "test"; } +class B { declare prop = "test"; } diff --git a/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.ts b/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.ts index 927f55555d0..1a3aa841b54 100644 --- a/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.ts +++ b/crates/rome_js_parser/test_data/inline/err/ts_property_initializer_ambient_context.ts @@ -1,2 +1,2 @@ -declare class A { prop = "test" } -class B { declare prop = "test" } +declare class A { prop = "test"; } +class B { declare prop = "test"; } diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.rast b/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.rast new file mode 100644 index 00000000000..d04996aa4e6 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.rast @@ -0,0 +1,393 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + TsDeclareStatement { + declare_token: DECLARE_KW@0..8 "declare" [] [Whitespace(" ")], + declaration: JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@8..14 "class" [] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@14..16 "A" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@16..18 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsReadonlyModifier { + modifier_token: READONLY_KW@18..27 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@27..32 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@32..34 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@34..40 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@40..42 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@42..43 "}" [] [], + }, + }, + JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@43..50 "class" [Newline("\n")] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@50..52 "B" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@52..54 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsDeclareModifier { + modifier_token: DECLARE_KW@54..62 "declare" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@62..71 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@71..76 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@76..78 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@78..84 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@84..86 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@86..87 "}" [] [], + }, + TsDeclareStatement { + declare_token: DECLARE_KW@87..96 "declare" [Newline("\n")] [Whitespace(" ")], + declaration: JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@96..102 "class" [] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@102..104 "A" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@104..106 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsAccessibilityModifier { + modifier_token: PRIVATE_KW@106..114 "private" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@114..123 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@123..128 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@128..130 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@130..136 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@136..138 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@138..139 "}" [] [], + }, + }, + JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@139..146 "class" [Newline("\n")] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@146..148 "B" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@148..150 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsDeclareModifier { + modifier_token: DECLARE_KW@150..158 "declare" [] [Whitespace(" ")], + }, + TsAccessibilityModifier { + modifier_token: PRIVATE_KW@158..166 "private" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@166..175 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@175..180 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@180..182 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@182..188 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@188..190 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@190..191 "}" [] [], + }, + TsDeclareStatement { + declare_token: DECLARE_KW@191..200 "declare" [Newline("\n")] [Whitespace(" ")], + declaration: JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@200..206 "class" [] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@206..208 "A" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@208..210 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + JsStaticModifier { + modifier_token: STATIC_KW@210..217 "static" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@217..226 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@226..231 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@231..233 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@233..239 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@239..241 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@241..242 "}" [] [], + }, + }, + JsClassDeclaration { + abstract_token: missing (optional), + class_token: CLASS_KW@242..249 "class" [Newline("\n")] [Whitespace(" ")], + id: JsIdentifierBinding { + name_token: IDENT@249..251 "B" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + extends_clause: missing (optional), + implements_clause: missing (optional), + l_curly_token: L_CURLY@251..253 "{" [] [Whitespace(" ")], + members: JsClassMemberList [ + TsInitializedPropertySignatureClassMember { + modifiers: TsPropertySignatureModifierList [ + TsDeclareModifier { + modifier_token: DECLARE_KW@253..261 "declare" [] [Whitespace(" ")], + }, + JsStaticModifier { + modifier_token: STATIC_KW@261..268 "static" [] [Whitespace(" ")], + }, + TsReadonlyModifier { + modifier_token: READONLY_KW@268..277 "readonly" [] [Whitespace(" ")], + }, + ], + name: JsLiteralMemberName { + value: IDENT@277..282 "prop" [] [Whitespace(" ")], + }, + question_mark_token: missing (optional), + value: JsInitializerClause { + eq_token: EQ@282..284 "=" [] [Whitespace(" ")], + expression: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@284..290 "\"test\"" [] [], + }, + }, + semicolon_token: SEMICOLON@290..292 ";" [] [Whitespace(" ")], + }, + ], + r_curly_token: R_CURLY@292..293 "}" [] [], + }, + ], + eof_token: EOF@293..294 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..294 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..293 + 0: TS_DECLARE_STATEMENT@0..43 + 0: DECLARE_KW@0..8 "declare" [] [Whitespace(" ")] + 1: JS_CLASS_DECLARATION@8..43 + 0: (empty) + 1: CLASS_KW@8..14 "class" [] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@14..16 + 0: IDENT@14..16 "A" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@16..18 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@18..42 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@18..42 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@18..27 + 0: TS_READONLY_MODIFIER@18..27 + 0: READONLY_KW@18..27 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@27..32 + 0: IDENT@27..32 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@32..40 + 0: EQ@32..34 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@34..40 + 0: JS_STRING_LITERAL@34..40 "\"test\"" [] [] + 4: SEMICOLON@40..42 ";" [] [Whitespace(" ")] + 8: R_CURLY@42..43 "}" [] [] + 1: JS_CLASS_DECLARATION@43..87 + 0: (empty) + 1: CLASS_KW@43..50 "class" [Newline("\n")] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@50..52 + 0: IDENT@50..52 "B" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@52..54 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@54..86 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@54..86 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@54..71 + 0: TS_DECLARE_MODIFIER@54..62 + 0: DECLARE_KW@54..62 "declare" [] [Whitespace(" ")] + 1: TS_READONLY_MODIFIER@62..71 + 0: READONLY_KW@62..71 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@71..76 + 0: IDENT@71..76 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@76..84 + 0: EQ@76..78 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@78..84 + 0: JS_STRING_LITERAL@78..84 "\"test\"" [] [] + 4: SEMICOLON@84..86 ";" [] [Whitespace(" ")] + 8: R_CURLY@86..87 "}" [] [] + 2: TS_DECLARE_STATEMENT@87..139 + 0: DECLARE_KW@87..96 "declare" [Newline("\n")] [Whitespace(" ")] + 1: JS_CLASS_DECLARATION@96..139 + 0: (empty) + 1: CLASS_KW@96..102 "class" [] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@102..104 + 0: IDENT@102..104 "A" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@104..106 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@106..138 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@106..138 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@106..123 + 0: TS_ACCESSIBILITY_MODIFIER@106..114 + 0: PRIVATE_KW@106..114 "private" [] [Whitespace(" ")] + 1: TS_READONLY_MODIFIER@114..123 + 0: READONLY_KW@114..123 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@123..128 + 0: IDENT@123..128 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@128..136 + 0: EQ@128..130 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@130..136 + 0: JS_STRING_LITERAL@130..136 "\"test\"" [] [] + 4: SEMICOLON@136..138 ";" [] [Whitespace(" ")] + 8: R_CURLY@138..139 "}" [] [] + 3: JS_CLASS_DECLARATION@139..191 + 0: (empty) + 1: CLASS_KW@139..146 "class" [Newline("\n")] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@146..148 + 0: IDENT@146..148 "B" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@148..150 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@150..190 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@150..190 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@150..175 + 0: TS_DECLARE_MODIFIER@150..158 + 0: DECLARE_KW@150..158 "declare" [] [Whitespace(" ")] + 1: TS_ACCESSIBILITY_MODIFIER@158..166 + 0: PRIVATE_KW@158..166 "private" [] [Whitespace(" ")] + 2: TS_READONLY_MODIFIER@166..175 + 0: READONLY_KW@166..175 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@175..180 + 0: IDENT@175..180 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@180..188 + 0: EQ@180..182 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@182..188 + 0: JS_STRING_LITERAL@182..188 "\"test\"" [] [] + 4: SEMICOLON@188..190 ";" [] [Whitespace(" ")] + 8: R_CURLY@190..191 "}" [] [] + 4: TS_DECLARE_STATEMENT@191..242 + 0: DECLARE_KW@191..200 "declare" [Newline("\n")] [Whitespace(" ")] + 1: JS_CLASS_DECLARATION@200..242 + 0: (empty) + 1: CLASS_KW@200..206 "class" [] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@206..208 + 0: IDENT@206..208 "A" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@208..210 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@210..241 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@210..241 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@210..226 + 0: JS_STATIC_MODIFIER@210..217 + 0: STATIC_KW@210..217 "static" [] [Whitespace(" ")] + 1: TS_READONLY_MODIFIER@217..226 + 0: READONLY_KW@217..226 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@226..231 + 0: IDENT@226..231 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@231..239 + 0: EQ@231..233 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@233..239 + 0: JS_STRING_LITERAL@233..239 "\"test\"" [] [] + 4: SEMICOLON@239..241 ";" [] [Whitespace(" ")] + 8: R_CURLY@241..242 "}" [] [] + 5: JS_CLASS_DECLARATION@242..293 + 0: (empty) + 1: CLASS_KW@242..249 "class" [Newline("\n")] [Whitespace(" ")] + 2: JS_IDENTIFIER_BINDING@249..251 + 0: IDENT@249..251 "B" [] [Whitespace(" ")] + 3: (empty) + 4: (empty) + 5: (empty) + 6: L_CURLY@251..253 "{" [] [Whitespace(" ")] + 7: JS_CLASS_MEMBER_LIST@253..292 + 0: TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER@253..292 + 0: TS_PROPERTY_SIGNATURE_MODIFIER_LIST@253..277 + 0: TS_DECLARE_MODIFIER@253..261 + 0: DECLARE_KW@253..261 "declare" [] [Whitespace(" ")] + 1: JS_STATIC_MODIFIER@261..268 + 0: STATIC_KW@261..268 "static" [] [Whitespace(" ")] + 2: TS_READONLY_MODIFIER@268..277 + 0: READONLY_KW@268..277 "readonly" [] [Whitespace(" ")] + 1: JS_LITERAL_MEMBER_NAME@277..282 + 0: IDENT@277..282 "prop" [] [Whitespace(" ")] + 2: (empty) + 3: JS_INITIALIZER_CLAUSE@282..290 + 0: EQ@282..284 "=" [] [Whitespace(" ")] + 1: JS_STRING_LITERAL_EXPRESSION@284..290 + 0: JS_STRING_LITERAL@284..290 "\"test\"" [] [] + 4: SEMICOLON@290..292 ";" [] [Whitespace(" ")] + 8: R_CURLY@292..293 "}" [] [] + 3: EOF@293..294 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.ts b/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.ts new file mode 100644 index 00000000000..1c39226989d --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_readonly_property_initializer_ambient_context.ts @@ -0,0 +1,6 @@ +declare class A { readonly prop = "test"; } +class B { declare readonly prop = "test"; } +declare class A { private readonly prop = "test"; } +class B { declare private readonly prop = "test"; } +declare class A { static readonly prop = "test"; } +class B { declare static readonly prop = "test"; } diff --git a/crates/rome_js_syntax/src/generated/kind.rs b/crates/rome_js_syntax/src/generated/kind.rs index dd53cd9c970..08e4cf1f311 100644 --- a/crates/rome_js_syntax/src/generated/kind.rs +++ b/crates/rome_js_syntax/src/generated/kind.rs @@ -457,6 +457,7 @@ pub enum JsSyntaxKind { TS_DECLARE_STATEMENT, TS_INDEX_SIGNATURE_PARAMETER, TS_PROPERTY_SIGNATURE_CLASS_MEMBER, + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER, TS_PROPERTY_SIGNATURE_MODIFIER_LIST, TS_METHOD_SIGNATURE_CLASS_MEMBER, TS_METHOD_SIGNATURE_MODIFIER_LIST, diff --git a/crates/rome_js_syntax/src/generated/macros.rs b/crates/rome_js_syntax/src/generated/macros.rs index 300a8862c4b..8d54b095aac 100644 --- a/crates/rome_js_syntax/src/generated/macros.rs +++ b/crates/rome_js_syntax/src/generated/macros.rs @@ -934,6 +934,12 @@ macro_rules! map_syntax_node { let $pattern = unsafe { $crate::TsInferType::new_unchecked(node) }; $body } + $crate::JsSyntaxKind::TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER => { + let $pattern = unsafe { + $crate::TsInitializedPropertySignatureClassMember::new_unchecked(node) + }; + $body + } $crate::JsSyntaxKind::TS_INSTANTIATION_EXPRESSION => { let $pattern = unsafe { $crate::TsInstantiationExpression::new_unchecked(node) }; diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 68b4152c698..85b848fa87d 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -9491,6 +9491,58 @@ pub struct TsInferTypeFields { pub constraint: Option, } #[derive(Clone, PartialEq, Eq, Hash)] +pub struct TsInitializedPropertySignatureClassMember { + pub(crate) syntax: SyntaxNode, +} +impl TsInitializedPropertySignatureClassMember { + #[doc = r" Create an AstNode from a SyntaxNode without checking its kind"] + #[doc = r""] + #[doc = r" # Safety"] + #[doc = r" This function must be guarded with a call to [AstNode::can_cast]"] + #[doc = r" or a match on [SyntaxNode::kind]"] + #[inline] + pub const unsafe fn new_unchecked(syntax: SyntaxNode) -> Self { Self { syntax } } + pub fn as_fields(&self) -> TsInitializedPropertySignatureClassMemberFields { + TsInitializedPropertySignatureClassMemberFields { + modifiers: self.modifiers(), + name: self.name(), + question_mark_token: self.question_mark_token(), + value: self.value(), + semicolon_token: self.semicolon_token(), + } + } + pub fn modifiers(&self) -> TsPropertySignatureModifierList { + support::list(&self.syntax, 0usize) + } + pub fn name(&self) -> SyntaxResult { + support::required_node(&self.syntax, 1usize) + } + pub fn question_mark_token(&self) -> Option { + support::token(&self.syntax, 2usize) + } + pub fn value(&self) -> SyntaxResult { + support::required_node(&self.syntax, 3usize) + } + pub fn semicolon_token(&self) -> Option { support::token(&self.syntax, 4usize) } +} +#[cfg(feature = "serde")] +impl Serialize for TsInitializedPropertySignatureClassMember { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.as_fields().serialize(serializer) + } +} +#[cfg_attr(feature = "serde", derive(Serialize))] +pub struct TsInitializedPropertySignatureClassMemberFields { + pub modifiers: TsPropertySignatureModifierList, + pub name: SyntaxResult, + pub question_mark_token: Option, + pub value: SyntaxResult, + pub semicolon_token: Option, +} +#[derive(Clone, PartialEq, Eq, Hash)] pub struct TsInstantiationExpression { pub(crate) syntax: SyntaxNode, } @@ -12421,6 +12473,7 @@ pub enum AnyJsClassMember { TsConstructorSignatureClassMember(TsConstructorSignatureClassMember), TsGetterSignatureClassMember(TsGetterSignatureClassMember), TsIndexSignatureClassMember(TsIndexSignatureClassMember), + TsInitializedPropertySignatureClassMember(TsInitializedPropertySignatureClassMember), TsMethodSignatureClassMember(TsMethodSignatureClassMember), TsPropertySignatureClassMember(TsPropertySignatureClassMember), TsSetterSignatureClassMember(TsSetterSignatureClassMember), @@ -12496,6 +12549,14 @@ impl AnyJsClassMember { _ => None, } } + pub fn as_ts_initialized_property_signature_class_member( + &self, + ) -> Option<&TsInitializedPropertySignatureClassMember> { + match &self { + AnyJsClassMember::TsInitializedPropertySignatureClassMember(item) => Some(item), + _ => None, + } + } pub fn as_ts_method_signature_class_member(&self) -> Option<&TsMethodSignatureClassMember> { match &self { AnyJsClassMember::TsMethodSignatureClassMember(item) => Some(item), @@ -22697,6 +22758,45 @@ impl From for SyntaxNode { impl From for SyntaxElement { fn from(n: TsInferType) -> SyntaxElement { n.syntax.into() } } +impl AstNode for TsInitializedPropertySignatureClassMember { + type Language = Language; + const KIND_SET: SyntaxKindSet = SyntaxKindSet::from_raw(RawSyntaxKind( + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER as u16, + )); + fn can_cast(kind: SyntaxKind) -> bool { kind == TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER } + fn cast(syntax: SyntaxNode) -> Option { + if Self::can_cast(syntax.kind()) { + Some(Self { syntax }) + } else { + None + } + } + fn syntax(&self) -> &SyntaxNode { &self.syntax } + fn into_syntax(self) -> SyntaxNode { self.syntax } +} +impl std::fmt::Debug for TsInitializedPropertySignatureClassMember { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("TsInitializedPropertySignatureClassMember") + .field("modifiers", &self.modifiers()) + .field("name", &support::DebugSyntaxResult(self.name())) + .field( + "question_mark_token", + &support::DebugOptionalElement(self.question_mark_token()), + ) + .field("value", &support::DebugSyntaxResult(self.value())) + .field( + "semicolon_token", + &support::DebugOptionalElement(self.semicolon_token()), + ) + .finish() + } +} +impl From for SyntaxNode { + fn from(n: TsInitializedPropertySignatureClassMember) -> SyntaxNode { n.syntax } +} +impl From for SyntaxElement { + fn from(n: TsInitializedPropertySignatureClassMember) -> SyntaxElement { n.syntax.into() } +} impl AstNode for TsInstantiationExpression { type Language = Language; const KIND_SET: SyntaxKindSet = @@ -25795,6 +25895,11 @@ impl From for AnyJsClassMember { AnyJsClassMember::TsIndexSignatureClassMember(node) } } +impl From for AnyJsClassMember { + fn from(node: TsInitializedPropertySignatureClassMember) -> AnyJsClassMember { + AnyJsClassMember::TsInitializedPropertySignatureClassMember(node) + } +} impl From for AnyJsClassMember { fn from(node: TsMethodSignatureClassMember) -> AnyJsClassMember { AnyJsClassMember::TsMethodSignatureClassMember(node) @@ -25823,6 +25928,7 @@ impl AstNode for AnyJsClassMember { .union(TsConstructorSignatureClassMember::KIND_SET) .union(TsGetterSignatureClassMember::KIND_SET) .union(TsIndexSignatureClassMember::KIND_SET) + .union(TsInitializedPropertySignatureClassMember::KIND_SET) .union(TsMethodSignatureClassMember::KIND_SET) .union(TsPropertySignatureClassMember::KIND_SET) .union(TsSetterSignatureClassMember::KIND_SET); @@ -25840,6 +25946,7 @@ impl AstNode for AnyJsClassMember { | TS_CONSTRUCTOR_SIGNATURE_CLASS_MEMBER | TS_GETTER_SIGNATURE_CLASS_MEMBER | TS_INDEX_SIGNATURE_CLASS_MEMBER + | TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER | TS_METHOD_SIGNATURE_CLASS_MEMBER | TS_PROPERTY_SIGNATURE_CLASS_MEMBER | TS_SETTER_SIGNATURE_CLASS_MEMBER @@ -25886,6 +25993,11 @@ impl AstNode for AnyJsClassMember { syntax, }) } + TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER => { + AnyJsClassMember::TsInitializedPropertySignatureClassMember( + TsInitializedPropertySignatureClassMember { syntax }, + ) + } TS_METHOD_SIGNATURE_CLASS_MEMBER => { AnyJsClassMember::TsMethodSignatureClassMember(TsMethodSignatureClassMember { syntax, @@ -25918,6 +26030,7 @@ impl AstNode for AnyJsClassMember { AnyJsClassMember::TsConstructorSignatureClassMember(it) => &it.syntax, AnyJsClassMember::TsGetterSignatureClassMember(it) => &it.syntax, AnyJsClassMember::TsIndexSignatureClassMember(it) => &it.syntax, + AnyJsClassMember::TsInitializedPropertySignatureClassMember(it) => &it.syntax, AnyJsClassMember::TsMethodSignatureClassMember(it) => &it.syntax, AnyJsClassMember::TsPropertySignatureClassMember(it) => &it.syntax, AnyJsClassMember::TsSetterSignatureClassMember(it) => &it.syntax, @@ -25936,6 +26049,7 @@ impl AstNode for AnyJsClassMember { AnyJsClassMember::TsConstructorSignatureClassMember(it) => it.syntax, AnyJsClassMember::TsGetterSignatureClassMember(it) => it.syntax, AnyJsClassMember::TsIndexSignatureClassMember(it) => it.syntax, + AnyJsClassMember::TsInitializedPropertySignatureClassMember(it) => it.syntax, AnyJsClassMember::TsMethodSignatureClassMember(it) => it.syntax, AnyJsClassMember::TsPropertySignatureClassMember(it) => it.syntax, AnyJsClassMember::TsSetterSignatureClassMember(it) => it.syntax, @@ -25958,6 +26072,9 @@ impl std::fmt::Debug for AnyJsClassMember { AnyJsClassMember::TsConstructorSignatureClassMember(it) => std::fmt::Debug::fmt(it, f), AnyJsClassMember::TsGetterSignatureClassMember(it) => std::fmt::Debug::fmt(it, f), AnyJsClassMember::TsIndexSignatureClassMember(it) => std::fmt::Debug::fmt(it, f), + AnyJsClassMember::TsInitializedPropertySignatureClassMember(it) => { + std::fmt::Debug::fmt(it, f) + } AnyJsClassMember::TsMethodSignatureClassMember(it) => std::fmt::Debug::fmt(it, f), AnyJsClassMember::TsPropertySignatureClassMember(it) => std::fmt::Debug::fmt(it, f), AnyJsClassMember::TsSetterSignatureClassMember(it) => std::fmt::Debug::fmt(it, f), @@ -25978,6 +26095,7 @@ impl From for SyntaxNode { AnyJsClassMember::TsConstructorSignatureClassMember(it) => it.into(), AnyJsClassMember::TsGetterSignatureClassMember(it) => it.into(), AnyJsClassMember::TsIndexSignatureClassMember(it) => it.into(), + AnyJsClassMember::TsInitializedPropertySignatureClassMember(it) => it.into(), AnyJsClassMember::TsMethodSignatureClassMember(it) => it.into(), AnyJsClassMember::TsPropertySignatureClassMember(it) => it.into(), AnyJsClassMember::TsSetterSignatureClassMember(it) => it.into(), @@ -33432,6 +33550,11 @@ impl std::fmt::Display for TsInferType { std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for TsInitializedPropertySignatureClassMember { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for TsInstantiationExpression { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) diff --git a/crates/rome_js_syntax/src/generated/nodes_mut.rs b/crates/rome_js_syntax/src/generated/nodes_mut.rs index 1aeb5575ddd..c5f4b49dd14 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4700,6 +4700,38 @@ impl TsInferType { )) } } +impl TsInitializedPropertySignatureClassMember { + pub fn with_modifiers(self, element: TsPropertySignatureModifierList) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), + ) + } + pub fn with_name(self, element: AnyJsClassMemberName) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))), + ) + } + pub fn with_question_mark_token(self, element: Option) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(2usize..=2usize, once(element.map(|element| element.into()))), + ) + } + pub fn with_value(self, element: JsInitializerClause) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(3usize..=3usize, once(Some(element.into_syntax().into()))), + ) + } + pub fn with_semicolon_token(self, element: Option) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(4usize..=4usize, once(element.map(|element| element.into()))), + ) + } +} impl TsInstantiationExpression { pub fn with_expression(self, element: AnyJsExpression) -> Self { Self::unwrap_cast( diff --git a/crates/rome_js_syntax/src/union_ext.rs b/crates/rome_js_syntax/src/union_ext.rs index 873964933d4..50cd03f7474 100644 --- a/crates/rome_js_syntax/src/union_ext.rs +++ b/crates/rome_js_syntax/src/union_ext.rs @@ -105,6 +105,9 @@ impl AnyJsClassMember { AnyJsClassMember::TsIndexSignatureClassMember(_) => Ok(None), AnyJsClassMember::TsMethodSignatureClassMember(method) => method.name().map(Some), AnyJsClassMember::TsPropertySignatureClassMember(property) => property.name().map(Some), + AnyJsClassMember::TsInitializedPropertySignatureClassMember(property) => { + property.name().map(Some) + } AnyJsClassMember::TsSetterSignatureClassMember(setter) => setter.name().map(Some), } } diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 5beb8f3d6b6..1bd0b6f0688 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -634,6 +634,7 @@ AnyJsClassMember = | JsSetterClassMember | TsConstructorSignatureClassMember | TsPropertySignatureClassMember + | TsInitializedPropertySignatureClassMember | TsMethodSignatureClassMember | TsGetterSignatureClassMember | TsSetterSignatureClassMember @@ -725,6 +726,13 @@ TsPropertySignatureClassMember = property_annotation: AnyTsPropertySignatureAnnotation? ';'? +TsInitializedPropertySignatureClassMember = + modifiers: TsPropertySignatureModifierList + name: AnyJsClassMemberName + '?'? + value: JsInitializerClause + ';'? + TsPropertySignatureModifierList = AnyTsPropertySignatureModifier* AnyTsPropertySignatureModifier = diff --git a/xtask/codegen/src/kinds_src.rs b/xtask/codegen/src/kinds_src.rs index c198c51840a..f658358417f 100644 --- a/xtask/codegen/src/kinds_src.rs +++ b/xtask/codegen/src/kinds_src.rs @@ -477,6 +477,7 @@ pub const JS_KINDS_SRC: KindsSrc = KindsSrc { "TS_DECLARE_STATEMENT", "TS_INDEX_SIGNATURE_PARAMETER", "TS_PROPERTY_SIGNATURE_CLASS_MEMBER", + "TS_INITIALIZED_PROPERTY_SIGNATURE_CLASS_MEMBER", "TS_PROPERTY_SIGNATURE_MODIFIER_LIST", "TS_METHOD_SIGNATURE_CLASS_MEMBER", "TS_METHOD_SIGNATURE_MODIFIER_LIST",