From 3a40752851054ac2dad6fcf60a03a043ce7d6aff Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Fri, 2 Sep 2022 23:44:45 +0800 Subject: [PATCH 01/26] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20finish=20type=20of?= =?UTF-8?q?=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generated/node_factory.rs | 39 +++++++++++--- .../src/generated/syntax_factory.rs | 9 +++- .../src/syntax/typescript/types.rs | 37 +++++++++++++- .../test_data/inline/ok/ts_typeof_type.rast | 51 +++++++++++++++++-- .../test_data/inline/ok/ts_typeof_type.ts | 1 + crates/rome_js_syntax/src/generated/nodes.rs | 7 +++ .../rome_js_syntax/src/generated/nodes_mut.rs | 6 +++ xtask/codegen/js.ungram | 1 + 8 files changed, 137 insertions(+), 14 deletions(-) diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 0c3dc5d71da..4da7a030d29 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -6091,14 +6091,37 @@ pub fn ts_type_parameters( ], )) } -pub fn ts_typeof_type(typeof_token: SyntaxToken, expression_name: TsAnyName) -> TsTypeofType { - TsTypeofType::unwrap_cast(SyntaxNode::new_detached( - JsSyntaxKind::TS_TYPEOF_TYPE, - [ - Some(SyntaxElement::Token(typeof_token)), - Some(SyntaxElement::Node(expression_name.into_syntax())), - ], - )) +pub fn ts_typeof_type( + typeof_token: SyntaxToken, + expression_name: TsAnyName, +) -> TsTypeofTypeBuilder { + TsTypeofTypeBuilder { + typeof_token, + expression_name, + type_arguments: None, + } +} +pub struct TsTypeofTypeBuilder { + typeof_token: SyntaxToken, + expression_name: TsAnyName, + type_arguments: Option, +} +impl TsTypeofTypeBuilder { + pub fn with_type_arguments(mut self, type_arguments: TsTypeArguments) -> Self { + self.type_arguments = Some(type_arguments); + self + } + pub fn build(self) -> TsTypeofType { + TsTypeofType::unwrap_cast(SyntaxNode::new_detached( + JsSyntaxKind::TS_TYPEOF_TYPE, + [ + Some(SyntaxElement::Token(self.typeof_token)), + Some(SyntaxElement::Node(self.expression_name.into_syntax())), + self.type_arguments + .map(|token| SyntaxElement::Node(token.into_syntax())), + ], + )) + } } pub fn ts_undefined_type(undefined_token: SyntaxToken) -> TsUndefinedType { TsUndefinedType::unwrap_cast(SyntaxNode::new_detached( diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index 790ea62c5bf..ede70788498 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -9338,7 +9338,7 @@ impl SyntaxFactory for JsSyntaxFactory { } TS_TYPEOF_TYPE => { let mut elements = (&children).into_iter(); - let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); + let mut slots: RawNodeSlots<3usize> = RawNodeSlots::default(); let mut current_element = elements.next(); if let Some(element) = ¤t_element { if element.kind() == T![typeof] { @@ -9354,6 +9354,13 @@ impl SyntaxFactory for JsSyntaxFactory { } } slots.next_slot(); + if let Some(element) = ¤t_element { + if TsTypeArguments::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); if current_element.is_some() { return RawSyntaxNode::new( TS_TYPEOF_TYPE.to_unknown(), diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 388219f75f9..133a10727f4 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -517,6 +517,7 @@ pub(crate) fn parse_ts_name(p: &mut Parser) -> ParsedSyntax { // test ts ts_typeof_type // let a = "test"; // type B = typeof a; +// type T21 = typeof Array; fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { if !p.at(T![typeof]) { return Absent; @@ -525,6 +526,7 @@ fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { let m = p.start(); p.expect(T![typeof]); parse_ts_name(p).or_add_diagnostic(p, expected_identifier); + parse_ts_type_arguments(p).ok(); Present(m.complete(p, TS_TYPEOF_TYPE)) } @@ -1246,7 +1248,7 @@ pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyn p.re_lex(ReLexContext::TypeArgumentLessThan); let arguments = parse_ts_type_arguments_impl(p, false); - if p.last() == Some(T![>]) && matches!(p.cur(), T!['('] | BACKTICK) { + if p.last() == Some(T![>]) && can_follow_type_arguments_in_expr(p.cur()) { Ok(Present(arguments)) } else { Err(()) @@ -1255,6 +1257,39 @@ pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyn .unwrap_or(Absent) } +#[inline] +pub fn can_follow_type_arguments_in_expr(cur_kind: JsSyntaxKind) -> bool { + match cur_kind { + T!['('] + | BACKTICK + // These tokens can't follow in a call expression, nor can they start an + // expression. So, consider the type argument list part of an instantiation + // expression. + | T![,] + | T![.] + | T![?.] + | T![')'] + | T![']'] + | T![:] + | T![;] + | T![?] + | T![==] + | T![===] + | T![!=] + | T![!==] + | T![&&] + | T![||] + | T![??] + | T![^] + | T![&] + | T![|] + | T!['}'] + | EOF => true, + _ => false, + } +} + +// test ts ts_type_arguments pub(crate) fn parse_ts_type_arguments(p: &mut Parser) -> ParsedSyntax { // test ts ts_type_arguments_left_shift // type A = T; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast index 93303165869..0d2f3743497 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast @@ -34,17 +34,42 @@ JsModule { expression_name: JsReferenceIdentifier { value_token: IDENT@32..33 "a" [] [], }, + type_arguments: missing (optional), }, semicolon_token: SEMICOLON@33..34 ";" [] [], }, + TsTypeAliasDeclaration { + type_token: TYPE_KW@34..40 "type" [Newline("\n")] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@40..44 "T21" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + eq_token: EQ@44..46 "=" [] [Whitespace(" ")], + ty: TsTypeofType { + typeof_token: TYPEOF_KW@46..53 "typeof" [] [Whitespace(" ")], + expression_name: JsReferenceIdentifier { + value_token: IDENT@53..58 "Array" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@58..59 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@59..65 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@65..66 ">" [] [], + }, + }, + semicolon_token: SEMICOLON@66..68 ";" [] [Whitespace(" ")], + }, ], - eof_token: EOF@34..35 "" [Newline("\n")] [], + eof_token: EOF@68..69 "" [Newline("\n")] [], } -0: JS_MODULE@0..35 +0: JS_MODULE@0..69 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..34 + 2: JS_MODULE_ITEM_LIST@0..68 0: JS_VARIABLE_STATEMENT@0..15 0: JS_VARIABLE_DECLARATION@0..14 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -68,5 +93,23 @@ JsModule { 0: TYPEOF_KW@25..32 "typeof" [] [Whitespace(" ")] 1: JS_REFERENCE_IDENTIFIER@32..33 0: IDENT@32..33 "a" [] [] + 2: (empty) 5: SEMICOLON@33..34 ";" [] [] - 3: EOF@34..35 "" [Newline("\n")] [] + 2: TS_TYPE_ALIAS_DECLARATION@34..68 + 0: TYPE_KW@34..40 "type" [Newline("\n")] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@40..44 + 0: IDENT@40..44 "T21" [] [Whitespace(" ")] + 2: (empty) + 3: EQ@44..46 "=" [] [Whitespace(" ")] + 4: TS_TYPEOF_TYPE@46..66 + 0: TYPEOF_KW@46..53 "typeof" [] [Whitespace(" ")] + 1: JS_REFERENCE_IDENTIFIER@53..58 + 0: IDENT@53..58 "Array" [] [] + 2: TS_TYPE_ARGUMENTS@58..66 + 0: L_ANGLE@58..59 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@59..65 + 0: TS_STRING_TYPE@59..65 + 0: STRING_KW@59..65 "string" [] [] + 2: R_ANGLE@65..66 ">" [] [] + 5: SEMICOLON@66..68 ";" [] [Whitespace(" ")] + 3: EOF@68..69 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts index 6bc5223df33..b1b257c2751 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts @@ -1,2 +1,3 @@ let a = "test"; type B = typeof a; +type T21 = typeof Array; diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 076314e6f28..76a1fef434c 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -11705,6 +11705,7 @@ impl TsTypeofType { TsTypeofTypeFields { typeof_token: self.typeof_token(), expression_name: self.expression_name(), + type_arguments: self.type_arguments(), } } pub fn typeof_token(&self) -> SyntaxResult { @@ -11713,6 +11714,7 @@ impl TsTypeofType { pub fn expression_name(&self) -> SyntaxResult { support::required_node(&self.syntax, 1usize) } + pub fn type_arguments(&self) -> Option { support::node(&self.syntax, 2usize) } } #[cfg(feature = "serde")] impl Serialize for TsTypeofType { @@ -11727,6 +11729,7 @@ impl Serialize for TsTypeofType { pub struct TsTypeofTypeFields { pub typeof_token: SyntaxResult, pub expression_name: SyntaxResult, + pub type_arguments: Option, } #[derive(Clone, PartialEq, Eq, Hash)] pub struct TsUndefinedType { @@ -24308,6 +24311,10 @@ impl std::fmt::Debug for TsTypeofType { "expression_name", &support::DebugSyntaxResult(self.expression_name()), ) + .field( + "type_arguments", + &support::DebugOptionalElement(self.type_arguments()), + ) .finish() } } diff --git a/crates/rome_js_syntax/src/generated/nodes_mut.rs b/crates/rome_js_syntax/src/generated/nodes_mut.rs index baad0a1a56a..8f7abfd3db2 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -5740,6 +5740,12 @@ impl TsTypeofType { .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))), ) } + pub fn with_type_arguments(self, element: Option) -> Self { + Self::unwrap_cast(self.syntax.splice_slots( + 2usize..=2usize, + once(element.map(|element| element.into_syntax().into())), + )) + } } impl TsUndefinedType { pub fn with_undefined_token(self, element: SyntaxToken) -> Self { diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 8ecd7db14c8..6c9acde2b1e 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -1848,6 +1848,7 @@ TsAnyTypePredicateParameterName = TsTypeofType = 'typeof' expression_name: TsAnyName + type_arguments: TsTypeArguments? TsConstructorType = 'abstract'? From b5c0f29d0b61c1b59f31938a647f2f03abf15106 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 02:21:46 +0800 Subject: [PATCH 02/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20add=20more=20type?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generated/node_factory.rs | 12 +++ .../src/generated/syntax_factory.rs | 26 +++++ crates/rome_js_parser/src/syntax/expr.rs | 19 +++- .../src/syntax/typescript/types.rs | 5 +- .../ok/ts_instantiation_expressions.rast | 81 ++++++++++++++++ .../inline/ok/ts_instantiation_expressions.ts | 2 + crates/rome_js_syntax/src/generated/kind.rs | 1 + crates/rome_js_syntax/src/generated/macros.rs | 5 + crates/rome_js_syntax/src/generated/nodes.rs | 96 +++++++++++++++++++ .../rome_js_syntax/src/generated/nodes_mut.rs | 14 +++ xtask/codegen/js.ungram | 5 + xtask/codegen/src/kinds_src.rs | 1 + 12 files changed, 265 insertions(+), 2 deletions(-) create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 4da7a030d29..0822aef054d 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -4455,6 +4455,18 @@ pub fn ts_export_declare_clause( ], )) } +pub fn ts_expression_with_type_arguments( + expression: JsAnyExpression, + arguments: TsTypeArguments, +) -> TsExpressionWithTypeArguments { + TsExpressionWithTypeArguments::unwrap_cast(SyntaxNode::new_detached( + JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS, + [ + Some(SyntaxElement::Node(expression.into_syntax())), + Some(SyntaxElement::Node(arguments.into_syntax())), + ], + )) +} pub fn ts_extends_clause(extends_token: SyntaxToken, types: TsTypeList) -> TsExtendsClause { TsExtendsClause::unwrap_cast(SyntaxNode::new_detached( JsSyntaxKind::TS_EXTENDS_CLAUSE, diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index ede70788498..e990081f41a 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -6883,6 +6883,32 @@ impl SyntaxFactory for JsSyntaxFactory { } slots.into_node(TS_EXPORT_DECLARE_CLAUSE, children) } + TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { + let mut elements = (&children).into_iter(); + let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); + let mut current_element = elements.next(); + if let Some(element) = ¤t_element { + if JsAnyExpression::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if TsTypeArguments::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if current_element.is_some() { + return RawSyntaxNode::new( + TS_EXPRESSION_WITH_TYPE_ARGUMENTS.to_unknown(), + children.into_iter().map(Some), + ); + } + slots.into_node(TS_EXPRESSION_WITH_TYPE_ARGUMENTS, children) + } TS_EXTENDS_CLAUSE => { let mut elements = (&children).into_iter(); let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 14ac09989e5..923eed77334 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -7,6 +7,7 @@ use super::typescript::*; use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; +use crate::parser::rewrite_parser::RewriteCompletedMarker; use crate::parser::rewrite_parser::{RewriteMarker, RewriteParser}; use crate::parser::{expected_token, ParserProgress, RecoveryResult}; use crate::syntax::assignment::parse_assignment; @@ -650,13 +651,18 @@ fn parse_member_expression_rest( while !p.at(EOF) { progress.assert_progressing(p); + let mut could_try_parse_type_arguments = true; lhs = match p.cur() { - T![.] => parse_static_member_expression(p, lhs, T![.]).unwrap(), + T![.] => { + could_try_parse_type_arguments = false; + parse_static_member_expression(p, lhs, T![.]).unwrap() + } // Don't parse out `[` as a member expression because it may as well be the start of a computed class member T!['['] if !context.is_in_ts_decorator() => { parse_computed_member_expression(p, lhs, false).unwrap() } T![?.] if allow_optional_chain => { + could_try_parse_type_arguments = false; let completed = if p.nth_at(1, T!['[']) { parse_computed_member_expression(p, lhs, true).unwrap() } else if is_nth_at_any_name(p, 1) { @@ -675,6 +681,7 @@ fn parse_member_expression_rest( completed } T![!] if !p.has_preceding_line_break() => { + could_try_parse_type_arguments = false; // test ts ts_non_null_assertion_expression // let a = { b: {} }; // a!; @@ -699,12 +706,22 @@ fn parse_member_expression_rest( non_null } BACKTICK => { + could_try_parse_type_arguments = false; // test ts ts_optional_chain_call // (() => {})?.(); let m = lhs.precede(p); parse_template_literal(p, m, *in_optional_chain, true) } _ => break, + }; + if could_try_parse_type_arguments { + match parse_ts_type_arguments(p) { + Absent => {} + Present(_) => { + let new_marker = lhs.precede(p); + lhs = new_marker.complete(p, JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS); + } + }; } } diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 133a10727f4..826dc71883d 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1233,6 +1233,10 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { Present(m.complete(p, kind)) } +// test ts ts_instantiation_expressions +// let f1 = fx; +// let f2 = fx; +// let f3 = fx['test']; pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyntax { // Don't parse type arguments in JS because the syntax is ambiguous // https://github.com/microsoft/TypeScript/issues/36662 @@ -1289,7 +1293,6 @@ pub fn can_follow_type_arguments_in_expr(cur_kind: JsSyntaxKind) -> bool { } } -// test ts ts_type_arguments pub(crate) fn parse_ts_type_arguments(p: &mut Parser) -> ParsedSyntax { // test ts ts_type_arguments_left_shift // type A = T; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast new file mode 100644 index 00000000000..9a63221c275 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -0,0 +1,81 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: LET_KW@0..4 "let" [] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@4..7 "f1" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@7..9 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsComputedMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@9..11 "fx" [] [], + }, + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@11..12 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@12..18 "'test'" [] [], + }, + r_brack_token: R_BRACK@18..19 "]" [] [], + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@19..20 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@20..26 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@26..27 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@27..29 ";" [] [Whitespace(" ")], + }, + ], + eof_token: EOF@29..31 "" [Newline("\n"), Newline("\n")] [], +} + +0: JS_MODULE@0..31 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..29 + 0: JS_VARIABLE_STATEMENT@0..29 + 0: JS_VARIABLE_DECLARATION@0..27 + 0: LET_KW@0..4 "let" [] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@4..27 + 0: JS_VARIABLE_DECLARATOR@4..27 + 0: JS_IDENTIFIER_BINDING@4..7 + 0: IDENT@4..7 "f1" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@7..27 + 0: EQ@7..9 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@9..27 + 0: JS_COMPUTED_MEMBER_EXPRESSION@9..19 + 0: JS_IDENTIFIER_EXPRESSION@9..11 + 0: JS_REFERENCE_IDENTIFIER@9..11 + 0: IDENT@9..11 "fx" [] [] + 1: (empty) + 2: L_BRACK@11..12 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@12..18 + 0: JS_STRING_LITERAL@12..18 "'test'" [] [] + 4: R_BRACK@18..19 "]" [] [] + 1: TS_TYPE_ARGUMENTS@19..27 + 0: L_ANGLE@19..20 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@20..26 + 0: TS_STRING_TYPE@20..26 + 0: STRING_KW@20..26 "string" [] [] + 2: R_ANGLE@26..27 ">" [] [] + 1: SEMICOLON@27..29 ";" [] [Whitespace(" ")] + 3: EOF@29..31 "" [Newline("\n"), Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts new file mode 100644 index 00000000000..96a84b68930 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -0,0 +1,2 @@ +let f1 = fx['test']; + diff --git a/crates/rome_js_syntax/src/generated/kind.rs b/crates/rome_js_syntax/src/generated/kind.rs index 3a64f255ed9..ed3fa3f92e1 100644 --- a/crates/rome_js_syntax/src/generated/kind.rs +++ b/crates/rome_js_syntax/src/generated/kind.rs @@ -441,6 +441,7 @@ pub enum JsSyntaxKind { TS_NON_NULL_ASSERTION_EXPRESSION, TS_TYPE_ASSERTION_EXPRESSION, TS_AS_EXPRESSION, + TS_EXPRESSION_WITH_TYPE_ARGUMENTS, TS_ENUM_DECLARATION, TS_ENUM_MEMBER_LIST, TS_ENUM_MEMBER, diff --git a/crates/rome_js_syntax/src/generated/macros.rs b/crates/rome_js_syntax/src/generated/macros.rs index bbdc45266df..9d44e41e85e 100644 --- a/crates/rome_js_syntax/src/generated/macros.rs +++ b/crates/rome_js_syntax/src/generated/macros.rs @@ -848,6 +848,11 @@ macro_rules! map_syntax_node { let $pattern = unsafe { $crate::TsExportDeclareClause::new_unchecked(node) }; $body } + $crate::JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { + let $pattern = + unsafe { $crate::TsExpressionWithTypeArguments::new_unchecked(node) }; + $body + } $crate::JsSyntaxKind::TS_EXTENDS_CLAUSE => { let $pattern = unsafe { $crate::TsExtendsClause::new_unchecked(node) }; $body diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 76a1fef434c..62b42c12526 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -8601,6 +8601,45 @@ pub struct TsExportDeclareClauseFields { pub declaration: SyntaxResult, } #[derive(Clone, PartialEq, Eq, Hash)] +pub struct TsExpressionWithTypeArguments { + pub(crate) syntax: SyntaxNode, +} +impl TsExpressionWithTypeArguments { + #[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) -> TsExpressionWithTypeArgumentsFields { + TsExpressionWithTypeArgumentsFields { + expression: self.expression(), + arguments: self.arguments(), + } + } + pub fn expression(&self) -> SyntaxResult { + support::required_node(&self.syntax, 0usize) + } + pub fn arguments(&self) -> SyntaxResult { + support::required_node(&self.syntax, 1usize) + } +} +#[cfg(feature = "serde")] +impl Serialize for TsExpressionWithTypeArguments { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.as_fields().serialize(serializer) + } +} +#[cfg_attr(feature = "serde", derive(Serialize))] +pub struct TsExpressionWithTypeArgumentsFields { + pub expression: SyntaxResult, + pub arguments: SyntaxResult, +} +#[derive(Clone, PartialEq, Eq, Hash)] pub struct TsExtendsClause { pub(crate) syntax: SyntaxNode, } @@ -12673,6 +12712,7 @@ pub enum JsAnyExpression { JsxTagExpression(JsxTagExpression), NewTarget(NewTarget), TsAsExpression(TsAsExpression), + TsExpressionWithTypeArguments(TsExpressionWithTypeArguments), TsNonNullAssertionExpression(TsNonNullAssertionExpression), TsTypeAssertionExpression(TsTypeAssertionExpression), } @@ -12875,6 +12915,12 @@ impl JsAnyExpression { _ => None, } } + pub fn as_ts_expression_with_type_arguments(&self) -> Option<&TsExpressionWithTypeArguments> { + match &self { + JsAnyExpression::TsExpressionWithTypeArguments(item) => Some(item), + _ => None, + } + } pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { match &self { JsAnyExpression::TsNonNullAssertionExpression(item) => Some(item), @@ -21695,6 +21741,35 @@ impl From for SyntaxNode { impl From for SyntaxElement { fn from(n: TsExportDeclareClause) -> SyntaxElement { n.syntax.into() } } +impl AstNode for TsExpressionWithTypeArguments { + type Language = Language; + const KIND_SET: SyntaxKindSet = + SyntaxKindSet::from_raw(RawSyntaxKind(TS_EXPRESSION_WITH_TYPE_ARGUMENTS as u16)); + fn can_cast(kind: SyntaxKind) -> bool { kind == TS_EXPRESSION_WITH_TYPE_ARGUMENTS } + 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 TsExpressionWithTypeArguments { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("TsExpressionWithTypeArguments") + .field("expression", &support::DebugSyntaxResult(self.expression())) + .field("arguments", &support::DebugSyntaxResult(self.arguments())) + .finish() + } +} +impl From for SyntaxNode { + fn from(n: TsExpressionWithTypeArguments) -> SyntaxNode { n.syntax } +} +impl From for SyntaxElement { + fn from(n: TsExpressionWithTypeArguments) -> SyntaxElement { n.syntax.into() } +} impl AstNode for TsExtendsClause { type Language = Language; const KIND_SET: SyntaxKindSet = @@ -26582,6 +26657,11 @@ impl From for JsAnyExpression { impl From for JsAnyExpression { fn from(node: TsAsExpression) -> JsAnyExpression { JsAnyExpression::TsAsExpression(node) } } +impl From for JsAnyExpression { + fn from(node: TsExpressionWithTypeArguments) -> JsAnyExpression { + JsAnyExpression::TsExpressionWithTypeArguments(node) + } +} impl From for JsAnyExpression { fn from(node: TsNonNullAssertionExpression) -> JsAnyExpression { JsAnyExpression::TsNonNullAssertionExpression(node) @@ -26627,6 +26707,7 @@ impl AstNode for JsAnyExpression { .union(JsxTagExpression::KIND_SET) .union(NewTarget::KIND_SET) .union(TsAsExpression::KIND_SET) + .union(TsExpressionWithTypeArguments::KIND_SET) .union(TsNonNullAssertionExpression::KIND_SET) .union(TsTypeAssertionExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { @@ -26663,6 +26744,7 @@ impl AstNode for JsAnyExpression { | JSX_TAG_EXPRESSION | NEW_TARGET | TS_AS_EXPRESSION + | TS_EXPRESSION_WITH_TYPE_ARGUMENTS | TS_NON_NULL_ASSERTION_EXPRESSION | TS_TYPE_ASSERTION_EXPRESSION => true, k if JsAnyLiteralExpression::can_cast(k) => true, @@ -26737,6 +26819,11 @@ impl AstNode for JsAnyExpression { JSX_TAG_EXPRESSION => JsAnyExpression::JsxTagExpression(JsxTagExpression { syntax }), NEW_TARGET => JsAnyExpression::NewTarget(NewTarget { syntax }), TS_AS_EXPRESSION => JsAnyExpression::TsAsExpression(TsAsExpression { syntax }), + TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { + JsAnyExpression::TsExpressionWithTypeArguments(TsExpressionWithTypeArguments { + syntax, + }) + } TS_NON_NULL_ASSERTION_EXPRESSION => { JsAnyExpression::TsNonNullAssertionExpression(TsNonNullAssertionExpression { syntax, @@ -26790,6 +26877,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => &it.syntax, JsAnyExpression::NewTarget(it) => &it.syntax, JsAnyExpression::TsAsExpression(it) => &it.syntax, + JsAnyExpression::TsExpressionWithTypeArguments(it) => &it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => &it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => &it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.syntax(), @@ -26829,6 +26917,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => it.syntax, JsAnyExpression::NewTarget(it) => it.syntax, JsAnyExpression::TsAsExpression(it) => it.syntax, + JsAnyExpression::TsExpressionWithTypeArguments(it) => it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.into_syntax(), @@ -26871,6 +26960,7 @@ impl std::fmt::Debug for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::NewTarget(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsAsExpression(it) => std::fmt::Debug::fmt(it, f), + JsAnyExpression::TsExpressionWithTypeArguments(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsNonNullAssertionExpression(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsTypeAssertionExpression(it) => std::fmt::Debug::fmt(it, f), } @@ -26912,6 +27002,7 @@ impl From for SyntaxNode { JsAnyExpression::JsxTagExpression(it) => it.into(), JsAnyExpression::NewTarget(it) => it.into(), JsAnyExpression::TsAsExpression(it) => it.into(), + JsAnyExpression::TsExpressionWithTypeArguments(it) => it.into(), JsAnyExpression::TsNonNullAssertionExpression(it) => it.into(), JsAnyExpression::TsTypeAssertionExpression(it) => it.into(), } @@ -32817,6 +32908,11 @@ impl std::fmt::Display for TsExportDeclareClause { std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for TsExpressionWithTypeArguments { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for TsExtendsClause { 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 8f7abfd3db2..d43baa3620d 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4212,6 +4212,20 @@ impl TsExportDeclareClause { ) } } +impl TsExpressionWithTypeArguments { + pub fn with_expression(self, element: JsAnyExpression) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), + ) + } + pub fn with_arguments(self, element: TsTypeArguments) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))), + ) + } +} impl TsExtendsClause { pub fn with_extends_token(self, element: SyntaxToken) -> Self { Self::unwrap_cast( diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 6c9acde2b1e..bb64c1afae1 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -316,6 +316,7 @@ JsAnyExpression = | TsTypeAssertionExpression | TsAsExpression | TsNonNullAssertionExpression + | TsExpressionWithTypeArguments // JSX | JsxTagExpression @@ -2110,6 +2111,10 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression +TsExpressionWithTypeArguments = + expression: JsAnyExpression + arguments: TsTypeArguments + TsAsExpression = expression: JsAnyExpression 'as' diff --git a/xtask/codegen/src/kinds_src.rs b/xtask/codegen/src/kinds_src.rs index f6bf168e29a..6a54077a537 100644 --- a/xtask/codegen/src/kinds_src.rs +++ b/xtask/codegen/src/kinds_src.rs @@ -461,6 +461,7 @@ pub const JS_KINDS_SRC: KindsSrc = KindsSrc { "TS_NON_NULL_ASSERTION_EXPRESSION", "TS_TYPE_ASSERTION_EXPRESSION", "TS_AS_EXPRESSION", + "TS_EXPRESSION_WITH_TYPE_ARGUMENTS", "TS_ENUM_DECLARATION", "TS_ENUM_MEMBER_LIST", "TS_ENUM_MEMBER", From 28d0daf098bf63138c955f355305743fd1ffd3b9 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 18:41:23 +0800 Subject: [PATCH 03/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20finish=20parser?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/src/generated.rs | 32 ++++ .../src/js/any/expression.rs | 1 + crates/rome_js_formatter/src/parentheses.rs | 2 + .../expression_with_type_arguments.rs | 14 ++ .../src/ts/expressions/mod.rs | 1 + .../src/ts/types/typeof_type.rs | 1 + .../instantiation-expression/new.ts.snap | 43 ----- crates/rome_js_parser/src/syntax/expr.rs | 115 ++++++----- .../ok/ts_instantiation_expressions.rast | 181 ++++++++++++++---- .../inline/ok/ts_instantiation_expressions.ts | 5 +- 10 files changed, 268 insertions(+), 127 deletions(-) create mode 100644 crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs delete mode 100644 crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/new.ts.snap diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index e4e8cb29bc5..a91cc219b7f 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -2786,6 +2786,38 @@ impl IntoFormat for rome_js_syntax::TsNonNullAssertionEx FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: non_null_assertion_expression :: FormatTsNonNullAssertionExpression :: default ()) } } +impl FormatRule + for crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &rome_js_syntax::TsExpressionWithTypeArguments, + f: &mut JsFormatter, + ) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::TsExpressionWithTypeArguments { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::TsExpressionWithTypeArguments, + crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule :: new (self , crate :: ts :: expressions :: expression_with_type_arguments :: FormatTsExpressionWithTypeArguments :: default ()) + } +} +impl IntoFormat for rome_js_syntax::TsExpressionWithTypeArguments { + type Format = FormatOwnedWithRule< + rome_js_syntax::TsExpressionWithTypeArguments, + crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: expression_with_type_arguments :: FormatTsExpressionWithTypeArguments :: default ()) + } +} impl FormatRule for crate::jsx::expressions::tag_expression::FormatJsxTagExpression { diff --git a/crates/rome_js_formatter/src/js/any/expression.rs b/crates/rome_js_formatter/src/js/any/expression.rs index 7fa3b3e536e..4d50336fd40 100644 --- a/crates/rome_js_formatter/src/js/any/expression.rs +++ b/crates/rome_js_formatter/src/js/any/expression.rs @@ -42,6 +42,7 @@ impl FormatRule for FormatJsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(node) => node.format().fmt(f), JsAnyExpression::TsAsExpression(node) => node.format().fmt(f), JsAnyExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), + JsAnyExpression::TsExpressionWithTypeArguments(node) => node.format().fmt(f), JsAnyExpression::JsxTagExpression(node) => node.format().fmt(f), } } diff --git a/crates/rome_js_formatter/src/parentheses.rs b/crates/rome_js_formatter/src/parentheses.rs index fe053e32d2a..e25db6bc182 100644 --- a/crates/rome_js_formatter/src/parentheses.rs +++ b/crates/rome_js_formatter/src/parentheses.rs @@ -158,6 +158,7 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses() } + JsAnyExpression::TsExpressionWithTypeArguments(_) => todo!(), } } @@ -252,6 +253,7 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses_with_parent(parent) } + JsAnyExpression::TsExpressionWithTypeArguments(_) => todo!(), } } } diff --git a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs new file mode 100644 index 00000000000..144cb68c2dc --- /dev/null +++ b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs @@ -0,0 +1,14 @@ +use crate::prelude::*; +use rome_js_syntax::TsExpressionWithTypeArguments; +use rome_rowan::AstNode; +#[derive(Debug, Clone, Default)] +pub struct FormatTsExpressionWithTypeArguments; +impl FormatNodeRule for FormatTsExpressionWithTypeArguments { + fn fmt_fields( + &self, + node: &TsExpressionWithTypeArguments, + f: &mut JsFormatter, + ) -> FormatResult<()> { + format_verbatim_node(node.syntax()).fmt(f) + } +} diff --git a/crates/rome_js_formatter/src/ts/expressions/mod.rs b/crates/rome_js_formatter/src/ts/expressions/mod.rs index c5674577a5e..52a129b8a05 100644 --- a/crates/rome_js_formatter/src/ts/expressions/mod.rs +++ b/crates/rome_js_formatter/src/ts/expressions/mod.rs @@ -1,6 +1,7 @@ //! Generated file, do not edit by hand, see `xtask/codegen` pub(crate) mod as_expression; +pub(crate) mod expression_with_type_arguments; pub(crate) mod name_with_type_arguments; pub(crate) mod non_null_assertion_expression; pub(crate) mod template_chunk_element; diff --git a/crates/rome_js_formatter/src/ts/types/typeof_type.rs b/crates/rome_js_formatter/src/ts/types/typeof_type.rs index 666e6330363..a458c1f1c1c 100644 --- a/crates/rome_js_formatter/src/ts/types/typeof_type.rs +++ b/crates/rome_js_formatter/src/ts/types/typeof_type.rs @@ -10,6 +10,7 @@ pub struct FormatTsTypeofType; impl FormatNodeRule for FormatTsTypeofType { fn fmt_fields(&self, node: &TsTypeofType, f: &mut JsFormatter) -> FormatResult<()> { let TsTypeofTypeFields { + type_arguments: _, typeof_token, expression_name, } = node.as_fields(); diff --git a/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/new.ts.snap b/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/new.ts.snap deleted file mode 100644 index c84f28cafb6..00000000000 --- a/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/new.ts.snap +++ /dev/null @@ -1,43 +0,0 @@ ---- -source: crates/rome_js_formatter/tests/prettier_tests.rs ---- - -# Input - -```js -// new -new A; -``` - - -# Prettier differences - -```diff ---- Prettier -+++ Rome -@@ -1,2 +1,2 @@ - // new --new A(); -+new A; -``` - -# Output - -```js -// new -new A; -``` - - -# Errors -``` -error[SyntaxError]: expected an expression but instead found ';' - ┌─ new.ts:2:9 - │ -2 │ new A; - │ ^ Expected an expression here - - -``` - - diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 923eed77334..5f22731892a 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -651,18 +651,13 @@ fn parse_member_expression_rest( while !p.at(EOF) { progress.assert_progressing(p); - let mut could_try_parse_type_arguments = true; lhs = match p.cur() { - T![.] => { - could_try_parse_type_arguments = false; - parse_static_member_expression(p, lhs, T![.]).unwrap() - } + T![.] => parse_static_member_expression(p, lhs, T![.]).unwrap(), // Don't parse out `[` as a member expression because it may as well be the start of a computed class member T!['['] if !context.is_in_ts_decorator() => { parse_computed_member_expression(p, lhs, false).unwrap() } T![?.] if allow_optional_chain => { - could_try_parse_type_arguments = false; let completed = if p.nth_at(1, T!['[']) { parse_computed_member_expression(p, lhs, true).unwrap() } else if is_nth_at_any_name(p, 1) { @@ -681,7 +676,6 @@ fn parse_member_expression_rest( completed } T![!] if !p.has_preceding_line_break() => { - could_try_parse_type_arguments = false; // test ts ts_non_null_assertion_expression // let a = { b: {} }; // a!; @@ -706,23 +700,38 @@ fn parse_member_expression_rest( non_null } BACKTICK => { - could_try_parse_type_arguments = false; // test ts ts_optional_chain_call // (() => {})?.(); - let m = lhs.precede(p); + let m = match lhs.kind() { + TS_EXPRESSION_WITH_TYPE_ARGUMENTS => lhs.undo_completion(p), + _ => lhs.precede(p), + }; parse_template_literal(p, m, *in_optional_chain, true) } - _ => break, - }; - if could_try_parse_type_arguments { - match parse_ts_type_arguments(p) { - Absent => {} - Present(_) => { + _ => { + if let Present(_) = parse_ts_type_arguments_in_expression(p) { let new_marker = lhs.precede(p); lhs = new_marker.complete(p, JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS); - } - }; - } + continue; + // match p.cur() { + // BACKTICK => { + // let m = lhs.precede(p); + // lhs = parse_template_literal(p, m, *in_optional_chain, true); + // continue; + // } + // T!['('] => { + // let m = lhs.precede(p); + // parse_call_arguments(p).ok(); + // lhs = m.complete(p, JsSyntaxKind::JS_CALL_EXPRESSION); + // continue; + // } + // _ => { + // } + // } + }; + break; + } + }; } lhs @@ -758,27 +767,21 @@ fn parse_new_expr(p: &mut Parser, context: ExpressionContext) -> ParsedSyntax { return Present(m.complete(p, NEW_TARGET)); } - let expression = parse_primary_expression(p, context.and_ts_type_assertion_allowed(false)) - .or_add_diagnostic(p, expected_expression); - - if let Some(lhs) = expression { - parse_member_expression_rest(p, lhs, context, false, &mut false); + if let Some(lhs) = parse_primary_expression(p, context) + .or_add_diagnostic(p, expected_expression) + .map(|expr| parse_member_expression_rest(p, expr, context, false, &mut false)) + { + if let TS_EXPRESSION_WITH_TYPE_ARGUMENTS = lhs.kind() { + lhs.undo_completion(p).abandon(p) + }; } // test ts ts_new_with_type_arguments // class Test {} // new Test(); - let type_arguments = if TypeScript.is_supported(p) { - parse_ts_type_arguments_in_expression(p) - } else { - Absent - }; if p.at(T!['(']) { parse_call_arguments(p).unwrap(); - } else if let Present(type_arguments) = type_arguments { - let error = p.err_builder("A 'new' expression with type arguments must always be followed by a parenthesized argument list.").primary(type_arguments.range(p), ""); - p.error(error); } Present(m.complete(p, JS_NEW_EXPRESSION)) @@ -1662,15 +1665,17 @@ fn parse_call_expression_rest( loop { lhs = parse_member_expression_rest(p, lhs, context, true, &mut in_optional_chain); - if p.at(T![?.]) {} - if !matches!(p.cur(), T![?.] | T![<] | T![<<] | T!['(']) { break lhs; } // Cloning here is necessary because parsing out the type arguments may rewind in which // case we want to return the `lhs`. - let m = lhs.clone().precede(p); + let m = match lhs.kind() { + TS_EXPRESSION_WITH_TYPE_ARGUMENTS => lhs.clone().undo_completion(p), + _ => lhs.clone().precede(p), + }; + let start_pos = p.tokens.position(); let optional_chain_call = p.eat(T![?.]); in_optional_chain = in_optional_chain || optional_chain_call; @@ -1682,24 +1687,36 @@ fn parse_call_expression_rest( // (() => a)(); // type A = T; // a<(arg: T) => number, number, string>(); - if TypeScript.is_supported(p) && matches!(p.cur(), T![<] | T![<<]) { - // rewinds automatically if not a valid type arguments + // if TypeScript.is_supported(p) && matches!(p.cur(), T![<] | T![<<]) { + // // rewinds automatically if not a valid type arguments + // let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); + + // if type_arguments.is_some() { + // if p.at(BACKTICK) { + // // test ts ts_tagged_template_literal + // // html`abcd` + // // html`abcd`._string + // lhs = parse_template_literal(p, m, optional_chain_call, true); + // continue; + // } + + // parse_call_arguments(p).or_add_diagnostic(p, expected_parameters); + // lhs = m.complete(p, JS_CALL_EXPRESSION); + // continue; + // } + // } + let type_arguments = if optional_chain_call { let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); - - if type_arguments.is_some() { - if p.at(BACKTICK) { - // test ts ts_tagged_template_literal - // html`abcd` - // html`abcd`._string - lhs = parse_template_literal(p, m, optional_chain_call, true); - continue; - } - - parse_call_arguments(p).or_add_diagnostic(p, expected_parameters); - lhs = m.complete(p, JS_CALL_EXPRESSION); + if p.cur() == BACKTICK { + lhs = parse_template_literal(p, m, optional_chain_call, true); continue; } - } else if p.at(T!['(']) { + type_arguments + } else { + None + }; + + if type_arguments.is_some() || p.at(T!['(']) { parse_call_arguments(p) .expect("Expected parsed out arguments because the parser is positioned at '('"); lhs = m.complete(p, JS_CALL_EXPRESSION); diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index 9a63221c275..dcbe43e1b98 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -13,69 +13,184 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@7..9 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@9..11 "fx" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@11..12 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@12..18 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@18..19 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@19..21 ";" [] [Whitespace(" ")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: LET_KW@21..26 "let" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@26..29 "f2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@29..31 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@31..33 "fx" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@33..34 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@34..40 "string" [] [], + }, + COMMA@40..42 "," [] [Whitespace(" ")], + TsNumberType { + number_token: NUMBER_KW@42..48 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@48..49 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@49..51 ";" [] [Whitespace(" ")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: LET_KW@51..56 "let" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@56..59 "f3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@59..61 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsComputedMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@9..11 "fx" [] [], + value_token: IDENT@61..63 "fx" [] [], }, }, optional_chain_token: missing (optional), - l_brack_token: L_BRACK@11..12 "[" [] [], + l_brack_token: L_BRACK@63..64 "[" [] [], member: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@12..18 "'test'" [] [], + value_token: JS_STRING_LITERAL@64..70 "'test'" [] [], }, - r_brack_token: R_BRACK@18..19 "]" [] [], + r_brack_token: R_BRACK@70..71 "]" [] [], }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@19..20 "<" [] [], + l_angle_token: L_ANGLE@71..72 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsStringType { - string_token: STRING_KW@20..26 "string" [] [], + string_token: STRING_KW@72..78 "string" [] [], }, ], - r_angle_token: R_ANGLE@26..27 ">" [] [], + r_angle_token: R_ANGLE@78..79 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@27..29 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@79..81 ";" [] [Whitespace(" ")], }, ], - eof_token: EOF@29..31 "" [Newline("\n"), Newline("\n")] [], + eof_token: EOF@81..82 "" [Newline("\n")] [], } -0: JS_MODULE@0..31 +0: JS_MODULE@0..82 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..29 - 0: JS_VARIABLE_STATEMENT@0..29 - 0: JS_VARIABLE_DECLARATION@0..27 + 2: JS_MODULE_ITEM_LIST@0..81 + 0: JS_VARIABLE_STATEMENT@0..21 + 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@4..27 - 0: JS_VARIABLE_DECLARATOR@4..27 + 1: JS_VARIABLE_DECLARATOR_LIST@4..19 + 0: JS_VARIABLE_DECLARATOR@4..19 0: JS_IDENTIFIER_BINDING@4..7 0: IDENT@4..7 "f1" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@7..27 + 2: JS_INITIALIZER_CLAUSE@7..19 0: EQ@7..9 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@9..27 - 0: JS_COMPUTED_MEMBER_EXPRESSION@9..19 - 0: JS_IDENTIFIER_EXPRESSION@9..11 - 0: JS_REFERENCE_IDENTIFIER@9..11 - 0: IDENT@9..11 "fx" [] [] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@9..19 + 0: JS_IDENTIFIER_EXPRESSION@9..11 + 0: JS_REFERENCE_IDENTIFIER@9..11 + 0: IDENT@9..11 "fx" [] [] + 1: TS_TYPE_ARGUMENTS@11..19 + 0: L_ANGLE@11..12 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@12..18 + 0: TS_STRING_TYPE@12..18 + 0: STRING_KW@12..18 "string" [] [] + 2: R_ANGLE@18..19 ">" [] [] + 1: SEMICOLON@19..21 ";" [] [Whitespace(" ")] + 1: JS_VARIABLE_STATEMENT@21..51 + 0: JS_VARIABLE_DECLARATION@21..49 + 0: LET_KW@21..26 "let" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@26..49 + 0: JS_VARIABLE_DECLARATOR@26..49 + 0: JS_IDENTIFIER_BINDING@26..29 + 0: IDENT@26..29 "f2" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@29..49 + 0: EQ@29..31 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@31..49 + 0: JS_IDENTIFIER_EXPRESSION@31..33 + 0: JS_REFERENCE_IDENTIFIER@31..33 + 0: IDENT@31..33 "fx" [] [] + 1: TS_TYPE_ARGUMENTS@33..49 + 0: L_ANGLE@33..34 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@34..48 + 0: TS_STRING_TYPE@34..40 + 0: STRING_KW@34..40 "string" [] [] + 1: COMMA@40..42 "," [] [Whitespace(" ")] + 2: TS_NUMBER_TYPE@42..48 + 0: NUMBER_KW@42..48 "number" [] [] + 2: R_ANGLE@48..49 ">" [] [] + 1: SEMICOLON@49..51 ";" [] [Whitespace(" ")] + 2: JS_VARIABLE_STATEMENT@51..81 + 0: JS_VARIABLE_DECLARATION@51..79 + 0: LET_KW@51..56 "let" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@56..79 + 0: JS_VARIABLE_DECLARATOR@56..79 + 0: JS_IDENTIFIER_BINDING@56..59 + 0: IDENT@56..59 "f3" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@59..79 + 0: EQ@59..61 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@61..79 + 0: JS_COMPUTED_MEMBER_EXPRESSION@61..71 + 0: JS_IDENTIFIER_EXPRESSION@61..63 + 0: JS_REFERENCE_IDENTIFIER@61..63 + 0: IDENT@61..63 "fx" [] [] 1: (empty) - 2: L_BRACK@11..12 "[" [] [] - 3: JS_STRING_LITERAL_EXPRESSION@12..18 - 0: JS_STRING_LITERAL@12..18 "'test'" [] [] - 4: R_BRACK@18..19 "]" [] [] - 1: TS_TYPE_ARGUMENTS@19..27 - 0: L_ANGLE@19..20 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@20..26 - 0: TS_STRING_TYPE@20..26 - 0: STRING_KW@20..26 "string" [] [] - 2: R_ANGLE@26..27 ">" [] [] - 1: SEMICOLON@27..29 ";" [] [Whitespace(" ")] - 3: EOF@29..31 "" [Newline("\n"), Newline("\n")] [] + 2: L_BRACK@63..64 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@64..70 + 0: JS_STRING_LITERAL@64..70 "'test'" [] [] + 4: R_BRACK@70..71 "]" [] [] + 1: TS_TYPE_ARGUMENTS@71..79 + 0: L_ANGLE@71..72 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@72..78 + 0: TS_STRING_TYPE@72..78 + 0: STRING_KW@72..78 "string" [] [] + 2: R_ANGLE@78..79 ">" [] [] + 1: SEMICOLON@79..81 ";" [] [Whitespace(" ")] + 3: EOF@81..82 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 96a84b68930..4a18c1068bd 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -1,2 +1,3 @@ -let f1 = fx['test']; - +let f1 = fx; +let f2 = fx; +let f3 = fx['test']; From b8a4b899e3b17b680e79da5d6f9e19cde3d331e1 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 18:51:42 +0800 Subject: [PATCH 04/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 7 +- .../src/syntax/typescript/types.rs | 5 + .../ok/ts_instantiation_expressions.rast | 286 +++++++++++++++++- .../inline/ok/ts_instantiation_expressions.ts | 4 + 4 files changed, 295 insertions(+), 7 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 5f22731892a..4231dbbd3da 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -1687,15 +1687,13 @@ fn parse_call_expression_rest( // (() => a)(); // type A = T; // a<(arg: T) => number, number, string>(); + // if TypeScript.is_supported(p) && matches!(p.cur(), T![<] | T![<<]) { // // rewinds automatically if not a valid type arguments // let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); // if type_arguments.is_some() { // if p.at(BACKTICK) { - // // test ts ts_tagged_template_literal - // // html`abcd` - // // html`abcd`._string // lhs = parse_template_literal(p, m, optional_chain_call, true); // continue; // } @@ -1708,6 +1706,9 @@ fn parse_call_expression_rest( let type_arguments = if optional_chain_call { let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); if p.cur() == BACKTICK { + // test ts ts_tagged_template_literal + // html`abcd` + // html`abcd`._string lhs = parse_template_literal(p, m, optional_chain_call, true); continue; } diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 826dc71883d..da0087e0dc1 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1237,6 +1237,11 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // let f1 = fx; // let f2 = fx; // let f3 = fx['test']; +// const a2 = f.g; // () => number +// const a3 = f.g; // () => U +// const a4 = f.g; // () => number +// const a5 = f['g']; // () => number + pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyntax { // Don't parse type arguments in JS because the syntax is ambiguous // https://github.com/microsoft/TypeScript/issues/36662 diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index dcbe43e1b98..7c4ef78365a 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -113,14 +113,183 @@ JsModule { }, semicolon_token: SEMICOLON@79..81 ";" [] [Whitespace(" ")], }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@81..88 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@88..91 "a2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@91..93 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsStaticMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@93..94 "f" [] [], + }, + }, + operator_token: DOT@94..95 "." [] [], + member: JsName { + value_token: IDENT@95..96 "g" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@96..97 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@97..103 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@103..104 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@104..122 ";" [] [Whitespace(" "), Comments("// () => number")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@122..129 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@129..132 "a3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@132..134 "=" [] [Whitespace(" ")], + expression: JsStaticMemberExpression { + object: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@134..135 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@135..136 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@136..142 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@142..143 ">" [] [], + }, + }, + operator_token: DOT@143..144 "." [] [], + member: JsName { + value_token: IDENT@144..145 "g" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@145..161 ";" [] [Whitespace(" "), Comments("// () => U")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@161..168 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@168..171 "a4" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@171..173 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsStaticMemberExpression { + object: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@173..174 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@174..175 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@175..181 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@181..182 ">" [] [], + }, + }, + operator_token: DOT@182..183 "." [] [], + member: JsName { + value_token: IDENT@183..184 "g" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@184..185 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@185..191 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@191..192 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@192..210 ";" [] [Whitespace(" "), Comments("// () => number")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@210..217 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@217..220 "a5" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@220..222 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsComputedMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@222..223 "f" [] [], + }, + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@223..224 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@224..227 "'g'" [] [], + }, + r_brack_token: R_BRACK@227..228 "]" [] [], + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@228..229 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@229..235 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@235..236 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")], + }, ], - eof_token: EOF@81..82 "" [Newline("\n")] [], + eof_token: EOF@254..255 "" [Newline("\n")] [], } -0: JS_MODULE@0..82 +0: JS_MODULE@0..255 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..81 + 2: JS_MODULE_ITEM_LIST@0..254 0: JS_VARIABLE_STATEMENT@0..21 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -193,4 +362,113 @@ JsModule { 0: STRING_KW@72..78 "string" [] [] 2: R_ANGLE@78..79 ">" [] [] 1: SEMICOLON@79..81 ";" [] [Whitespace(" ")] - 3: EOF@81..82 "" [Newline("\n")] [] + 3: JS_VARIABLE_STATEMENT@81..122 + 0: JS_VARIABLE_DECLARATION@81..104 + 0: CONST_KW@81..88 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@88..104 + 0: JS_VARIABLE_DECLARATOR@88..104 + 0: JS_IDENTIFIER_BINDING@88..91 + 0: IDENT@88..91 "a2" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@91..104 + 0: EQ@91..93 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@93..104 + 0: JS_STATIC_MEMBER_EXPRESSION@93..96 + 0: JS_IDENTIFIER_EXPRESSION@93..94 + 0: JS_REFERENCE_IDENTIFIER@93..94 + 0: IDENT@93..94 "f" [] [] + 1: DOT@94..95 "." [] [] + 2: JS_NAME@95..96 + 0: IDENT@95..96 "g" [] [] + 1: TS_TYPE_ARGUMENTS@96..104 + 0: L_ANGLE@96..97 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@97..103 + 0: TS_NUMBER_TYPE@97..103 + 0: NUMBER_KW@97..103 "number" [] [] + 2: R_ANGLE@103..104 ">" [] [] + 1: SEMICOLON@104..122 ";" [] [Whitespace(" "), Comments("// () => number")] + 4: JS_VARIABLE_STATEMENT@122..161 + 0: JS_VARIABLE_DECLARATION@122..145 + 0: CONST_KW@122..129 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@129..145 + 0: JS_VARIABLE_DECLARATOR@129..145 + 0: JS_IDENTIFIER_BINDING@129..132 + 0: IDENT@129..132 "a3" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@132..145 + 0: EQ@132..134 "=" [] [Whitespace(" ")] + 1: JS_STATIC_MEMBER_EXPRESSION@134..145 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@134..143 + 0: JS_IDENTIFIER_EXPRESSION@134..135 + 0: JS_REFERENCE_IDENTIFIER@134..135 + 0: IDENT@134..135 "f" [] [] + 1: TS_TYPE_ARGUMENTS@135..143 + 0: L_ANGLE@135..136 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@136..142 + 0: TS_NUMBER_TYPE@136..142 + 0: NUMBER_KW@136..142 "number" [] [] + 2: R_ANGLE@142..143 ">" [] [] + 1: DOT@143..144 "." [] [] + 2: JS_NAME@144..145 + 0: IDENT@144..145 "g" [] [] + 1: SEMICOLON@145..161 ";" [] [Whitespace(" "), Comments("// () => U")] + 5: JS_VARIABLE_STATEMENT@161..210 + 0: JS_VARIABLE_DECLARATION@161..192 + 0: CONST_KW@161..168 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@168..192 + 0: JS_VARIABLE_DECLARATOR@168..192 + 0: JS_IDENTIFIER_BINDING@168..171 + 0: IDENT@168..171 "a4" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@171..192 + 0: EQ@171..173 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@173..192 + 0: JS_STATIC_MEMBER_EXPRESSION@173..184 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@173..182 + 0: JS_IDENTIFIER_EXPRESSION@173..174 + 0: JS_REFERENCE_IDENTIFIER@173..174 + 0: IDENT@173..174 "f" [] [] + 1: TS_TYPE_ARGUMENTS@174..182 + 0: L_ANGLE@174..175 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@175..181 + 0: TS_NUMBER_TYPE@175..181 + 0: NUMBER_KW@175..181 "number" [] [] + 2: R_ANGLE@181..182 ">" [] [] + 1: DOT@182..183 "." [] [] + 2: JS_NAME@183..184 + 0: IDENT@183..184 "g" [] [] + 1: TS_TYPE_ARGUMENTS@184..192 + 0: L_ANGLE@184..185 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@185..191 + 0: TS_NUMBER_TYPE@185..191 + 0: NUMBER_KW@185..191 "number" [] [] + 2: R_ANGLE@191..192 ">" [] [] + 1: SEMICOLON@192..210 ";" [] [Whitespace(" "), Comments("// () => number")] + 6: JS_VARIABLE_STATEMENT@210..254 + 0: JS_VARIABLE_DECLARATION@210..236 + 0: CONST_KW@210..217 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@217..236 + 0: JS_VARIABLE_DECLARATOR@217..236 + 0: JS_IDENTIFIER_BINDING@217..220 + 0: IDENT@217..220 "a5" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@220..236 + 0: EQ@220..222 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@222..236 + 0: JS_COMPUTED_MEMBER_EXPRESSION@222..228 + 0: JS_IDENTIFIER_EXPRESSION@222..223 + 0: JS_REFERENCE_IDENTIFIER@222..223 + 0: IDENT@222..223 "f" [] [] + 1: (empty) + 2: L_BRACK@223..224 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@224..227 + 0: JS_STRING_LITERAL@224..227 "'g'" [] [] + 4: R_BRACK@227..228 "]" [] [] + 1: TS_TYPE_ARGUMENTS@228..236 + 0: L_ANGLE@228..229 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@229..235 + 0: TS_NUMBER_TYPE@229..235 + 0: NUMBER_KW@229..235 "number" [] [] + 2: R_ANGLE@235..236 ">" [] [] + 1: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")] + 3: EOF@254..255 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 4a18c1068bd..383d02f9506 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -1,3 +1,7 @@ let f1 = fx; let f2 = fx; let f3 = fx['test']; +const a2 = f.g; // () => number +const a3 = f.g; // () => U +const a4 = f.g; // () => number +const a5 = f['g']; // () => number From 4301c2338ff160bc0384b06b9e1611e185c16ba3 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 19:06:42 +0800 Subject: [PATCH 05/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/syntax/typescript/types.rs | 5 + .../err/ts_instantiation_expressions1.rast | 90 +++++++++++ .../err/ts_instantiation_expressions1.ts | 1 + .../ok/ts_instantiation_expressions.rast | 152 +++++++++++++++++- .../inline/ok/ts_instantiation_expressions.ts | 2 + 5 files changed, 246 insertions(+), 4 deletions(-) create mode 100644 crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast create mode 100644 crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index da0087e0dc1..a8dc27c2225 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1241,6 +1241,11 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const a3 = f.g; // () => U // const a4 = f.g; // () => number // const a5 = f['g']; // () => number +// const a7 = (f)['g']; +// const a6 = f['g']; // type Error + +// test_err ts ts_instantiation_expressions1 +// const a8 = f; // Relational operator error pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyntax { // Don't parse type arguments in JS because the syntax is ambiguous diff --git a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast new file mode 100644 index 00000000000..879e4796e17 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast @@ -0,0 +1,90 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@0..6 "const" [] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@6..9 "a8" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@9..11 "=" [] [Whitespace(" ")], + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@11..12 "f" [] [], + }, + }, + operator_token: L_ANGLE@12..13 "<" [] [], + right: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@13..19 "number" [] [], + }, + }, + }, + operator_token: R_ANGLE@19..20 ">" [] [], + right: TsTypeAssertionExpression { + l_angle_token: L_ANGLE@20..21 "<" [] [], + ty: TsNumberType { + number_token: NUMBER_KW@21..27 "number" [] [], + }, + r_angle_token: R_ANGLE@27..28 ">" [] [], + expression: missing (required), + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@28..59 ";" [] [Whitespace(" "), Comments("// Relational operato ...")], + }, + ], + eof_token: EOF@59..60 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..60 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..59 + 0: JS_VARIABLE_STATEMENT@0..59 + 0: JS_VARIABLE_DECLARATION@0..28 + 0: CONST_KW@0..6 "const" [] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@6..28 + 0: JS_VARIABLE_DECLARATOR@6..28 + 0: JS_IDENTIFIER_BINDING@6..9 + 0: IDENT@6..9 "a8" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@9..28 + 0: EQ@9..11 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@11..28 + 0: JS_BINARY_EXPRESSION@11..19 + 0: JS_IDENTIFIER_EXPRESSION@11..12 + 0: JS_REFERENCE_IDENTIFIER@11..12 + 0: IDENT@11..12 "f" [] [] + 1: L_ANGLE@12..13 "<" [] [] + 2: JS_IDENTIFIER_EXPRESSION@13..19 + 0: JS_REFERENCE_IDENTIFIER@13..19 + 0: IDENT@13..19 "number" [] [] + 1: R_ANGLE@19..20 ">" [] [] + 2: TS_TYPE_ASSERTION_EXPRESSION@20..28 + 0: L_ANGLE@20..21 "<" [] [] + 1: TS_NUMBER_TYPE@21..27 + 0: NUMBER_KW@21..27 "number" [] [] + 2: R_ANGLE@27..28 ">" [] [] + 3: (empty) + 1: SEMICOLON@28..59 ";" [] [Whitespace(" "), Comments("// Relational operato ...")] + 3: EOF@59..60 "" [Newline("\n")] [] +-- +error[SyntaxError]: expected an expression but instead found ';' + ┌─ ts_instantiation_expressions1.ts:1:29 + │ +1 │ const a8 = f; // Relational operator error + │ ^ Expected an expression here + +-- +const a8 = f; // Relational operator error diff --git a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts new file mode 100644 index 00000000000..bfdc84ea8ad --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts @@ -0,0 +1 @@ +const a8 = f; // Relational operator error diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index 7c4ef78365a..bc3d8e2bdee 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -282,14 +282,101 @@ JsModule { }, semicolon_token: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")], }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@254..261 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@261..264 "a7" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@264..266 "=" [] [Whitespace(" ")], + expression: JsComputedMemberExpression { + object: JsParenthesizedExpression { + l_paren_token: L_PAREN@266..267 "(" [] [], + expression: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@267..268 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@268..269 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@269..275 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@275..276 ">" [] [], + }, + }, + r_paren_token: R_PAREN@276..277 ")" [] [], + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@277..278 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@278..281 "'g'" [] [], + }, + r_brack_token: R_BRACK@281..282 "]" [] [], + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@282..283 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@283..290 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@290..293 "a6" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@293..295 "=" [] [Whitespace(" ")], + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@295..296 "f" [] [], + }, + }, + operator_token: L_ANGLE@296..297 "<" [] [], + right: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@297..303 "number" [] [], + }, + }, + }, + operator_token: R_ANGLE@303..304 ">" [] [], + right: JsArrayExpression { + l_brack_token: L_BRACK@304..305 "[" [] [], + elements: JsArrayElementList [ + JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@305..308 "'g'" [] [], + }, + ], + r_brack_token: R_BRACK@308..309 "]" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")], + }, ], - eof_token: EOF@254..255 "" [Newline("\n")] [], + eof_token: EOF@325..326 "" [Newline("\n")] [], } -0: JS_MODULE@0..255 +0: JS_MODULE@0..326 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..254 + 2: JS_MODULE_ITEM_LIST@0..325 0: JS_VARIABLE_STATEMENT@0..21 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -471,4 +558,61 @@ JsModule { 0: NUMBER_KW@229..235 "number" [] [] 2: R_ANGLE@235..236 ">" [] [] 1: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")] - 3: EOF@254..255 "" [Newline("\n")] [] + 7: JS_VARIABLE_STATEMENT@254..283 + 0: JS_VARIABLE_DECLARATION@254..282 + 0: CONST_KW@254..261 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@261..282 + 0: JS_VARIABLE_DECLARATOR@261..282 + 0: JS_IDENTIFIER_BINDING@261..264 + 0: IDENT@261..264 "a7" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@264..282 + 0: EQ@264..266 "=" [] [Whitespace(" ")] + 1: JS_COMPUTED_MEMBER_EXPRESSION@266..282 + 0: JS_PARENTHESIZED_EXPRESSION@266..277 + 0: L_PAREN@266..267 "(" [] [] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@267..276 + 0: JS_IDENTIFIER_EXPRESSION@267..268 + 0: JS_REFERENCE_IDENTIFIER@267..268 + 0: IDENT@267..268 "f" [] [] + 1: TS_TYPE_ARGUMENTS@268..276 + 0: L_ANGLE@268..269 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@269..275 + 0: TS_NUMBER_TYPE@269..275 + 0: NUMBER_KW@269..275 "number" [] [] + 2: R_ANGLE@275..276 ">" [] [] + 2: R_PAREN@276..277 ")" [] [] + 1: (empty) + 2: L_BRACK@277..278 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@278..281 + 0: JS_STRING_LITERAL@278..281 "'g'" [] [] + 4: R_BRACK@281..282 "]" [] [] + 1: SEMICOLON@282..283 ";" [] [] + 8: JS_VARIABLE_STATEMENT@283..325 + 0: JS_VARIABLE_DECLARATION@283..309 + 0: CONST_KW@283..290 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@290..309 + 0: JS_VARIABLE_DECLARATOR@290..309 + 0: JS_IDENTIFIER_BINDING@290..293 + 0: IDENT@290..293 "a6" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@293..309 + 0: EQ@293..295 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@295..309 + 0: JS_BINARY_EXPRESSION@295..303 + 0: JS_IDENTIFIER_EXPRESSION@295..296 + 0: JS_REFERENCE_IDENTIFIER@295..296 + 0: IDENT@295..296 "f" [] [] + 1: L_ANGLE@296..297 "<" [] [] + 2: JS_IDENTIFIER_EXPRESSION@297..303 + 0: JS_REFERENCE_IDENTIFIER@297..303 + 0: IDENT@297..303 "number" [] [] + 1: R_ANGLE@303..304 ">" [] [] + 2: JS_ARRAY_EXPRESSION@304..309 + 0: L_BRACK@304..305 "[" [] [] + 1: JS_ARRAY_ELEMENT_LIST@305..308 + 0: JS_STRING_LITERAL_EXPRESSION@305..308 + 0: JS_STRING_LITERAL@305..308 "'g'" [] [] + 2: R_BRACK@308..309 "]" [] [] + 1: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")] + 3: EOF@325..326 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 383d02f9506..ca199eee85c 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -5,3 +5,5 @@ const a2 = f.g; // () => number const a3 = f.g; // () => U const a4 = f.g; // () => number const a5 = f['g']; // () => number +const a7 = (f)['g']; +const a6 = f['g']; // type Error From b4818b73fb63a672e70e70ce4f2e58c2248325d8 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 19:11:39 +0800 Subject: [PATCH 06/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/typescript/types.rs | 3 +++ .../test_data/inline/ok/ts_instantiation_expressions.ts | 1 + 2 files changed, 4 insertions(+) diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index a8dc27c2225..1f4e406bbe6 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1243,6 +1243,9 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const a5 = f['g']; // () => number // const a7 = (f)['g']; // const a6 = f['g']; // type Error +// const b2 = f?.(); +// const b3 = f?.(); + // test_err ts ts_instantiation_expressions1 // const a8 = f; // Relational operator error diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index ca199eee85c..7cc152c6526 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -7,3 +7,4 @@ const a4 = f.g; // () => number const a5 = f['g']; // () => number const a7 = (f)['g']; const a6 = f['g']; // type Error +const b2 = f?.(); From db31173d58a5ff7dc63f5ea9aae5d6361cde9ccc Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 19:11:52 +0800 Subject: [PATCH 07/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ok/ts_instantiation_expressions.rast | 73 ++++++++++++++++++- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index bc3d8e2bdee..c2e9e71fbf4 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -369,14 +369,53 @@ JsModule { }, semicolon_token: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")], }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@325..332 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@332..335 "b2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@335..337 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@337..338 "f" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@338..340 "?." [] [], + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@340..341 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@341..347 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@347..348 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@348..349 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@349..350 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@350..351 ";" [] [], + }, ], - eof_token: EOF@325..326 "" [Newline("\n")] [], + eof_token: EOF@351..352 "" [Newline("\n")] [], } -0: JS_MODULE@0..326 +0: JS_MODULE@0..352 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..325 + 2: JS_MODULE_ITEM_LIST@0..351 0: JS_VARIABLE_STATEMENT@0..21 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -615,4 +654,30 @@ JsModule { 0: JS_STRING_LITERAL@305..308 "'g'" [] [] 2: R_BRACK@308..309 "]" [] [] 1: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")] - 3: EOF@325..326 "" [Newline("\n")] [] + 9: JS_VARIABLE_STATEMENT@325..351 + 0: JS_VARIABLE_DECLARATION@325..350 + 0: CONST_KW@325..332 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@332..350 + 0: JS_VARIABLE_DECLARATOR@332..350 + 0: JS_IDENTIFIER_BINDING@332..335 + 0: IDENT@332..335 "b2" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@335..350 + 0: EQ@335..337 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@337..350 + 0: JS_IDENTIFIER_EXPRESSION@337..338 + 0: JS_REFERENCE_IDENTIFIER@337..338 + 0: IDENT@337..338 "f" [] [] + 1: QUESTIONDOT@338..340 "?." [] [] + 2: TS_TYPE_ARGUMENTS@340..348 + 0: L_ANGLE@340..341 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@341..347 + 0: TS_NUMBER_TYPE@341..347 + 0: NUMBER_KW@341..347 "number" [] [] + 2: R_ANGLE@347..348 ">" [] [] + 3: JS_CALL_ARGUMENTS@348..350 + 0: L_PAREN@348..349 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@349..349 + 2: R_PAREN@349..350 ")" [] [] + 1: SEMICOLON@350..351 ";" [] [] + 3: EOF@351..352 "" [Newline("\n")] [] From 76fa9b203bf8fe9cf0c39bf2e6e340b55f21332b Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 19:26:12 +0800 Subject: [PATCH 08/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 8 +- .../src/syntax/typescript/types.rs | 5 +- .../err/ts_instantiation_expressions1.rast | 74 ++++++++++++++++++- .../err/ts_instantiation_expressions1.ts | 1 + .../ok/ts_instantiation_expressions.rast | 6 +- .../inline/ok/ts_instantiation_expressions.ts | 2 + 6 files changed, 86 insertions(+), 10 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 4231dbbd3da..0e6af5c0fd6 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -7,6 +7,8 @@ use super::typescript::*; use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; +use crate::parser::ToDiagnostic; +use crate::parser::expected_node; use crate::parser::rewrite_parser::RewriteCompletedMarker; use crate::parser::rewrite_parser::{RewriteMarker, RewriteParser}; use crate::parser::{expected_token, ParserProgress, RecoveryResult}; @@ -1718,8 +1720,10 @@ fn parse_call_expression_rest( }; if type_arguments.is_some() || p.at(T!['(']) { - parse_call_arguments(p) - .expect("Expected parsed out arguments because the parser is positioned at '('"); + parse_call_arguments(p).or_add_diagnostic(p, |p, range| { + expected_node("(", range).to_diagnostic(p) + }); + // .expect("Expected parsed out arguments because the parser is positioned at '('"); lhs = m.complete(p, JS_CALL_EXPRESSION); continue; } diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 1f4e406bbe6..4af92b9d0b9 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1244,11 +1244,14 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const a7 = (f)['g']; // const a6 = f['g']; // type Error // const b2 = f?.(); -// const b3 = f?.(); +// // const b3 = f?.(); +// // const b4 = f?.(); // Type Error, expected no type arguments // test_err ts ts_instantiation_expressions1 // const a8 = f; // Relational operator error +// const b1 = f?.; // Error, `(` expected + pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyntax { // Don't parse type arguments in JS because the syntax is ambiguous diff --git a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast index 879e4796e17..d19533171fc 100644 --- a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast @@ -43,14 +43,49 @@ JsModule { }, semicolon_token: SEMICOLON@28..59 ";" [] [Whitespace(" "), Comments("// Relational operato ...")], }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@59..66 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@66..69 "b1" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@69..71 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@71..72 "f" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@72..74 "?." [] [], + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@74..75 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@75..81 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@81..82 ">" [] [], + }, + arguments: missing (required), + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@82..107 ";" [] [Whitespace(" "), Comments("// Error, `(` expected")], + }, ], - eof_token: EOF@59..60 "" [Newline("\n")] [], + eof_token: EOF@107..108 "" [Newline("\n")] [], } -0: JS_MODULE@0..60 +0: JS_MODULE@0..108 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..59 + 2: JS_MODULE_ITEM_LIST@0..107 0: JS_VARIABLE_STATEMENT@0..59 0: JS_VARIABLE_DECLARATION@0..28 0: CONST_KW@0..6 "const" [] [Whitespace(" ")] @@ -78,7 +113,30 @@ JsModule { 2: R_ANGLE@27..28 ">" [] [] 3: (empty) 1: SEMICOLON@28..59 ";" [] [Whitespace(" "), Comments("// Relational operato ...")] - 3: EOF@59..60 "" [Newline("\n")] [] + 1: JS_VARIABLE_STATEMENT@59..107 + 0: JS_VARIABLE_DECLARATION@59..82 + 0: CONST_KW@59..66 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@66..82 + 0: JS_VARIABLE_DECLARATOR@66..82 + 0: JS_IDENTIFIER_BINDING@66..69 + 0: IDENT@66..69 "b1" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@69..82 + 0: EQ@69..71 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@71..82 + 0: JS_IDENTIFIER_EXPRESSION@71..72 + 0: JS_REFERENCE_IDENTIFIER@71..72 + 0: IDENT@71..72 "f" [] [] + 1: QUESTIONDOT@72..74 "?." [] [] + 2: TS_TYPE_ARGUMENTS@74..82 + 0: L_ANGLE@74..75 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@75..81 + 0: TS_NUMBER_TYPE@75..81 + 0: NUMBER_KW@75..81 "number" [] [] + 2: R_ANGLE@81..82 ">" [] [] + 3: (empty) + 1: SEMICOLON@82..107 ";" [] [Whitespace(" "), Comments("// Error, `(` expected")] + 3: EOF@107..108 "" [Newline("\n")] [] -- error[SyntaxError]: expected an expression but instead found ';' ┌─ ts_instantiation_expressions1.ts:1:29 @@ -86,5 +144,13 @@ error[SyntaxError]: expected an expression but instead found ';' 1 │ const a8 = f; // Relational operator error │ ^ Expected an expression here +-- +error[SyntaxError]: expected a ( but instead found ';' + ┌─ ts_instantiation_expressions1.ts:2:23 + │ +2 │ const b1 = f?.; // Error, `(` expected + │ ^ Expected a ( here + -- const a8 = f; // Relational operator error +const b1 = f?.; // Error, `(` expected diff --git a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts index bfdc84ea8ad..3f80de13b1b 100644 --- a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts @@ -1 +1,2 @@ const a8 = f; // Relational operator error +const b1 = f?.; // Error, `(` expected diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index c2e9e71fbf4..261a0168c9d 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -409,10 +409,10 @@ JsModule { semicolon_token: SEMICOLON@350..351 ";" [] [], }, ], - eof_token: EOF@351..352 "" [Newline("\n")] [], + eof_token: EOF@351..381 "" [Newline("\n"), Comments("// const b3 = f; // () => number const a7 = (f)['g']; const a6 = f['g']; // type Error const b2 = f?.(); +// const b3 = f?.(); +// const b4 = f?.(); // Type Error, expected no type arguments From ff7c7297649f17276bd7d5929d3fee36c3b8bff9 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 20:03:49 +0800 Subject: [PATCH 09/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20update=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/syntax/typescript/types.rs | 9 +- .../ok/ts_instantiation_expressions.rast | 199 +++++++++++++++++- .../inline/ok/ts_instantiation_expressions.ts | 8 + 3 files changed, 211 insertions(+), 5 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 4af92b9d0b9..084209ac80f 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1246,7 +1246,14 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const b2 = f?.(); // // const b3 = f?.(); // // const b4 = f?.(); // Type Error, expected no type arguments - +// const x1 = f +// (true); +// // Parsed as relational expression +// const x2 = f +// true; +// // Parsed as instantiation expression +// const x3 = f; +// true; // test_err ts ts_instantiation_expressions1 // const a8 = f; // Relational operator error diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index 261a0168c9d..8f1dbae1868 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -408,14 +408,130 @@ JsModule { }, semicolon_token: SEMICOLON@350..351 ";" [] [], }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@351..467 "const" [Newline("\n"), Comments("// const b3 = f" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@479..481 "(" [Newline("\n")] [], + args: JsCallArgumentList [ + JsBooleanLiteralExpression { + value_token: TRUE_KW@481..485 "true" [] [], + }, + ], + r_paren_token: R_PAREN@485..486 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@486..487 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@487..529 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@529..532 "x2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@532..534 "=" [] [Whitespace(" ")], + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@534..535 "f" [] [], + }, + }, + operator_token: L_ANGLE@535..536 "<" [] [], + right: JsBooleanLiteralExpression { + value_token: TRUE_KW@536..540 "true" [] [], + }, + }, + operator_token: R_ANGLE@540..541 ">" [] [], + right: JsBooleanLiteralExpression { + value_token: TRUE_KW@541..546 "true" [Newline("\n")] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@546..547 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@547..592 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@592..595 "x3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@595..597 "=" [] [Whitespace(" ")], + expression: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@597..598 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@598..599 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsBooleanLiteralType { + literal: TRUE_KW@599..603 "true" [] [], + }, + ], + r_angle_token: R_ANGLE@603..604 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@604..605 ";" [] [], + }, + JsExpressionStatement { + expression: JsBooleanLiteralExpression { + value_token: TRUE_KW@605..610 "true" [Newline("\n")] [], + }, + semicolon_token: SEMICOLON@610..611 ";" [] [], + }, ], - eof_token: EOF@351..381 "" [Newline("\n"), Comments("// const b3 = f" [] [] + 3: JS_CALL_ARGUMENTS@479..486 + 0: L_PAREN@479..481 "(" [Newline("\n")] [] + 1: JS_CALL_ARGUMENT_LIST@481..485 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@481..485 + 0: TRUE_KW@481..485 "true" [] [] + 2: R_PAREN@485..486 ")" [] [] + 1: SEMICOLON@486..487 ";" [] [] + 11: JS_VARIABLE_STATEMENT@487..547 + 0: JS_VARIABLE_DECLARATION@487..546 + 0: CONST_KW@487..529 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@529..546 + 0: JS_VARIABLE_DECLARATOR@529..546 + 0: JS_IDENTIFIER_BINDING@529..532 + 0: IDENT@529..532 "x2" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@532..546 + 0: EQ@532..534 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@534..546 + 0: JS_BINARY_EXPRESSION@534..540 + 0: JS_IDENTIFIER_EXPRESSION@534..535 + 0: JS_REFERENCE_IDENTIFIER@534..535 + 0: IDENT@534..535 "f" [] [] + 1: L_ANGLE@535..536 "<" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@536..540 + 0: TRUE_KW@536..540 "true" [] [] + 1: R_ANGLE@540..541 ">" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@541..546 + 0: TRUE_KW@541..546 "true" [Newline("\n")] [] + 1: SEMICOLON@546..547 ";" [] [] + 12: JS_VARIABLE_STATEMENT@547..605 + 0: JS_VARIABLE_DECLARATION@547..604 + 0: CONST_KW@547..592 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@592..604 + 0: JS_VARIABLE_DECLARATOR@592..604 + 0: JS_IDENTIFIER_BINDING@592..595 + 0: IDENT@592..595 "x3" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@595..604 + 0: EQ@595..597 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@597..604 + 0: JS_IDENTIFIER_EXPRESSION@597..598 + 0: JS_REFERENCE_IDENTIFIER@597..598 + 0: IDENT@597..598 "f" [] [] + 1: TS_TYPE_ARGUMENTS@598..604 + 0: L_ANGLE@598..599 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@599..603 + 0: TS_BOOLEAN_LITERAL_TYPE@599..603 + 0: TRUE_KW@599..603 "true" [] [] + 2: R_ANGLE@603..604 ">" [] [] + 1: SEMICOLON@604..605 ";" [] [] + 13: JS_EXPRESSION_STATEMENT@605..611 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@605..610 + 0: TRUE_KW@605..610 "true" [Newline("\n")] [] + 1: SEMICOLON@610..611 ";" [] [] + 3: EOF@611..612 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 99ea2bfe7ae..1341cec7423 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -10,3 +10,11 @@ const a6 = f['g']; // type Error const b2 = f?.(); // const b3 = f?.(); // const b4 = f?.(); // Type Error, expected no type arguments +const x1 = f +(true); +// Parsed as relational expression +const x2 = f +true; +// Parsed as instantiation expression +const x3 = f; +true; From 2d96604d7d5158e62cba825d2bc8d3949f6330b9 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 3 Sep 2022 22:36:03 +0800 Subject: [PATCH 10/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20udpate=20snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/main.rs | 9 + crates/rome_js_parser/src/syntax/expr.rs | 2 +- .../src/syntax/typescript/types.rs | 4 +- .../ok/ts_instantiation_expressions.rast | 361 +++++++++++++----- .../inline/ok/ts_instantiation_expressions.ts | 4 +- 5 files changed, 271 insertions(+), 109 deletions(-) create mode 100644 crates/rome_js_parser/src/main.rs diff --git a/crates/rome_js_parser/src/main.rs b/crates/rome_js_parser/src/main.rs new file mode 100644 index 00000000000..a247534f392 --- /dev/null +++ b/crates/rome_js_parser/src/main.rs @@ -0,0 +1,9 @@ +use rome_js_parser::{parse_module, parse}; +use rome_js_syntax::{JsAnyRoot, source_type}; + +fn main() { + let source = "const b3 = f?.();"; + + let _root = parse(source, 0, source_type::SourceType::ts()).cast::(); + println!("{:#?}", _root.unwrap()); +} \ No newline at end of file diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 0e6af5c0fd6..67c7189312d 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -1674,7 +1674,7 @@ fn parse_call_expression_rest( // Cloning here is necessary because parsing out the type arguments may rewind in which // case we want to return the `lhs`. let m = match lhs.kind() { - TS_EXPRESSION_WITH_TYPE_ARGUMENTS => lhs.clone().undo_completion(p), + TS_EXPRESSION_WITH_TYPE_ARGUMENTS if !p.at(T![?.]) => lhs.clone().undo_completion(p), _ => lhs.clone().precede(p), }; diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 084209ac80f..840a573c0e9 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1244,8 +1244,8 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const a7 = (f)['g']; // const a6 = f['g']; // type Error // const b2 = f?.(); -// // const b3 = f?.(); -// // const b4 = f?.(); // Type Error, expected no type arguments +// const b3 = f?.(); +// const b4 = f?.(); // Type Error, expected no type arguments // const x1 = f // (true); // // Parsed as relational expression diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index 8f1dbae1868..35deb7a23fa 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -410,128 +410,220 @@ JsModule { }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@351..467 "const" [Newline("\n"), Comments("// const b3 = f" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@372..374 "?." [] [], + type_arguments: missing (optional), + arguments: JsCallArguments { + l_paren_token: L_PAREN@374..375 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@375..376 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@376..377 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@377..384 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@384..387 "b4" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@387..389 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: TsExpressionWithTypeArguments { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@389..390 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@390..391 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@391..397 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@397..398 ">" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@398..400 "?." [] [], + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@400..401 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@401..407 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@407..408 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@408..409 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@409..410 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@410..454 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@454..461 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@461..464 "x1" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@464..466 "=" [] [Whitespace(" ")], expression: JsCallExpression { callee: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@472..473 "f" [] [], + value_token: IDENT@466..467 "f" [] [], }, }, optional_chain_token: missing (optional), type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@473..474 "<" [] [], + l_angle_token: L_ANGLE@467..468 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsBooleanLiteralType { - literal: TRUE_KW@474..478 "true" [] [], + literal: TRUE_KW@468..472 "true" [] [], }, ], - r_angle_token: R_ANGLE@478..479 ">" [] [], + r_angle_token: R_ANGLE@472..473 ">" [] [], }, arguments: JsCallArguments { - l_paren_token: L_PAREN@479..481 "(" [Newline("\n")] [], + l_paren_token: L_PAREN@473..475 "(" [Newline("\n")] [], args: JsCallArgumentList [ JsBooleanLiteralExpression { - value_token: TRUE_KW@481..485 "true" [] [], + value_token: TRUE_KW@475..479 "true" [] [], }, ], - r_paren_token: R_PAREN@485..486 ")" [] [], + r_paren_token: R_PAREN@479..480 ")" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@486..487 ";" [] [], + semicolon_token: SEMICOLON@480..481 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@487..529 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@481..523 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@529..532 "x2" [] [Whitespace(" ")], + name_token: IDENT@523..526 "x2" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@532..534 "=" [] [Whitespace(" ")], + eq_token: EQ@526..528 "=" [] [Whitespace(" ")], expression: JsBinaryExpression { left: JsBinaryExpression { left: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@534..535 "f" [] [], + value_token: IDENT@528..529 "f" [] [], }, }, - operator_token: L_ANGLE@535..536 "<" [] [], + operator_token: L_ANGLE@529..530 "<" [] [], right: JsBooleanLiteralExpression { - value_token: TRUE_KW@536..540 "true" [] [], + value_token: TRUE_KW@530..534 "true" [] [], }, }, - operator_token: R_ANGLE@540..541 ">" [] [], + operator_token: R_ANGLE@534..535 ">" [] [], right: JsBooleanLiteralExpression { - value_token: TRUE_KW@541..546 "true" [Newline("\n")] [], + value_token: TRUE_KW@535..540 "true" [Newline("\n")] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@546..547 ";" [] [], + semicolon_token: SEMICOLON@540..541 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@547..592 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@541..586 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@592..595 "x3" [] [Whitespace(" ")], + name_token: IDENT@586..589 "x3" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@595..597 "=" [] [Whitespace(" ")], + eq_token: EQ@589..591 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@597..598 "f" [] [], + value_token: IDENT@591..592 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@598..599 "<" [] [], + l_angle_token: L_ANGLE@592..593 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsBooleanLiteralType { - literal: TRUE_KW@599..603 "true" [] [], + literal: TRUE_KW@593..597 "true" [] [], }, ], - r_angle_token: R_ANGLE@603..604 ">" [] [], + r_angle_token: R_ANGLE@597..598 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@604..605 ";" [] [], + semicolon_token: SEMICOLON@598..599 ";" [] [], }, JsExpressionStatement { expression: JsBooleanLiteralExpression { - value_token: TRUE_KW@605..610 "true" [Newline("\n")] [], + value_token: TRUE_KW@599..604 "true" [Newline("\n")] [], }, - semicolon_token: SEMICOLON@610..611 ";" [] [], + semicolon_token: SEMICOLON@604..605 ";" [] [], }, ], - eof_token: EOF@611..612 "" [Newline("\n")] [], + eof_token: EOF@605..606 "" [Newline("\n")] [], } -0: JS_MODULE@0..612 +0: JS_MODULE@0..606 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..611 + 2: JS_MODULE_ITEM_LIST@0..605 0: JS_VARIABLE_STATEMENT@0..21 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -796,79 +888,140 @@ JsModule { 1: JS_CALL_ARGUMENT_LIST@349..349 2: R_PAREN@349..350 ")" [] [] 1: SEMICOLON@350..351 ";" [] [] - 10: JS_VARIABLE_STATEMENT@351..487 - 0: JS_VARIABLE_DECLARATION@351..486 - 0: CONST_KW@351..467 "const" [Newline("\n"), Comments("// const b3 = f" [] [] + 1: QUESTIONDOT@372..374 "?." [] [] + 2: (empty) + 3: JS_CALL_ARGUMENTS@374..376 + 0: L_PAREN@374..375 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@375..375 + 2: R_PAREN@375..376 ")" [] [] + 1: SEMICOLON@376..377 ";" [] [] + 11: JS_VARIABLE_STATEMENT@377..454 + 0: JS_VARIABLE_DECLARATION@377..410 + 0: CONST_KW@377..384 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@384..410 + 0: JS_VARIABLE_DECLARATOR@384..410 + 0: JS_IDENTIFIER_BINDING@384..387 + 0: IDENT@384..387 "b4" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@387..410 + 0: EQ@387..389 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@389..410 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@389..398 + 0: JS_IDENTIFIER_EXPRESSION@389..390 + 0: JS_REFERENCE_IDENTIFIER@389..390 + 0: IDENT@389..390 "f" [] [] + 1: TS_TYPE_ARGUMENTS@390..398 + 0: L_ANGLE@390..391 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@391..397 + 0: TS_NUMBER_TYPE@391..397 + 0: NUMBER_KW@391..397 "number" [] [] + 2: R_ANGLE@397..398 ">" [] [] + 1: QUESTIONDOT@398..400 "?." [] [] + 2: TS_TYPE_ARGUMENTS@400..408 + 0: L_ANGLE@400..401 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@401..407 + 0: TS_NUMBER_TYPE@401..407 + 0: NUMBER_KW@401..407 "number" [] [] + 2: R_ANGLE@407..408 ">" [] [] + 3: JS_CALL_ARGUMENTS@408..410 + 0: L_PAREN@408..409 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@409..409 + 2: R_PAREN@409..410 ")" [] [] + 1: SEMICOLON@410..454 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")] + 12: JS_VARIABLE_STATEMENT@454..481 + 0: JS_VARIABLE_DECLARATION@454..480 + 0: CONST_KW@454..461 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@461..480 + 0: JS_VARIABLE_DECLARATOR@461..480 + 0: JS_IDENTIFIER_BINDING@461..464 + 0: IDENT@461..464 "x1" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@470..486 - 0: EQ@470..472 "=" [] [Whitespace(" ")] - 1: JS_CALL_EXPRESSION@472..486 - 0: JS_IDENTIFIER_EXPRESSION@472..473 - 0: JS_REFERENCE_IDENTIFIER@472..473 - 0: IDENT@472..473 "f" [] [] + 2: JS_INITIALIZER_CLAUSE@464..480 + 0: EQ@464..466 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@466..480 + 0: JS_IDENTIFIER_EXPRESSION@466..467 + 0: JS_REFERENCE_IDENTIFIER@466..467 + 0: IDENT@466..467 "f" [] [] 1: (empty) - 2: TS_TYPE_ARGUMENTS@473..479 - 0: L_ANGLE@473..474 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@474..478 - 0: TS_BOOLEAN_LITERAL_TYPE@474..478 - 0: TRUE_KW@474..478 "true" [] [] - 2: R_ANGLE@478..479 ">" [] [] - 3: JS_CALL_ARGUMENTS@479..486 - 0: L_PAREN@479..481 "(" [Newline("\n")] [] - 1: JS_CALL_ARGUMENT_LIST@481..485 - 0: JS_BOOLEAN_LITERAL_EXPRESSION@481..485 - 0: TRUE_KW@481..485 "true" [] [] - 2: R_PAREN@485..486 ")" [] [] - 1: SEMICOLON@486..487 ";" [] [] - 11: JS_VARIABLE_STATEMENT@487..547 - 0: JS_VARIABLE_DECLARATION@487..546 - 0: CONST_KW@487..529 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@529..546 - 0: JS_VARIABLE_DECLARATOR@529..546 - 0: JS_IDENTIFIER_BINDING@529..532 - 0: IDENT@529..532 "x2" [] [Whitespace(" ")] + 2: TS_TYPE_ARGUMENTS@467..473 + 0: L_ANGLE@467..468 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@468..472 + 0: TS_BOOLEAN_LITERAL_TYPE@468..472 + 0: TRUE_KW@468..472 "true" [] [] + 2: R_ANGLE@472..473 ">" [] [] + 3: JS_CALL_ARGUMENTS@473..480 + 0: L_PAREN@473..475 "(" [Newline("\n")] [] + 1: JS_CALL_ARGUMENT_LIST@475..479 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@475..479 + 0: TRUE_KW@475..479 "true" [] [] + 2: R_PAREN@479..480 ")" [] [] + 1: SEMICOLON@480..481 ";" [] [] + 13: JS_VARIABLE_STATEMENT@481..541 + 0: JS_VARIABLE_DECLARATION@481..540 + 0: CONST_KW@481..523 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@523..540 + 0: JS_VARIABLE_DECLARATOR@523..540 + 0: JS_IDENTIFIER_BINDING@523..526 + 0: IDENT@523..526 "x2" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@532..546 - 0: EQ@532..534 "=" [] [Whitespace(" ")] - 1: JS_BINARY_EXPRESSION@534..546 - 0: JS_BINARY_EXPRESSION@534..540 - 0: JS_IDENTIFIER_EXPRESSION@534..535 - 0: JS_REFERENCE_IDENTIFIER@534..535 - 0: IDENT@534..535 "f" [] [] - 1: L_ANGLE@535..536 "<" [] [] - 2: JS_BOOLEAN_LITERAL_EXPRESSION@536..540 - 0: TRUE_KW@536..540 "true" [] [] - 1: R_ANGLE@540..541 ">" [] [] - 2: JS_BOOLEAN_LITERAL_EXPRESSION@541..546 - 0: TRUE_KW@541..546 "true" [Newline("\n")] [] - 1: SEMICOLON@546..547 ";" [] [] - 12: JS_VARIABLE_STATEMENT@547..605 - 0: JS_VARIABLE_DECLARATION@547..604 - 0: CONST_KW@547..592 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@592..604 - 0: JS_VARIABLE_DECLARATOR@592..604 - 0: JS_IDENTIFIER_BINDING@592..595 - 0: IDENT@592..595 "x3" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@526..540 + 0: EQ@526..528 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@528..540 + 0: JS_BINARY_EXPRESSION@528..534 + 0: JS_IDENTIFIER_EXPRESSION@528..529 + 0: JS_REFERENCE_IDENTIFIER@528..529 + 0: IDENT@528..529 "f" [] [] + 1: L_ANGLE@529..530 "<" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@530..534 + 0: TRUE_KW@530..534 "true" [] [] + 1: R_ANGLE@534..535 ">" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@535..540 + 0: TRUE_KW@535..540 "true" [Newline("\n")] [] + 1: SEMICOLON@540..541 ";" [] [] + 14: JS_VARIABLE_STATEMENT@541..599 + 0: JS_VARIABLE_DECLARATION@541..598 + 0: CONST_KW@541..586 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@586..598 + 0: JS_VARIABLE_DECLARATOR@586..598 + 0: JS_IDENTIFIER_BINDING@586..589 + 0: IDENT@586..589 "x3" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@595..604 - 0: EQ@595..597 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@597..604 - 0: JS_IDENTIFIER_EXPRESSION@597..598 - 0: JS_REFERENCE_IDENTIFIER@597..598 - 0: IDENT@597..598 "f" [] [] - 1: TS_TYPE_ARGUMENTS@598..604 - 0: L_ANGLE@598..599 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@599..603 - 0: TS_BOOLEAN_LITERAL_TYPE@599..603 - 0: TRUE_KW@599..603 "true" [] [] - 2: R_ANGLE@603..604 ">" [] [] + 2: JS_INITIALIZER_CLAUSE@589..598 + 0: EQ@589..591 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@591..598 + 0: JS_IDENTIFIER_EXPRESSION@591..592 + 0: JS_REFERENCE_IDENTIFIER@591..592 + 0: IDENT@591..592 "f" [] [] + 1: TS_TYPE_ARGUMENTS@592..598 + 0: L_ANGLE@592..593 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@593..597 + 0: TS_BOOLEAN_LITERAL_TYPE@593..597 + 0: TRUE_KW@593..597 "true" [] [] + 2: R_ANGLE@597..598 ">" [] [] + 1: SEMICOLON@598..599 ";" [] [] + 15: JS_EXPRESSION_STATEMENT@599..605 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@599..604 + 0: TRUE_KW@599..604 "true" [Newline("\n")] [] 1: SEMICOLON@604..605 ";" [] [] - 13: JS_EXPRESSION_STATEMENT@605..611 - 0: JS_BOOLEAN_LITERAL_EXPRESSION@605..610 - 0: TRUE_KW@605..610 "true" [Newline("\n")] [] - 1: SEMICOLON@610..611 ";" [] [] - 3: EOF@611..612 "" [Newline("\n")] [] + 3: EOF@605..606 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 1341cec7423..01093ae7fde 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -8,8 +8,8 @@ const a5 = f['g']; // () => number const a7 = (f)['g']; const a6 = f['g']; // type Error const b2 = f?.(); -// const b3 = f?.(); -// const b4 = f?.(); // Type Error, expected no type arguments +const b3 = f?.(); +const b4 = f?.(); // Type Error, expected no type arguments const x1 = f (true); // Parsed as relational expression From c4ceae4c26e4cf6b00a0afb07de7a325e66248f3 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 02:13:37 +0800 Subject: [PATCH 11/26] =?UTF-8?q?test:=20=F0=9F=92=8D=20new=20operator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 5 + .../test_data/inline/ok/ts_new_operator.rast | 233 ++++++++++++++++++ .../test_data/inline/ok/ts_new_operator.ts | 4 + 3 files changed, 242 insertions(+) create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_new_operator.rast create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_new_operator.ts diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 67c7189312d..fc72acfb3d8 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -739,6 +739,11 @@ fn parse_member_expression_rest( lhs } +// test ts ts_new_operator +// var c2 = new T; // Ok +// var x1 = new SS(); // OK +// var x3 = new SS(); // OK +// var x4 = new SS; // OK fn parse_new_expr(p: &mut Parser, context: ExpressionContext) -> ParsedSyntax { if !p.at(T![new]) { return Absent; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.rast b/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.rast new file mode 100644 index 00000000000..c81c93aa2c2 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.rast @@ -0,0 +1,233 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: VAR_KW@0..4 "var" [] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@4..7 "c2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@7..9 "=" [] [Whitespace(" ")], + expression: JsNewExpression { + new_token: NEW_KW@9..13 "new" [] [Whitespace(" ")], + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@13..14 "T" [] [], + }, + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@14..15 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@15..21 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@21..22 ">" [] [], + }, + arguments: missing (optional), + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@22..30 ";" [] [Whitespace(" "), Comments("// Ok")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: VAR_KW@30..35 "var" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@35..38 "x1" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@38..40 "=" [] [Whitespace(" ")], + expression: JsNewExpression { + new_token: NEW_KW@40..44 "new" [] [Whitespace(" ")], + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@44..46 "SS" [] [], + }, + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@46..47 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@47..53 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@53..54 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@54..55 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@55..56 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@56..63 ";" [] [Whitespace(" "), Comments("// OK")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: VAR_KW@63..68 "var" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@68..71 "x3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@71..73 "=" [] [Whitespace(" ")], + expression: JsNewExpression { + new_token: NEW_KW@73..77 "new" [] [Whitespace(" ")], + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@77..79 "SS" [] [], + }, + }, + type_arguments: missing (optional), + arguments: JsCallArguments { + l_paren_token: L_PAREN@79..80 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@80..81 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@81..96 ";" [] [Whitespace(" "), Comments("// OK")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: VAR_KW@96..101 "var" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@101..104 "x4" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@104..106 "=" [] [Whitespace(" ")], + expression: JsNewExpression { + new_token: NEW_KW@106..110 "new" [] [Whitespace(" ")], + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@110..112 "SS" [] [], + }, + }, + type_arguments: missing (optional), + arguments: missing (optional), + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@112..129 ";" [] [Whitespace(" "), Comments("// OK")], + }, + ], + eof_token: EOF@129..130 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..130 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..129 + 0: JS_VARIABLE_STATEMENT@0..30 + 0: JS_VARIABLE_DECLARATION@0..22 + 0: VAR_KW@0..4 "var" [] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@4..22 + 0: JS_VARIABLE_DECLARATOR@4..22 + 0: JS_IDENTIFIER_BINDING@4..7 + 0: IDENT@4..7 "c2" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@7..22 + 0: EQ@7..9 "=" [] [Whitespace(" ")] + 1: JS_NEW_EXPRESSION@9..22 + 0: NEW_KW@9..13 "new" [] [Whitespace(" ")] + 1: JS_IDENTIFIER_EXPRESSION@13..14 + 0: JS_REFERENCE_IDENTIFIER@13..14 + 0: IDENT@13..14 "T" [] [] + 2: TS_TYPE_ARGUMENTS@14..22 + 0: L_ANGLE@14..15 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@15..21 + 0: TS_STRING_TYPE@15..21 + 0: STRING_KW@15..21 "string" [] [] + 2: R_ANGLE@21..22 ">" [] [] + 3: (empty) + 1: SEMICOLON@22..30 ";" [] [Whitespace(" "), Comments("// Ok")] + 1: JS_VARIABLE_STATEMENT@30..63 + 0: JS_VARIABLE_DECLARATION@30..56 + 0: VAR_KW@30..35 "var" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@35..56 + 0: JS_VARIABLE_DECLARATOR@35..56 + 0: JS_IDENTIFIER_BINDING@35..38 + 0: IDENT@35..38 "x1" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@38..56 + 0: EQ@38..40 "=" [] [Whitespace(" ")] + 1: JS_NEW_EXPRESSION@40..56 + 0: NEW_KW@40..44 "new" [] [Whitespace(" ")] + 1: JS_IDENTIFIER_EXPRESSION@44..46 + 0: JS_REFERENCE_IDENTIFIER@44..46 + 0: IDENT@44..46 "SS" [] [] + 2: TS_TYPE_ARGUMENTS@46..54 + 0: L_ANGLE@46..47 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@47..53 + 0: TS_NUMBER_TYPE@47..53 + 0: NUMBER_KW@47..53 "number" [] [] + 2: R_ANGLE@53..54 ">" [] [] + 3: JS_CALL_ARGUMENTS@54..56 + 0: L_PAREN@54..55 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@55..55 + 2: R_PAREN@55..56 ")" [] [] + 1: SEMICOLON@56..63 ";" [] [Whitespace(" "), Comments("// OK")] + 2: JS_VARIABLE_STATEMENT@63..96 + 0: JS_VARIABLE_DECLARATION@63..81 + 0: VAR_KW@63..68 "var" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@68..81 + 0: JS_VARIABLE_DECLARATOR@68..81 + 0: JS_IDENTIFIER_BINDING@68..71 + 0: IDENT@68..71 "x3" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@71..81 + 0: EQ@71..73 "=" [] [Whitespace(" ")] + 1: JS_NEW_EXPRESSION@73..81 + 0: NEW_KW@73..77 "new" [] [Whitespace(" ")] + 1: JS_IDENTIFIER_EXPRESSION@77..79 + 0: JS_REFERENCE_IDENTIFIER@77..79 + 0: IDENT@77..79 "SS" [] [] + 2: (empty) + 3: JS_CALL_ARGUMENTS@79..81 + 0: L_PAREN@79..80 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@80..80 + 2: R_PAREN@80..81 ")" [] [] + 1: SEMICOLON@81..96 ";" [] [Whitespace(" "), Comments("// OK")] + 3: JS_VARIABLE_STATEMENT@96..129 + 0: JS_VARIABLE_DECLARATION@96..112 + 0: VAR_KW@96..101 "var" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@101..112 + 0: JS_VARIABLE_DECLARATOR@101..112 + 0: JS_IDENTIFIER_BINDING@101..104 + 0: IDENT@101..104 "x4" [] [Whitespace(" ")] + 1: (empty) + 2: JS_INITIALIZER_CLAUSE@104..112 + 0: EQ@104..106 "=" [] [Whitespace(" ")] + 1: JS_NEW_EXPRESSION@106..112 + 0: NEW_KW@106..110 "new" [] [Whitespace(" ")] + 1: JS_IDENTIFIER_EXPRESSION@110..112 + 0: JS_REFERENCE_IDENTIFIER@110..112 + 0: IDENT@110..112 "SS" [] [] + 2: (empty) + 3: (empty) + 1: SEMICOLON@112..129 ";" [] [Whitespace(" "), Comments("// OK")] + 3: EOF@129..130 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.ts b/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.ts new file mode 100644 index 00000000000..6dccd384d2a --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_new_operator.ts @@ -0,0 +1,4 @@ +var c2 = new T; // Ok +var x1 = new SS(); // OK +var x3 = new SS(); // OK +var x4 = new SS; // OK From 6a6f46a5ffd2e956594ea5f5f99f3a76b04ca1d7 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 02:30:47 +0800 Subject: [PATCH 12/26] =?UTF-8?q?test:=20=F0=9F=92=8D=20update=20test=20sn?= =?UTF-8?q?apshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/syntax/typescript/types.rs | 4 + .../ok/ts_type_instantiation_expression.rast | 52 +++++++++++ .../ok/ts_type_instantiation_expression.ts | 1 + .../test_data/inline/ok/ts_typeof_type.rast | 92 ++++++++++++++++++- .../test_data/inline/ok/ts_typeof_type.ts | 1 + 5 files changed, 146 insertions(+), 4 deletions(-) create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.rast create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.ts diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 840a573c0e9..85937d49ff1 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -518,6 +518,7 @@ pub(crate) fn parse_ts_name(p: &mut Parser) -> ParsedSyntax { // let a = "test"; // type B = typeof a; // type T21 = typeof Array; +// type A = InstanceType>; fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { if !p.at(T![typeof]) { return Absent; @@ -1255,6 +1256,9 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const x3 = f; // true; +// test ts ts_type_instantiation_expression +// type StringBox = Box; + // test_err ts ts_instantiation_expressions1 // const a8 = f; // Relational operator error // const b1 = f?.; // Error, `(` expected diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.rast b/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.rast new file mode 100644 index 00000000000..4f7a5fc19ee --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.rast @@ -0,0 +1,52 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + TsTypeAliasDeclaration { + type_token: TYPE_KW@0..5 "type" [] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@5..15 "StringBox" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + eq_token: EQ@15..17 "=" [] [Whitespace(" ")], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@17..20 "Box" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@20..21 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@21..27 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@27..28 ">" [] [], + }, + }, + semicolon_token: SEMICOLON@28..29 ";" [] [], + }, + ], + eof_token: EOF@29..30 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..30 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..29 + 0: TS_TYPE_ALIAS_DECLARATION@0..29 + 0: TYPE_KW@0..5 "type" [] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@5..15 + 0: IDENT@5..15 "StringBox" [] [Whitespace(" ")] + 2: (empty) + 3: EQ@15..17 "=" [] [Whitespace(" ")] + 4: TS_REFERENCE_TYPE@17..28 + 0: JS_REFERENCE_IDENTIFIER@17..20 + 0: IDENT@17..20 "Box" [] [] + 1: TS_TYPE_ARGUMENTS@20..28 + 0: L_ANGLE@20..21 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@21..27 + 0: TS_STRING_TYPE@21..27 + 0: STRING_KW@21..27 "string" [] [] + 2: R_ANGLE@27..28 ">" [] [] + 5: SEMICOLON@28..29 ";" [] [] + 3: EOF@29..30 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.ts b/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.ts new file mode 100644 index 00000000000..f6a91d523b3 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_type_instantiation_expression.ts @@ -0,0 +1 @@ +type StringBox = Box; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast index 0d2f3743497..1f88a903bac 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast @@ -62,14 +62,64 @@ JsModule { }, semicolon_token: SEMICOLON@66..68 ";" [] [Whitespace(" ")], }, + TsTypeAliasDeclaration { + type_token: TYPE_KW@68..74 "type" [Newline("\n")] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@74..75 "A" [] [], + }, + type_parameters: TsTypeParameters { + l_angle_token: L_ANGLE@75..76 "<" [] [], + items: TsTypeParameterList [ + TsTypeParameter { + name: TsTypeParameterName { + ident_token: IDENT@76..77 "U" [] [], + }, + constraint: missing (optional), + default: missing (optional), + }, + ], + r_angle_token: R_ANGLE@77..79 ">" [] [Whitespace(" ")], + }, + eq_token: EQ@79..81 "=" [] [Whitespace(" ")], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@81..93 "InstanceType" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@93..94 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsTypeofType { + typeof_token: TYPEOF_KW@94..101 "typeof" [] [Whitespace(" ")], + expression_name: JsReferenceIdentifier { + value_token: IDENT@101..106 "Array" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@106..107 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@107..108 "U" [] [], + }, + type_arguments: missing (optional), + }, + ], + r_angle_token: R_ANGLE@108..109 ">" [] [], + }, + }, + ], + r_angle_token: R_ANGLE@109..110 ">" [] [], + }, + }, + semicolon_token: SEMICOLON@110..112 ";" [] [Whitespace(" ")], + }, ], - eof_token: EOF@68..69 "" [Newline("\n")] [], + eof_token: EOF@112..113 "" [Newline("\n")] [], } -0: JS_MODULE@0..69 +0: JS_MODULE@0..113 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..68 + 2: JS_MODULE_ITEM_LIST@0..112 0: JS_VARIABLE_STATEMENT@0..15 0: JS_VARIABLE_DECLARATION@0..14 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -112,4 +162,38 @@ JsModule { 0: STRING_KW@59..65 "string" [] [] 2: R_ANGLE@65..66 ">" [] [] 5: SEMICOLON@66..68 ";" [] [Whitespace(" ")] - 3: EOF@68..69 "" [Newline("\n")] [] + 3: TS_TYPE_ALIAS_DECLARATION@68..112 + 0: TYPE_KW@68..74 "type" [Newline("\n")] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@74..75 + 0: IDENT@74..75 "A" [] [] + 2: TS_TYPE_PARAMETERS@75..79 + 0: L_ANGLE@75..76 "<" [] [] + 1: TS_TYPE_PARAMETER_LIST@76..77 + 0: TS_TYPE_PARAMETER@76..77 + 0: TS_TYPE_PARAMETER_NAME@76..77 + 0: IDENT@76..77 "U" [] [] + 1: (empty) + 2: (empty) + 2: R_ANGLE@77..79 ">" [] [Whitespace(" ")] + 3: EQ@79..81 "=" [] [Whitespace(" ")] + 4: TS_REFERENCE_TYPE@81..110 + 0: JS_REFERENCE_IDENTIFIER@81..93 + 0: IDENT@81..93 "InstanceType" [] [] + 1: TS_TYPE_ARGUMENTS@93..110 + 0: L_ANGLE@93..94 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@94..109 + 0: TS_TYPEOF_TYPE@94..109 + 0: TYPEOF_KW@94..101 "typeof" [] [Whitespace(" ")] + 1: JS_REFERENCE_IDENTIFIER@101..106 + 0: IDENT@101..106 "Array" [] [] + 2: TS_TYPE_ARGUMENTS@106..109 + 0: L_ANGLE@106..107 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@107..108 + 0: TS_REFERENCE_TYPE@107..108 + 0: JS_REFERENCE_IDENTIFIER@107..108 + 0: IDENT@107..108 "U" [] [] + 1: (empty) + 2: R_ANGLE@108..109 ">" [] [] + 2: R_ANGLE@109..110 ">" [] [] + 5: SEMICOLON@110..112 ";" [] [Whitespace(" ")] + 3: EOF@112..113 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts index b1b257c2751..b8f81473efb 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts @@ -1,3 +1,4 @@ let a = "test"; type B = typeof a; type T21 = typeof Array; +type A = InstanceType>; From 5817eb9ad344b2725fd12278604915dc43f613ea Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 11:58:05 +0800 Subject: [PATCH 13/26] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20js=20format?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/src/parentheses.rs | 8 +- .../expression_with_type_arguments.rs | 18 +- .../src/ts/types/typeof_type.rs | 9 +- .../instantiation-expression/typeof.ts.snap | 50 - crates/rome_js_parser/src/main.rs | 6 +- crates/rome_js_parser/src/syntax/expr.rs | 9 +- .../src/syntax/typescript/types.rs | 15 +- .../ok/ts_instantiation_expressions.rast | 1044 ++++++++--------- .../inline/ok/ts_instantiation_expressions.ts | 6 +- .../test_data/inline/ok/ts_typeof_type.rast | 106 +- .../test_data/inline/ok/ts_typeof_type.ts | 4 +- 11 files changed, 623 insertions(+), 652 deletions(-) delete mode 100644 crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/typeof.ts.snap diff --git a/crates/rome_js_formatter/src/parentheses.rs b/crates/rome_js_formatter/src/parentheses.rs index e25db6bc182..6ea6d68397a 100644 --- a/crates/rome_js_formatter/src/parentheses.rs +++ b/crates/rome_js_formatter/src/parentheses.rs @@ -158,7 +158,9 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses() } - JsAnyExpression::TsExpressionWithTypeArguments(_) => todo!(), + JsAnyExpression::TsExpressionWithTypeArguments(arguments) => { + arguments.needs_parentheses() + } } } @@ -253,7 +255,9 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses_with_parent(parent) } - JsAnyExpression::TsExpressionWithTypeArguments(_) => todo!(), + JsAnyExpression::TsExpressionWithTypeArguments(expr) => { + expr.needs_parentheses_with_parent(parent) + } } } } diff --git a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs index 144cb68c2dc..29f078c4283 100644 --- a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs +++ b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs @@ -1,5 +1,6 @@ -use crate::prelude::*; -use rome_js_syntax::TsExpressionWithTypeArguments; +use crate::{parentheses::NeedsParentheses, prelude::*}; +use rome_formatter::write; +use rome_js_syntax::{TsExpressionWithTypeArguments, TsExpressionWithTypeArgumentsFields}; use rome_rowan::AstNode; #[derive(Debug, Clone, Default)] pub struct FormatTsExpressionWithTypeArguments; @@ -9,6 +10,17 @@ impl FormatNodeRule for FormatTsExpressionWithTyp node: &TsExpressionWithTypeArguments, f: &mut JsFormatter, ) -> FormatResult<()> { - format_verbatim_node(node.syntax()).fmt(f) + let TsExpressionWithTypeArgumentsFields { + expression, + arguments, + } = node.as_fields(); + + write![f, [expression.format(), arguments.format()]] + } +} + +impl NeedsParentheses for TsExpressionWithTypeArguments { + fn needs_parentheses_with_parent(&self, _: &rome_js_syntax::JsSyntaxNode) -> bool { + false } } diff --git a/crates/rome_js_formatter/src/ts/types/typeof_type.rs b/crates/rome_js_formatter/src/ts/types/typeof_type.rs index a458c1f1c1c..e9dd7ff8bc3 100644 --- a/crates/rome_js_formatter/src/ts/types/typeof_type.rs +++ b/crates/rome_js_formatter/src/ts/types/typeof_type.rs @@ -10,14 +10,19 @@ pub struct FormatTsTypeofType; impl FormatNodeRule for FormatTsTypeofType { fn fmt_fields(&self, node: &TsTypeofType, f: &mut JsFormatter) -> FormatResult<()> { let TsTypeofTypeFields { - type_arguments: _, + type_arguments, typeof_token, expression_name, } = node.as_fields(); write![ f, - [typeof_token.format(), space(), expression_name.format()] + [ + typeof_token.format(), + space(), + expression_name.format(), + type_arguments.format() + ] ] } diff --git a/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/typeof.ts.snap b/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/typeof.ts.snap deleted file mode 100644 index 0dec64531ac..00000000000 --- a/crates/rome_js_formatter/tests/specs/prettier/typescript/instantiation-expression/typeof.ts.snap +++ /dev/null @@ -1,50 +0,0 @@ ---- -source: crates/rome_js_formatter/tests/prettier_tests.rs ---- - -# Input - -```js -let x: typeof y.z; -``` - - -# Prettier differences - -```diff ---- Prettier -+++ Rome -@@ -1 +1,2 @@ --let x: typeof y.z; -+let x: typeof y.z; -+; -``` - -# Output - -```js -let x: typeof y.z; -; -``` - - -# Errors -``` -error[SyntaxError]: Expected a semicolon or an implicit semicolon after a statement, but found none - ┌─ typeof.ts:1:18 - │ -1 │ let x: typeof y.z; - │ -----------------^ An explicit or implicit semicolon is expected here... - │ │ - │ ...Which is required to end this statement - -error[SyntaxError]: expected an expression but instead found ';' - ┌─ typeof.ts:1:21 - │ -1 │ let x: typeof y.z; - │ ^ Expected an expression here - - -``` - - diff --git a/crates/rome_js_parser/src/main.rs b/crates/rome_js_parser/src/main.rs index a247534f392..77a82a57a99 100644 --- a/crates/rome_js_parser/src/main.rs +++ b/crates/rome_js_parser/src/main.rs @@ -1,9 +1,9 @@ -use rome_js_parser::{parse_module, parse}; -use rome_js_syntax::{JsAnyRoot, source_type}; +use rome_js_parser::{parse, parse_module}; +use rome_js_syntax::{source_type, JsAnyRoot}; fn main() { let source = "const b3 = f?.();"; let _root = parse(source, 0, source_type::SourceType::ts()).cast::(); println!("{:#?}", _root.unwrap()); -} \ No newline at end of file +} diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index fc72acfb3d8..fba2438f1fe 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -7,10 +7,10 @@ use super::typescript::*; use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; -use crate::parser::ToDiagnostic; use crate::parser::expected_node; use crate::parser::rewrite_parser::RewriteCompletedMarker; use crate::parser::rewrite_parser::{RewriteMarker, RewriteParser}; +use crate::parser::ToDiagnostic; use crate::parser::{expected_token, ParserProgress, RecoveryResult}; use crate::syntax::assignment::parse_assignment; use crate::syntax::assignment::AssignmentExprPrecedence; @@ -1725,10 +1725,9 @@ fn parse_call_expression_rest( }; if type_arguments.is_some() || p.at(T!['(']) { - parse_call_arguments(p).or_add_diagnostic(p, |p, range| { - expected_node("(", range).to_diagnostic(p) - }); - // .expect("Expected parsed out arguments because the parser is positioned at '('"); + parse_call_arguments(p) + .or_add_diagnostic(p, |p, range| expected_node("(", range).to_diagnostic(p)); + // .expect("Expected parsed out arguments because the parser is positioned at '('"); lhs = m.complete(p, JS_CALL_EXPRESSION); continue; } diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 85937d49ff1..a9e3e77903b 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -517,8 +517,8 @@ pub(crate) fn parse_ts_name(p: &mut Parser) -> ParsedSyntax { // test ts ts_typeof_type // let a = "test"; // type B = typeof a; -// type T21 = typeof Array; -// type A = InstanceType>; +// type T21 = typeof Array; +// type A = InstanceType>; fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { if !p.at(T![typeof]) { return Absent; @@ -527,7 +527,9 @@ fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { let m = p.start(); p.expect(T![typeof]); parse_ts_name(p).or_add_diagnostic(p, expected_identifier); - parse_ts_type_arguments(p).ok(); + if !p.has_preceding_line_break() { + parse_ts_type_arguments(p).ok(); + } Present(m.complete(p, TS_TYPEOF_TYPE)) } @@ -1235,9 +1237,9 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { } // test ts ts_instantiation_expressions -// let f1 = fx; -// let f2 = fx; -// let f3 = fx['test']; +// let f1 = fx; +// let f2 = fx; +// let f3 = fx['test']; // const a2 = f.g; // () => number // const a3 = f.g; // () => U // const a4 = f.g; // () => number @@ -1263,7 +1265,6 @@ fn parse_ts_type_predicate(p: &mut Parser) -> ParsedSyntax { // const a8 = f; // Relational operator error // const b1 = f?.; // Error, `(` expected - pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyntax { // Don't parse type arguments in JS because the syntax is ambiguous // https://github.com/microsoft/TypeScript/issues/36662 diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index 35deb7a23fa..af60bf7ded5 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -33,598 +33,598 @@ JsModule { }, ], }, - semicolon_token: SEMICOLON@19..21 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@19..20 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: LET_KW@21..26 "let" [Newline("\n")] [Whitespace(" ")], + kind: LET_KW@20..25 "let" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@26..29 "f2" [] [Whitespace(" ")], + name_token: IDENT@25..28 "f2" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@29..31 "=" [] [Whitespace(" ")], + eq_token: EQ@28..30 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@31..33 "fx" [] [], + value_token: IDENT@30..32 "fx" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@33..34 "<" [] [], + l_angle_token: L_ANGLE@32..33 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsStringType { - string_token: STRING_KW@34..40 "string" [] [], + string_token: STRING_KW@33..39 "string" [] [], }, - COMMA@40..42 "," [] [Whitespace(" ")], + COMMA@39..41 "," [] [Whitespace(" ")], TsNumberType { - number_token: NUMBER_KW@42..48 "number" [] [], + number_token: NUMBER_KW@41..47 "number" [] [], }, ], - r_angle_token: R_ANGLE@48..49 ">" [] [], + r_angle_token: R_ANGLE@47..48 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@49..51 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@48..49 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: LET_KW@51..56 "let" [Newline("\n")] [Whitespace(" ")], + kind: LET_KW@49..54 "let" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@56..59 "f3" [] [Whitespace(" ")], + name_token: IDENT@54..57 "f3" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@59..61 "=" [] [Whitespace(" ")], + eq_token: EQ@57..59 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsComputedMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@61..63 "fx" [] [], + value_token: IDENT@59..61 "fx" [] [], }, }, optional_chain_token: missing (optional), - l_brack_token: L_BRACK@63..64 "[" [] [], + l_brack_token: L_BRACK@61..62 "[" [] [], member: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@64..70 "'test'" [] [], + value_token: JS_STRING_LITERAL@62..68 "'test'" [] [], }, - r_brack_token: R_BRACK@70..71 "]" [] [], + r_brack_token: R_BRACK@68..69 "]" [] [], }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@71..72 "<" [] [], + l_angle_token: L_ANGLE@69..70 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsStringType { - string_token: STRING_KW@72..78 "string" [] [], + string_token: STRING_KW@70..76 "string" [] [], }, ], - r_angle_token: R_ANGLE@78..79 ">" [] [], + r_angle_token: R_ANGLE@76..77 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@79..81 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@77..78 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@81..88 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@78..85 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@88..91 "a2" [] [Whitespace(" ")], + name_token: IDENT@85..88 "a2" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@91..93 "=" [] [Whitespace(" ")], + eq_token: EQ@88..90 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsStaticMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@93..94 "f" [] [], + value_token: IDENT@90..91 "f" [] [], }, }, - operator_token: DOT@94..95 "." [] [], + operator_token: DOT@91..92 "." [] [], member: JsName { - value_token: IDENT@95..96 "g" [] [], + value_token: IDENT@92..93 "g" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@96..97 "<" [] [], + l_angle_token: L_ANGLE@93..94 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@97..103 "number" [] [], + number_token: NUMBER_KW@94..100 "number" [] [], }, ], - r_angle_token: R_ANGLE@103..104 ">" [] [], + r_angle_token: R_ANGLE@100..101 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@104..122 ";" [] [Whitespace(" "), Comments("// () => number")], + semicolon_token: SEMICOLON@101..119 ";" [] [Whitespace(" "), Comments("// () => number")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@122..129 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@119..126 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@129..132 "a3" [] [Whitespace(" ")], + name_token: IDENT@126..129 "a3" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@132..134 "=" [] [Whitespace(" ")], + eq_token: EQ@129..131 "=" [] [Whitespace(" ")], expression: JsStaticMemberExpression { object: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@134..135 "f" [] [], + value_token: IDENT@131..132 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@135..136 "<" [] [], + l_angle_token: L_ANGLE@132..133 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@136..142 "number" [] [], + number_token: NUMBER_KW@133..139 "number" [] [], }, ], - r_angle_token: R_ANGLE@142..143 ">" [] [], + r_angle_token: R_ANGLE@139..140 ">" [] [], }, }, - operator_token: DOT@143..144 "." [] [], + operator_token: DOT@140..141 "." [] [], member: JsName { - value_token: IDENT@144..145 "g" [] [], + value_token: IDENT@141..142 "g" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@145..161 ";" [] [Whitespace(" "), Comments("// () => U")], + semicolon_token: SEMICOLON@142..158 ";" [] [Whitespace(" "), Comments("// () => U")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@161..168 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@158..165 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@168..171 "a4" [] [Whitespace(" ")], + name_token: IDENT@165..168 "a4" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@171..173 "=" [] [Whitespace(" ")], + eq_token: EQ@168..170 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsStaticMemberExpression { object: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@173..174 "f" [] [], + value_token: IDENT@170..171 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@174..175 "<" [] [], + l_angle_token: L_ANGLE@171..172 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@175..181 "number" [] [], + number_token: NUMBER_KW@172..178 "number" [] [], }, ], - r_angle_token: R_ANGLE@181..182 ">" [] [], + r_angle_token: R_ANGLE@178..179 ">" [] [], }, }, - operator_token: DOT@182..183 "." [] [], + operator_token: DOT@179..180 "." [] [], member: JsName { - value_token: IDENT@183..184 "g" [] [], + value_token: IDENT@180..181 "g" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@184..185 "<" [] [], + l_angle_token: L_ANGLE@181..182 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@185..191 "number" [] [], + number_token: NUMBER_KW@182..188 "number" [] [], }, ], - r_angle_token: R_ANGLE@191..192 ">" [] [], + r_angle_token: R_ANGLE@188..189 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@192..210 ";" [] [Whitespace(" "), Comments("// () => number")], + semicolon_token: SEMICOLON@189..207 ";" [] [Whitespace(" "), Comments("// () => number")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@210..217 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@207..214 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@217..220 "a5" [] [Whitespace(" ")], + name_token: IDENT@214..217 "a5" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@220..222 "=" [] [Whitespace(" ")], + eq_token: EQ@217..219 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsComputedMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@222..223 "f" [] [], + value_token: IDENT@219..220 "f" [] [], }, }, optional_chain_token: missing (optional), - l_brack_token: L_BRACK@223..224 "[" [] [], + l_brack_token: L_BRACK@220..221 "[" [] [], member: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@224..227 "'g'" [] [], + value_token: JS_STRING_LITERAL@221..224 "'g'" [] [], }, - r_brack_token: R_BRACK@227..228 "]" [] [], + r_brack_token: R_BRACK@224..225 "]" [] [], }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@228..229 "<" [] [], + l_angle_token: L_ANGLE@225..226 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@229..235 "number" [] [], + number_token: NUMBER_KW@226..232 "number" [] [], }, ], - r_angle_token: R_ANGLE@235..236 ">" [] [], + r_angle_token: R_ANGLE@232..233 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")], + semicolon_token: SEMICOLON@233..251 ";" [] [Whitespace(" "), Comments("// () => number")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@254..261 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@251..258 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@261..264 "a7" [] [Whitespace(" ")], + name_token: IDENT@258..261 "a7" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@264..266 "=" [] [Whitespace(" ")], + eq_token: EQ@261..263 "=" [] [Whitespace(" ")], expression: JsComputedMemberExpression { object: JsParenthesizedExpression { - l_paren_token: L_PAREN@266..267 "(" [] [], + l_paren_token: L_PAREN@263..264 "(" [] [], expression: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@267..268 "f" [] [], + value_token: IDENT@264..265 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@268..269 "<" [] [], + l_angle_token: L_ANGLE@265..266 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@269..275 "number" [] [], + number_token: NUMBER_KW@266..272 "number" [] [], }, ], - r_angle_token: R_ANGLE@275..276 ">" [] [], + r_angle_token: R_ANGLE@272..273 ">" [] [], }, }, - r_paren_token: R_PAREN@276..277 ")" [] [], + r_paren_token: R_PAREN@273..274 ")" [] [], }, optional_chain_token: missing (optional), - l_brack_token: L_BRACK@277..278 "[" [] [], + l_brack_token: L_BRACK@274..275 "[" [] [], member: JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@278..281 "'g'" [] [], + value_token: JS_STRING_LITERAL@275..278 "'g'" [] [], }, - r_brack_token: R_BRACK@281..282 "]" [] [], + r_brack_token: R_BRACK@278..279 "]" [] [], }, }, }, ], }, - semicolon_token: SEMICOLON@282..283 ";" [] [], + semicolon_token: SEMICOLON@279..280 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@283..290 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@280..287 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@290..293 "a6" [] [Whitespace(" ")], + name_token: IDENT@287..290 "a6" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@293..295 "=" [] [Whitespace(" ")], + eq_token: EQ@290..292 "=" [] [Whitespace(" ")], expression: JsBinaryExpression { left: JsBinaryExpression { left: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@295..296 "f" [] [], + value_token: IDENT@292..293 "f" [] [], }, }, - operator_token: L_ANGLE@296..297 "<" [] [], + operator_token: L_ANGLE@293..294 "<" [] [], right: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@297..303 "number" [] [], + value_token: IDENT@294..300 "number" [] [], }, }, }, - operator_token: R_ANGLE@303..304 ">" [] [], + operator_token: R_ANGLE@300..301 ">" [] [], right: JsArrayExpression { - l_brack_token: L_BRACK@304..305 "[" [] [], + l_brack_token: L_BRACK@301..302 "[" [] [], elements: JsArrayElementList [ JsStringLiteralExpression { - value_token: JS_STRING_LITERAL@305..308 "'g'" [] [], + value_token: JS_STRING_LITERAL@302..305 "'g'" [] [], }, ], - r_brack_token: R_BRACK@308..309 "]" [] [], + r_brack_token: R_BRACK@305..306 "]" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")], + semicolon_token: SEMICOLON@306..322 ";" [] [Whitespace(" "), Comments("// type Error")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@325..332 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@322..329 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@332..335 "b2" [] [Whitespace(" ")], + name_token: IDENT@329..332 "b2" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@335..337 "=" [] [Whitespace(" ")], + eq_token: EQ@332..334 "=" [] [Whitespace(" ")], expression: JsCallExpression { callee: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@337..338 "f" [] [], + value_token: IDENT@334..335 "f" [] [], }, }, - optional_chain_token: QUESTIONDOT@338..340 "?." [] [], + optional_chain_token: QUESTIONDOT@335..337 "?." [] [], type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@340..341 "<" [] [], + l_angle_token: L_ANGLE@337..338 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@341..347 "number" [] [], + number_token: NUMBER_KW@338..344 "number" [] [], }, ], - r_angle_token: R_ANGLE@347..348 ">" [] [], + r_angle_token: R_ANGLE@344..345 ">" [] [], }, arguments: JsCallArguments { - l_paren_token: L_PAREN@348..349 "(" [] [], + l_paren_token: L_PAREN@345..346 "(" [] [], args: JsCallArgumentList [], - r_paren_token: R_PAREN@349..350 ")" [] [], + r_paren_token: R_PAREN@346..347 ")" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@350..351 ";" [] [], + semicolon_token: SEMICOLON@347..348 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@351..358 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@348..355 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@358..361 "b3" [] [Whitespace(" ")], + name_token: IDENT@355..358 "b3" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@361..363 "=" [] [Whitespace(" ")], + eq_token: EQ@358..360 "=" [] [Whitespace(" ")], expression: JsCallExpression { callee: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@363..364 "f" [] [], + value_token: IDENT@360..361 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@364..365 "<" [] [], + l_angle_token: L_ANGLE@361..362 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@365..371 "number" [] [], + number_token: NUMBER_KW@362..368 "number" [] [], }, ], - r_angle_token: R_ANGLE@371..372 ">" [] [], + r_angle_token: R_ANGLE@368..369 ">" [] [], }, }, - optional_chain_token: QUESTIONDOT@372..374 "?." [] [], + optional_chain_token: QUESTIONDOT@369..371 "?." [] [], type_arguments: missing (optional), arguments: JsCallArguments { - l_paren_token: L_PAREN@374..375 "(" [] [], + l_paren_token: L_PAREN@371..372 "(" [] [], args: JsCallArgumentList [], - r_paren_token: R_PAREN@375..376 ")" [] [], + r_paren_token: R_PAREN@372..373 ")" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@376..377 ";" [] [], + semicolon_token: SEMICOLON@373..374 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@377..384 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@374..381 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@384..387 "b4" [] [Whitespace(" ")], + name_token: IDENT@381..384 "b4" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@387..389 "=" [] [Whitespace(" ")], + eq_token: EQ@384..386 "=" [] [Whitespace(" ")], expression: JsCallExpression { callee: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@389..390 "f" [] [], + value_token: IDENT@386..387 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@390..391 "<" [] [], + l_angle_token: L_ANGLE@387..388 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@391..397 "number" [] [], + number_token: NUMBER_KW@388..394 "number" [] [], }, ], - r_angle_token: R_ANGLE@397..398 ">" [] [], + r_angle_token: R_ANGLE@394..395 ">" [] [], }, }, - optional_chain_token: QUESTIONDOT@398..400 "?." [] [], + optional_chain_token: QUESTIONDOT@395..397 "?." [] [], type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@400..401 "<" [] [], + l_angle_token: L_ANGLE@397..398 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsNumberType { - number_token: NUMBER_KW@401..407 "number" [] [], + number_token: NUMBER_KW@398..404 "number" [] [], }, ], - r_angle_token: R_ANGLE@407..408 ">" [] [], + r_angle_token: R_ANGLE@404..405 ">" [] [], }, arguments: JsCallArguments { - l_paren_token: L_PAREN@408..409 "(" [] [], + l_paren_token: L_PAREN@405..406 "(" [] [], args: JsCallArgumentList [], - r_paren_token: R_PAREN@409..410 ")" [] [], + r_paren_token: R_PAREN@406..407 ")" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@410..454 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")], + semicolon_token: SEMICOLON@407..451 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@454..461 "const" [Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@451..458 "const" [Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@461..464 "x1" [] [Whitespace(" ")], + name_token: IDENT@458..461 "x1" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@464..466 "=" [] [Whitespace(" ")], + eq_token: EQ@461..463 "=" [] [Whitespace(" ")], expression: JsCallExpression { callee: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@466..467 "f" [] [], + value_token: IDENT@463..464 "f" [] [], }, }, optional_chain_token: missing (optional), type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@467..468 "<" [] [], + l_angle_token: L_ANGLE@464..465 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsBooleanLiteralType { - literal: TRUE_KW@468..472 "true" [] [], + literal: TRUE_KW@465..469 "true" [] [], }, ], - r_angle_token: R_ANGLE@472..473 ">" [] [], + r_angle_token: R_ANGLE@469..470 ">" [] [], }, arguments: JsCallArguments { - l_paren_token: L_PAREN@473..475 "(" [Newline("\n")] [], + l_paren_token: L_PAREN@470..472 "(" [Newline("\n")] [], args: JsCallArgumentList [ JsBooleanLiteralExpression { - value_token: TRUE_KW@475..479 "true" [] [], + value_token: TRUE_KW@472..476 "true" [] [], }, ], - r_paren_token: R_PAREN@479..480 ")" [] [], + r_paren_token: R_PAREN@476..477 ")" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@480..481 ";" [] [], + semicolon_token: SEMICOLON@477..478 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@481..523 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@478..520 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@523..526 "x2" [] [Whitespace(" ")], + name_token: IDENT@520..523 "x2" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@526..528 "=" [] [Whitespace(" ")], + eq_token: EQ@523..525 "=" [] [Whitespace(" ")], expression: JsBinaryExpression { left: JsBinaryExpression { left: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@528..529 "f" [] [], + value_token: IDENT@525..526 "f" [] [], }, }, - operator_token: L_ANGLE@529..530 "<" [] [], + operator_token: L_ANGLE@526..527 "<" [] [], right: JsBooleanLiteralExpression { - value_token: TRUE_KW@530..534 "true" [] [], + value_token: TRUE_KW@527..531 "true" [] [], }, }, - operator_token: R_ANGLE@534..535 ">" [] [], + operator_token: R_ANGLE@531..532 ">" [] [], right: JsBooleanLiteralExpression { - value_token: TRUE_KW@535..540 "true" [Newline("\n")] [], + value_token: TRUE_KW@532..537 "true" [Newline("\n")] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@540..541 ";" [] [], + semicolon_token: SEMICOLON@537..538 ";" [] [], }, JsVariableStatement { declaration: JsVariableDeclaration { - kind: CONST_KW@541..586 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], + kind: CONST_KW@538..583 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], declarators: JsVariableDeclaratorList [ JsVariableDeclarator { id: JsIdentifierBinding { - name_token: IDENT@586..589 "x3" [] [Whitespace(" ")], + name_token: IDENT@583..586 "x3" [] [Whitespace(" ")], }, variable_annotation: missing (optional), initializer: JsInitializerClause { - eq_token: EQ@589..591 "=" [] [Whitespace(" ")], + eq_token: EQ@586..588 "=" [] [Whitespace(" ")], expression: TsExpressionWithTypeArguments { expression: JsIdentifierExpression { name: JsReferenceIdentifier { - value_token: IDENT@591..592 "f" [] [], + value_token: IDENT@588..589 "f" [] [], }, }, arguments: TsTypeArguments { - l_angle_token: L_ANGLE@592..593 "<" [] [], + l_angle_token: L_ANGLE@589..590 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsBooleanLiteralType { - literal: TRUE_KW@593..597 "true" [] [], + literal: TRUE_KW@590..594 "true" [] [], }, ], - r_angle_token: R_ANGLE@597..598 ">" [] [], + r_angle_token: R_ANGLE@594..595 ">" [] [], }, }, }, }, ], }, - semicolon_token: SEMICOLON@598..599 ";" [] [], + semicolon_token: SEMICOLON@595..596 ";" [] [], }, JsExpressionStatement { expression: JsBooleanLiteralExpression { - value_token: TRUE_KW@599..604 "true" [Newline("\n")] [], + value_token: TRUE_KW@596..601 "true" [Newline("\n")] [], }, - semicolon_token: SEMICOLON@604..605 ";" [] [], + semicolon_token: SEMICOLON@601..602 ";" [] [], }, ], - eof_token: EOF@605..606 "" [Newline("\n")] [], + eof_token: EOF@602..603 "" [Newline("\n")] [], } -0: JS_MODULE@0..606 +0: JS_MODULE@0..603 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..605 - 0: JS_VARIABLE_STATEMENT@0..21 + 2: JS_MODULE_ITEM_LIST@0..602 + 0: JS_VARIABLE_STATEMENT@0..20 0: JS_VARIABLE_DECLARATION@0..19 0: LET_KW@0..4 "let" [] [Whitespace(" ")] 1: JS_VARIABLE_DECLARATOR_LIST@4..19 @@ -644,384 +644,384 @@ JsModule { 0: TS_STRING_TYPE@12..18 0: STRING_KW@12..18 "string" [] [] 2: R_ANGLE@18..19 ">" [] [] - 1: SEMICOLON@19..21 ";" [] [Whitespace(" ")] - 1: JS_VARIABLE_STATEMENT@21..51 - 0: JS_VARIABLE_DECLARATION@21..49 - 0: LET_KW@21..26 "let" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@26..49 - 0: JS_VARIABLE_DECLARATOR@26..49 - 0: JS_IDENTIFIER_BINDING@26..29 - 0: IDENT@26..29 "f2" [] [Whitespace(" ")] + 1: SEMICOLON@19..20 ";" [] [] + 1: JS_VARIABLE_STATEMENT@20..49 + 0: JS_VARIABLE_DECLARATION@20..48 + 0: LET_KW@20..25 "let" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@25..48 + 0: JS_VARIABLE_DECLARATOR@25..48 + 0: JS_IDENTIFIER_BINDING@25..28 + 0: IDENT@25..28 "f2" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@29..49 - 0: EQ@29..31 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@31..49 - 0: JS_IDENTIFIER_EXPRESSION@31..33 - 0: JS_REFERENCE_IDENTIFIER@31..33 - 0: IDENT@31..33 "fx" [] [] - 1: TS_TYPE_ARGUMENTS@33..49 - 0: L_ANGLE@33..34 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@34..48 - 0: TS_STRING_TYPE@34..40 - 0: STRING_KW@34..40 "string" [] [] - 1: COMMA@40..42 "," [] [Whitespace(" ")] - 2: TS_NUMBER_TYPE@42..48 - 0: NUMBER_KW@42..48 "number" [] [] - 2: R_ANGLE@48..49 ">" [] [] - 1: SEMICOLON@49..51 ";" [] [Whitespace(" ")] - 2: JS_VARIABLE_STATEMENT@51..81 - 0: JS_VARIABLE_DECLARATION@51..79 - 0: LET_KW@51..56 "let" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@56..79 - 0: JS_VARIABLE_DECLARATOR@56..79 - 0: JS_IDENTIFIER_BINDING@56..59 - 0: IDENT@56..59 "f3" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@28..48 + 0: EQ@28..30 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@30..48 + 0: JS_IDENTIFIER_EXPRESSION@30..32 + 0: JS_REFERENCE_IDENTIFIER@30..32 + 0: IDENT@30..32 "fx" [] [] + 1: TS_TYPE_ARGUMENTS@32..48 + 0: L_ANGLE@32..33 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@33..47 + 0: TS_STRING_TYPE@33..39 + 0: STRING_KW@33..39 "string" [] [] + 1: COMMA@39..41 "," [] [Whitespace(" ")] + 2: TS_NUMBER_TYPE@41..47 + 0: NUMBER_KW@41..47 "number" [] [] + 2: R_ANGLE@47..48 ">" [] [] + 1: SEMICOLON@48..49 ";" [] [] + 2: JS_VARIABLE_STATEMENT@49..78 + 0: JS_VARIABLE_DECLARATION@49..77 + 0: LET_KW@49..54 "let" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@54..77 + 0: JS_VARIABLE_DECLARATOR@54..77 + 0: JS_IDENTIFIER_BINDING@54..57 + 0: IDENT@54..57 "f3" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@59..79 - 0: EQ@59..61 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@61..79 - 0: JS_COMPUTED_MEMBER_EXPRESSION@61..71 - 0: JS_IDENTIFIER_EXPRESSION@61..63 - 0: JS_REFERENCE_IDENTIFIER@61..63 - 0: IDENT@61..63 "fx" [] [] + 2: JS_INITIALIZER_CLAUSE@57..77 + 0: EQ@57..59 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@59..77 + 0: JS_COMPUTED_MEMBER_EXPRESSION@59..69 + 0: JS_IDENTIFIER_EXPRESSION@59..61 + 0: JS_REFERENCE_IDENTIFIER@59..61 + 0: IDENT@59..61 "fx" [] [] 1: (empty) - 2: L_BRACK@63..64 "[" [] [] - 3: JS_STRING_LITERAL_EXPRESSION@64..70 - 0: JS_STRING_LITERAL@64..70 "'test'" [] [] - 4: R_BRACK@70..71 "]" [] [] - 1: TS_TYPE_ARGUMENTS@71..79 - 0: L_ANGLE@71..72 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@72..78 - 0: TS_STRING_TYPE@72..78 - 0: STRING_KW@72..78 "string" [] [] - 2: R_ANGLE@78..79 ">" [] [] - 1: SEMICOLON@79..81 ";" [] [Whitespace(" ")] - 3: JS_VARIABLE_STATEMENT@81..122 - 0: JS_VARIABLE_DECLARATION@81..104 - 0: CONST_KW@81..88 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@88..104 - 0: JS_VARIABLE_DECLARATOR@88..104 - 0: JS_IDENTIFIER_BINDING@88..91 - 0: IDENT@88..91 "a2" [] [Whitespace(" ")] + 2: L_BRACK@61..62 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@62..68 + 0: JS_STRING_LITERAL@62..68 "'test'" [] [] + 4: R_BRACK@68..69 "]" [] [] + 1: TS_TYPE_ARGUMENTS@69..77 + 0: L_ANGLE@69..70 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@70..76 + 0: TS_STRING_TYPE@70..76 + 0: STRING_KW@70..76 "string" [] [] + 2: R_ANGLE@76..77 ">" [] [] + 1: SEMICOLON@77..78 ";" [] [] + 3: JS_VARIABLE_STATEMENT@78..119 + 0: JS_VARIABLE_DECLARATION@78..101 + 0: CONST_KW@78..85 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@85..101 + 0: JS_VARIABLE_DECLARATOR@85..101 + 0: JS_IDENTIFIER_BINDING@85..88 + 0: IDENT@85..88 "a2" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@91..104 - 0: EQ@91..93 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@93..104 - 0: JS_STATIC_MEMBER_EXPRESSION@93..96 - 0: JS_IDENTIFIER_EXPRESSION@93..94 - 0: JS_REFERENCE_IDENTIFIER@93..94 - 0: IDENT@93..94 "f" [] [] - 1: DOT@94..95 "." [] [] - 2: JS_NAME@95..96 - 0: IDENT@95..96 "g" [] [] - 1: TS_TYPE_ARGUMENTS@96..104 - 0: L_ANGLE@96..97 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@97..103 - 0: TS_NUMBER_TYPE@97..103 - 0: NUMBER_KW@97..103 "number" [] [] - 2: R_ANGLE@103..104 ">" [] [] - 1: SEMICOLON@104..122 ";" [] [Whitespace(" "), Comments("// () => number")] - 4: JS_VARIABLE_STATEMENT@122..161 - 0: JS_VARIABLE_DECLARATION@122..145 - 0: CONST_KW@122..129 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@129..145 - 0: JS_VARIABLE_DECLARATOR@129..145 - 0: JS_IDENTIFIER_BINDING@129..132 - 0: IDENT@129..132 "a3" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@88..101 + 0: EQ@88..90 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@90..101 + 0: JS_STATIC_MEMBER_EXPRESSION@90..93 + 0: JS_IDENTIFIER_EXPRESSION@90..91 + 0: JS_REFERENCE_IDENTIFIER@90..91 + 0: IDENT@90..91 "f" [] [] + 1: DOT@91..92 "." [] [] + 2: JS_NAME@92..93 + 0: IDENT@92..93 "g" [] [] + 1: TS_TYPE_ARGUMENTS@93..101 + 0: L_ANGLE@93..94 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@94..100 + 0: TS_NUMBER_TYPE@94..100 + 0: NUMBER_KW@94..100 "number" [] [] + 2: R_ANGLE@100..101 ">" [] [] + 1: SEMICOLON@101..119 ";" [] [Whitespace(" "), Comments("// () => number")] + 4: JS_VARIABLE_STATEMENT@119..158 + 0: JS_VARIABLE_DECLARATION@119..142 + 0: CONST_KW@119..126 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@126..142 + 0: JS_VARIABLE_DECLARATOR@126..142 + 0: JS_IDENTIFIER_BINDING@126..129 + 0: IDENT@126..129 "a3" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@132..145 - 0: EQ@132..134 "=" [] [Whitespace(" ")] - 1: JS_STATIC_MEMBER_EXPRESSION@134..145 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@134..143 - 0: JS_IDENTIFIER_EXPRESSION@134..135 - 0: JS_REFERENCE_IDENTIFIER@134..135 - 0: IDENT@134..135 "f" [] [] - 1: TS_TYPE_ARGUMENTS@135..143 - 0: L_ANGLE@135..136 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@136..142 - 0: TS_NUMBER_TYPE@136..142 - 0: NUMBER_KW@136..142 "number" [] [] - 2: R_ANGLE@142..143 ">" [] [] - 1: DOT@143..144 "." [] [] - 2: JS_NAME@144..145 - 0: IDENT@144..145 "g" [] [] - 1: SEMICOLON@145..161 ";" [] [Whitespace(" "), Comments("// () => U")] - 5: JS_VARIABLE_STATEMENT@161..210 - 0: JS_VARIABLE_DECLARATION@161..192 - 0: CONST_KW@161..168 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@168..192 - 0: JS_VARIABLE_DECLARATOR@168..192 - 0: JS_IDENTIFIER_BINDING@168..171 - 0: IDENT@168..171 "a4" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@129..142 + 0: EQ@129..131 "=" [] [Whitespace(" ")] + 1: JS_STATIC_MEMBER_EXPRESSION@131..142 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@131..140 + 0: JS_IDENTIFIER_EXPRESSION@131..132 + 0: JS_REFERENCE_IDENTIFIER@131..132 + 0: IDENT@131..132 "f" [] [] + 1: TS_TYPE_ARGUMENTS@132..140 + 0: L_ANGLE@132..133 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@133..139 + 0: TS_NUMBER_TYPE@133..139 + 0: NUMBER_KW@133..139 "number" [] [] + 2: R_ANGLE@139..140 ">" [] [] + 1: DOT@140..141 "." [] [] + 2: JS_NAME@141..142 + 0: IDENT@141..142 "g" [] [] + 1: SEMICOLON@142..158 ";" [] [Whitespace(" "), Comments("// () => U")] + 5: JS_VARIABLE_STATEMENT@158..207 + 0: JS_VARIABLE_DECLARATION@158..189 + 0: CONST_KW@158..165 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@165..189 + 0: JS_VARIABLE_DECLARATOR@165..189 + 0: JS_IDENTIFIER_BINDING@165..168 + 0: IDENT@165..168 "a4" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@171..192 - 0: EQ@171..173 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@173..192 - 0: JS_STATIC_MEMBER_EXPRESSION@173..184 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@173..182 - 0: JS_IDENTIFIER_EXPRESSION@173..174 - 0: JS_REFERENCE_IDENTIFIER@173..174 - 0: IDENT@173..174 "f" [] [] - 1: TS_TYPE_ARGUMENTS@174..182 - 0: L_ANGLE@174..175 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@175..181 - 0: TS_NUMBER_TYPE@175..181 - 0: NUMBER_KW@175..181 "number" [] [] - 2: R_ANGLE@181..182 ">" [] [] - 1: DOT@182..183 "." [] [] - 2: JS_NAME@183..184 - 0: IDENT@183..184 "g" [] [] - 1: TS_TYPE_ARGUMENTS@184..192 - 0: L_ANGLE@184..185 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@185..191 - 0: TS_NUMBER_TYPE@185..191 - 0: NUMBER_KW@185..191 "number" [] [] - 2: R_ANGLE@191..192 ">" [] [] - 1: SEMICOLON@192..210 ";" [] [Whitespace(" "), Comments("// () => number")] - 6: JS_VARIABLE_STATEMENT@210..254 - 0: JS_VARIABLE_DECLARATION@210..236 - 0: CONST_KW@210..217 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@217..236 - 0: JS_VARIABLE_DECLARATOR@217..236 - 0: JS_IDENTIFIER_BINDING@217..220 - 0: IDENT@217..220 "a5" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@168..189 + 0: EQ@168..170 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@170..189 + 0: JS_STATIC_MEMBER_EXPRESSION@170..181 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@170..179 + 0: JS_IDENTIFIER_EXPRESSION@170..171 + 0: JS_REFERENCE_IDENTIFIER@170..171 + 0: IDENT@170..171 "f" [] [] + 1: TS_TYPE_ARGUMENTS@171..179 + 0: L_ANGLE@171..172 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@172..178 + 0: TS_NUMBER_TYPE@172..178 + 0: NUMBER_KW@172..178 "number" [] [] + 2: R_ANGLE@178..179 ">" [] [] + 1: DOT@179..180 "." [] [] + 2: JS_NAME@180..181 + 0: IDENT@180..181 "g" [] [] + 1: TS_TYPE_ARGUMENTS@181..189 + 0: L_ANGLE@181..182 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@182..188 + 0: TS_NUMBER_TYPE@182..188 + 0: NUMBER_KW@182..188 "number" [] [] + 2: R_ANGLE@188..189 ">" [] [] + 1: SEMICOLON@189..207 ";" [] [Whitespace(" "), Comments("// () => number")] + 6: JS_VARIABLE_STATEMENT@207..251 + 0: JS_VARIABLE_DECLARATION@207..233 + 0: CONST_KW@207..214 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@214..233 + 0: JS_VARIABLE_DECLARATOR@214..233 + 0: JS_IDENTIFIER_BINDING@214..217 + 0: IDENT@214..217 "a5" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@220..236 - 0: EQ@220..222 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@222..236 - 0: JS_COMPUTED_MEMBER_EXPRESSION@222..228 - 0: JS_IDENTIFIER_EXPRESSION@222..223 - 0: JS_REFERENCE_IDENTIFIER@222..223 - 0: IDENT@222..223 "f" [] [] + 2: JS_INITIALIZER_CLAUSE@217..233 + 0: EQ@217..219 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@219..233 + 0: JS_COMPUTED_MEMBER_EXPRESSION@219..225 + 0: JS_IDENTIFIER_EXPRESSION@219..220 + 0: JS_REFERENCE_IDENTIFIER@219..220 + 0: IDENT@219..220 "f" [] [] 1: (empty) - 2: L_BRACK@223..224 "[" [] [] - 3: JS_STRING_LITERAL_EXPRESSION@224..227 - 0: JS_STRING_LITERAL@224..227 "'g'" [] [] - 4: R_BRACK@227..228 "]" [] [] - 1: TS_TYPE_ARGUMENTS@228..236 - 0: L_ANGLE@228..229 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@229..235 - 0: TS_NUMBER_TYPE@229..235 - 0: NUMBER_KW@229..235 "number" [] [] - 2: R_ANGLE@235..236 ">" [] [] - 1: SEMICOLON@236..254 ";" [] [Whitespace(" "), Comments("// () => number")] - 7: JS_VARIABLE_STATEMENT@254..283 - 0: JS_VARIABLE_DECLARATION@254..282 - 0: CONST_KW@254..261 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@261..282 - 0: JS_VARIABLE_DECLARATOR@261..282 - 0: JS_IDENTIFIER_BINDING@261..264 - 0: IDENT@261..264 "a7" [] [Whitespace(" ")] + 2: L_BRACK@220..221 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@221..224 + 0: JS_STRING_LITERAL@221..224 "'g'" [] [] + 4: R_BRACK@224..225 "]" [] [] + 1: TS_TYPE_ARGUMENTS@225..233 + 0: L_ANGLE@225..226 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@226..232 + 0: TS_NUMBER_TYPE@226..232 + 0: NUMBER_KW@226..232 "number" [] [] + 2: R_ANGLE@232..233 ">" [] [] + 1: SEMICOLON@233..251 ";" [] [Whitespace(" "), Comments("// () => number")] + 7: JS_VARIABLE_STATEMENT@251..280 + 0: JS_VARIABLE_DECLARATION@251..279 + 0: CONST_KW@251..258 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@258..279 + 0: JS_VARIABLE_DECLARATOR@258..279 + 0: JS_IDENTIFIER_BINDING@258..261 + 0: IDENT@258..261 "a7" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@264..282 - 0: EQ@264..266 "=" [] [Whitespace(" ")] - 1: JS_COMPUTED_MEMBER_EXPRESSION@266..282 - 0: JS_PARENTHESIZED_EXPRESSION@266..277 - 0: L_PAREN@266..267 "(" [] [] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@267..276 - 0: JS_IDENTIFIER_EXPRESSION@267..268 - 0: JS_REFERENCE_IDENTIFIER@267..268 - 0: IDENT@267..268 "f" [] [] - 1: TS_TYPE_ARGUMENTS@268..276 - 0: L_ANGLE@268..269 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@269..275 - 0: TS_NUMBER_TYPE@269..275 - 0: NUMBER_KW@269..275 "number" [] [] - 2: R_ANGLE@275..276 ">" [] [] - 2: R_PAREN@276..277 ")" [] [] + 2: JS_INITIALIZER_CLAUSE@261..279 + 0: EQ@261..263 "=" [] [Whitespace(" ")] + 1: JS_COMPUTED_MEMBER_EXPRESSION@263..279 + 0: JS_PARENTHESIZED_EXPRESSION@263..274 + 0: L_PAREN@263..264 "(" [] [] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@264..273 + 0: JS_IDENTIFIER_EXPRESSION@264..265 + 0: JS_REFERENCE_IDENTIFIER@264..265 + 0: IDENT@264..265 "f" [] [] + 1: TS_TYPE_ARGUMENTS@265..273 + 0: L_ANGLE@265..266 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@266..272 + 0: TS_NUMBER_TYPE@266..272 + 0: NUMBER_KW@266..272 "number" [] [] + 2: R_ANGLE@272..273 ">" [] [] + 2: R_PAREN@273..274 ")" [] [] 1: (empty) - 2: L_BRACK@277..278 "[" [] [] - 3: JS_STRING_LITERAL_EXPRESSION@278..281 - 0: JS_STRING_LITERAL@278..281 "'g'" [] [] - 4: R_BRACK@281..282 "]" [] [] - 1: SEMICOLON@282..283 ";" [] [] - 8: JS_VARIABLE_STATEMENT@283..325 - 0: JS_VARIABLE_DECLARATION@283..309 - 0: CONST_KW@283..290 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@290..309 - 0: JS_VARIABLE_DECLARATOR@290..309 - 0: JS_IDENTIFIER_BINDING@290..293 - 0: IDENT@290..293 "a6" [] [Whitespace(" ")] + 2: L_BRACK@274..275 "[" [] [] + 3: JS_STRING_LITERAL_EXPRESSION@275..278 + 0: JS_STRING_LITERAL@275..278 "'g'" [] [] + 4: R_BRACK@278..279 "]" [] [] + 1: SEMICOLON@279..280 ";" [] [] + 8: JS_VARIABLE_STATEMENT@280..322 + 0: JS_VARIABLE_DECLARATION@280..306 + 0: CONST_KW@280..287 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@287..306 + 0: JS_VARIABLE_DECLARATOR@287..306 + 0: JS_IDENTIFIER_BINDING@287..290 + 0: IDENT@287..290 "a6" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@293..309 - 0: EQ@293..295 "=" [] [Whitespace(" ")] - 1: JS_BINARY_EXPRESSION@295..309 - 0: JS_BINARY_EXPRESSION@295..303 - 0: JS_IDENTIFIER_EXPRESSION@295..296 - 0: JS_REFERENCE_IDENTIFIER@295..296 - 0: IDENT@295..296 "f" [] [] - 1: L_ANGLE@296..297 "<" [] [] - 2: JS_IDENTIFIER_EXPRESSION@297..303 - 0: JS_REFERENCE_IDENTIFIER@297..303 - 0: IDENT@297..303 "number" [] [] - 1: R_ANGLE@303..304 ">" [] [] - 2: JS_ARRAY_EXPRESSION@304..309 - 0: L_BRACK@304..305 "[" [] [] - 1: JS_ARRAY_ELEMENT_LIST@305..308 - 0: JS_STRING_LITERAL_EXPRESSION@305..308 - 0: JS_STRING_LITERAL@305..308 "'g'" [] [] - 2: R_BRACK@308..309 "]" [] [] - 1: SEMICOLON@309..325 ";" [] [Whitespace(" "), Comments("// type Error")] - 9: JS_VARIABLE_STATEMENT@325..351 - 0: JS_VARIABLE_DECLARATION@325..350 - 0: CONST_KW@325..332 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@332..350 - 0: JS_VARIABLE_DECLARATOR@332..350 - 0: JS_IDENTIFIER_BINDING@332..335 - 0: IDENT@332..335 "b2" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@290..306 + 0: EQ@290..292 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@292..306 + 0: JS_BINARY_EXPRESSION@292..300 + 0: JS_IDENTIFIER_EXPRESSION@292..293 + 0: JS_REFERENCE_IDENTIFIER@292..293 + 0: IDENT@292..293 "f" [] [] + 1: L_ANGLE@293..294 "<" [] [] + 2: JS_IDENTIFIER_EXPRESSION@294..300 + 0: JS_REFERENCE_IDENTIFIER@294..300 + 0: IDENT@294..300 "number" [] [] + 1: R_ANGLE@300..301 ">" [] [] + 2: JS_ARRAY_EXPRESSION@301..306 + 0: L_BRACK@301..302 "[" [] [] + 1: JS_ARRAY_ELEMENT_LIST@302..305 + 0: JS_STRING_LITERAL_EXPRESSION@302..305 + 0: JS_STRING_LITERAL@302..305 "'g'" [] [] + 2: R_BRACK@305..306 "]" [] [] + 1: SEMICOLON@306..322 ";" [] [Whitespace(" "), Comments("// type Error")] + 9: JS_VARIABLE_STATEMENT@322..348 + 0: JS_VARIABLE_DECLARATION@322..347 + 0: CONST_KW@322..329 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@329..347 + 0: JS_VARIABLE_DECLARATOR@329..347 + 0: JS_IDENTIFIER_BINDING@329..332 + 0: IDENT@329..332 "b2" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@335..350 - 0: EQ@335..337 "=" [] [Whitespace(" ")] - 1: JS_CALL_EXPRESSION@337..350 - 0: JS_IDENTIFIER_EXPRESSION@337..338 - 0: JS_REFERENCE_IDENTIFIER@337..338 - 0: IDENT@337..338 "f" [] [] - 1: QUESTIONDOT@338..340 "?." [] [] - 2: TS_TYPE_ARGUMENTS@340..348 - 0: L_ANGLE@340..341 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@341..347 - 0: TS_NUMBER_TYPE@341..347 - 0: NUMBER_KW@341..347 "number" [] [] - 2: R_ANGLE@347..348 ">" [] [] - 3: JS_CALL_ARGUMENTS@348..350 - 0: L_PAREN@348..349 "(" [] [] - 1: JS_CALL_ARGUMENT_LIST@349..349 - 2: R_PAREN@349..350 ")" [] [] - 1: SEMICOLON@350..351 ";" [] [] - 10: JS_VARIABLE_STATEMENT@351..377 - 0: JS_VARIABLE_DECLARATION@351..376 - 0: CONST_KW@351..358 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@358..376 - 0: JS_VARIABLE_DECLARATOR@358..376 - 0: JS_IDENTIFIER_BINDING@358..361 - 0: IDENT@358..361 "b3" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@332..347 + 0: EQ@332..334 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@334..347 + 0: JS_IDENTIFIER_EXPRESSION@334..335 + 0: JS_REFERENCE_IDENTIFIER@334..335 + 0: IDENT@334..335 "f" [] [] + 1: QUESTIONDOT@335..337 "?." [] [] + 2: TS_TYPE_ARGUMENTS@337..345 + 0: L_ANGLE@337..338 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@338..344 + 0: TS_NUMBER_TYPE@338..344 + 0: NUMBER_KW@338..344 "number" [] [] + 2: R_ANGLE@344..345 ">" [] [] + 3: JS_CALL_ARGUMENTS@345..347 + 0: L_PAREN@345..346 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@346..346 + 2: R_PAREN@346..347 ")" [] [] + 1: SEMICOLON@347..348 ";" [] [] + 10: JS_VARIABLE_STATEMENT@348..374 + 0: JS_VARIABLE_DECLARATION@348..373 + 0: CONST_KW@348..355 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@355..373 + 0: JS_VARIABLE_DECLARATOR@355..373 + 0: JS_IDENTIFIER_BINDING@355..358 + 0: IDENT@355..358 "b3" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@361..376 - 0: EQ@361..363 "=" [] [Whitespace(" ")] - 1: JS_CALL_EXPRESSION@363..376 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@363..372 - 0: JS_IDENTIFIER_EXPRESSION@363..364 - 0: JS_REFERENCE_IDENTIFIER@363..364 - 0: IDENT@363..364 "f" [] [] - 1: TS_TYPE_ARGUMENTS@364..372 - 0: L_ANGLE@364..365 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@365..371 - 0: TS_NUMBER_TYPE@365..371 - 0: NUMBER_KW@365..371 "number" [] [] - 2: R_ANGLE@371..372 ">" [] [] - 1: QUESTIONDOT@372..374 "?." [] [] + 2: JS_INITIALIZER_CLAUSE@358..373 + 0: EQ@358..360 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@360..373 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@360..369 + 0: JS_IDENTIFIER_EXPRESSION@360..361 + 0: JS_REFERENCE_IDENTIFIER@360..361 + 0: IDENT@360..361 "f" [] [] + 1: TS_TYPE_ARGUMENTS@361..369 + 0: L_ANGLE@361..362 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@362..368 + 0: TS_NUMBER_TYPE@362..368 + 0: NUMBER_KW@362..368 "number" [] [] + 2: R_ANGLE@368..369 ">" [] [] + 1: QUESTIONDOT@369..371 "?." [] [] 2: (empty) - 3: JS_CALL_ARGUMENTS@374..376 - 0: L_PAREN@374..375 "(" [] [] - 1: JS_CALL_ARGUMENT_LIST@375..375 - 2: R_PAREN@375..376 ")" [] [] - 1: SEMICOLON@376..377 ";" [] [] - 11: JS_VARIABLE_STATEMENT@377..454 - 0: JS_VARIABLE_DECLARATION@377..410 - 0: CONST_KW@377..384 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@384..410 - 0: JS_VARIABLE_DECLARATOR@384..410 - 0: JS_IDENTIFIER_BINDING@384..387 - 0: IDENT@384..387 "b4" [] [Whitespace(" ")] + 3: JS_CALL_ARGUMENTS@371..373 + 0: L_PAREN@371..372 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@372..372 + 2: R_PAREN@372..373 ")" [] [] + 1: SEMICOLON@373..374 ";" [] [] + 11: JS_VARIABLE_STATEMENT@374..451 + 0: JS_VARIABLE_DECLARATION@374..407 + 0: CONST_KW@374..381 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@381..407 + 0: JS_VARIABLE_DECLARATOR@381..407 + 0: JS_IDENTIFIER_BINDING@381..384 + 0: IDENT@381..384 "b4" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@387..410 - 0: EQ@387..389 "=" [] [Whitespace(" ")] - 1: JS_CALL_EXPRESSION@389..410 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@389..398 - 0: JS_IDENTIFIER_EXPRESSION@389..390 - 0: JS_REFERENCE_IDENTIFIER@389..390 - 0: IDENT@389..390 "f" [] [] - 1: TS_TYPE_ARGUMENTS@390..398 - 0: L_ANGLE@390..391 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@391..397 - 0: TS_NUMBER_TYPE@391..397 - 0: NUMBER_KW@391..397 "number" [] [] - 2: R_ANGLE@397..398 ">" [] [] - 1: QUESTIONDOT@398..400 "?." [] [] - 2: TS_TYPE_ARGUMENTS@400..408 - 0: L_ANGLE@400..401 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@401..407 - 0: TS_NUMBER_TYPE@401..407 - 0: NUMBER_KW@401..407 "number" [] [] - 2: R_ANGLE@407..408 ">" [] [] - 3: JS_CALL_ARGUMENTS@408..410 - 0: L_PAREN@408..409 "(" [] [] - 1: JS_CALL_ARGUMENT_LIST@409..409 - 2: R_PAREN@409..410 ")" [] [] - 1: SEMICOLON@410..454 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")] - 12: JS_VARIABLE_STATEMENT@454..481 - 0: JS_VARIABLE_DECLARATION@454..480 - 0: CONST_KW@454..461 "const" [Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@461..480 - 0: JS_VARIABLE_DECLARATOR@461..480 - 0: JS_IDENTIFIER_BINDING@461..464 - 0: IDENT@461..464 "x1" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@384..407 + 0: EQ@384..386 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@386..407 + 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@386..395 + 0: JS_IDENTIFIER_EXPRESSION@386..387 + 0: JS_REFERENCE_IDENTIFIER@386..387 + 0: IDENT@386..387 "f" [] [] + 1: TS_TYPE_ARGUMENTS@387..395 + 0: L_ANGLE@387..388 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@388..394 + 0: TS_NUMBER_TYPE@388..394 + 0: NUMBER_KW@388..394 "number" [] [] + 2: R_ANGLE@394..395 ">" [] [] + 1: QUESTIONDOT@395..397 "?." [] [] + 2: TS_TYPE_ARGUMENTS@397..405 + 0: L_ANGLE@397..398 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@398..404 + 0: TS_NUMBER_TYPE@398..404 + 0: NUMBER_KW@398..404 "number" [] [] + 2: R_ANGLE@404..405 ">" [] [] + 3: JS_CALL_ARGUMENTS@405..407 + 0: L_PAREN@405..406 "(" [] [] + 1: JS_CALL_ARGUMENT_LIST@406..406 + 2: R_PAREN@406..407 ")" [] [] + 1: SEMICOLON@407..451 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")] + 12: JS_VARIABLE_STATEMENT@451..478 + 0: JS_VARIABLE_DECLARATION@451..477 + 0: CONST_KW@451..458 "const" [Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@458..477 + 0: JS_VARIABLE_DECLARATOR@458..477 + 0: JS_IDENTIFIER_BINDING@458..461 + 0: IDENT@458..461 "x1" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@464..480 - 0: EQ@464..466 "=" [] [Whitespace(" ")] - 1: JS_CALL_EXPRESSION@466..480 - 0: JS_IDENTIFIER_EXPRESSION@466..467 - 0: JS_REFERENCE_IDENTIFIER@466..467 - 0: IDENT@466..467 "f" [] [] + 2: JS_INITIALIZER_CLAUSE@461..477 + 0: EQ@461..463 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@463..477 + 0: JS_IDENTIFIER_EXPRESSION@463..464 + 0: JS_REFERENCE_IDENTIFIER@463..464 + 0: IDENT@463..464 "f" [] [] 1: (empty) - 2: TS_TYPE_ARGUMENTS@467..473 - 0: L_ANGLE@467..468 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@468..472 - 0: TS_BOOLEAN_LITERAL_TYPE@468..472 - 0: TRUE_KW@468..472 "true" [] [] - 2: R_ANGLE@472..473 ">" [] [] - 3: JS_CALL_ARGUMENTS@473..480 - 0: L_PAREN@473..475 "(" [Newline("\n")] [] - 1: JS_CALL_ARGUMENT_LIST@475..479 - 0: JS_BOOLEAN_LITERAL_EXPRESSION@475..479 - 0: TRUE_KW@475..479 "true" [] [] - 2: R_PAREN@479..480 ")" [] [] - 1: SEMICOLON@480..481 ";" [] [] - 13: JS_VARIABLE_STATEMENT@481..541 - 0: JS_VARIABLE_DECLARATION@481..540 - 0: CONST_KW@481..523 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@523..540 - 0: JS_VARIABLE_DECLARATOR@523..540 - 0: JS_IDENTIFIER_BINDING@523..526 - 0: IDENT@523..526 "x2" [] [Whitespace(" ")] + 2: TS_TYPE_ARGUMENTS@464..470 + 0: L_ANGLE@464..465 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@465..469 + 0: TS_BOOLEAN_LITERAL_TYPE@465..469 + 0: TRUE_KW@465..469 "true" [] [] + 2: R_ANGLE@469..470 ">" [] [] + 3: JS_CALL_ARGUMENTS@470..477 + 0: L_PAREN@470..472 "(" [Newline("\n")] [] + 1: JS_CALL_ARGUMENT_LIST@472..476 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@472..476 + 0: TRUE_KW@472..476 "true" [] [] + 2: R_PAREN@476..477 ")" [] [] + 1: SEMICOLON@477..478 ";" [] [] + 13: JS_VARIABLE_STATEMENT@478..538 + 0: JS_VARIABLE_DECLARATION@478..537 + 0: CONST_KW@478..520 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@520..537 + 0: JS_VARIABLE_DECLARATOR@520..537 + 0: JS_IDENTIFIER_BINDING@520..523 + 0: IDENT@520..523 "x2" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@526..540 - 0: EQ@526..528 "=" [] [Whitespace(" ")] - 1: JS_BINARY_EXPRESSION@528..540 - 0: JS_BINARY_EXPRESSION@528..534 - 0: JS_IDENTIFIER_EXPRESSION@528..529 - 0: JS_REFERENCE_IDENTIFIER@528..529 - 0: IDENT@528..529 "f" [] [] - 1: L_ANGLE@529..530 "<" [] [] - 2: JS_BOOLEAN_LITERAL_EXPRESSION@530..534 - 0: TRUE_KW@530..534 "true" [] [] - 1: R_ANGLE@534..535 ">" [] [] - 2: JS_BOOLEAN_LITERAL_EXPRESSION@535..540 - 0: TRUE_KW@535..540 "true" [Newline("\n")] [] - 1: SEMICOLON@540..541 ";" [] [] - 14: JS_VARIABLE_STATEMENT@541..599 - 0: JS_VARIABLE_DECLARATION@541..598 - 0: CONST_KW@541..586 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")] - 1: JS_VARIABLE_DECLARATOR_LIST@586..598 - 0: JS_VARIABLE_DECLARATOR@586..598 - 0: JS_IDENTIFIER_BINDING@586..589 - 0: IDENT@586..589 "x3" [] [Whitespace(" ")] + 2: JS_INITIALIZER_CLAUSE@523..537 + 0: EQ@523..525 "=" [] [Whitespace(" ")] + 1: JS_BINARY_EXPRESSION@525..537 + 0: JS_BINARY_EXPRESSION@525..531 + 0: JS_IDENTIFIER_EXPRESSION@525..526 + 0: JS_REFERENCE_IDENTIFIER@525..526 + 0: IDENT@525..526 "f" [] [] + 1: L_ANGLE@526..527 "<" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@527..531 + 0: TRUE_KW@527..531 "true" [] [] + 1: R_ANGLE@531..532 ">" [] [] + 2: JS_BOOLEAN_LITERAL_EXPRESSION@532..537 + 0: TRUE_KW@532..537 "true" [Newline("\n")] [] + 1: SEMICOLON@537..538 ";" [] [] + 14: JS_VARIABLE_STATEMENT@538..596 + 0: JS_VARIABLE_DECLARATION@538..595 + 0: CONST_KW@538..583 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")] + 1: JS_VARIABLE_DECLARATOR_LIST@583..595 + 0: JS_VARIABLE_DECLARATOR@583..595 + 0: JS_IDENTIFIER_BINDING@583..586 + 0: IDENT@583..586 "x3" [] [Whitespace(" ")] 1: (empty) - 2: JS_INITIALIZER_CLAUSE@589..598 - 0: EQ@589..591 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@591..598 - 0: JS_IDENTIFIER_EXPRESSION@591..592 - 0: JS_REFERENCE_IDENTIFIER@591..592 - 0: IDENT@591..592 "f" [] [] - 1: TS_TYPE_ARGUMENTS@592..598 - 0: L_ANGLE@592..593 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@593..597 - 0: TS_BOOLEAN_LITERAL_TYPE@593..597 - 0: TRUE_KW@593..597 "true" [] [] - 2: R_ANGLE@597..598 ">" [] [] - 1: SEMICOLON@598..599 ";" [] [] - 15: JS_EXPRESSION_STATEMENT@599..605 - 0: JS_BOOLEAN_LITERAL_EXPRESSION@599..604 - 0: TRUE_KW@599..604 "true" [Newline("\n")] [] - 1: SEMICOLON@604..605 ";" [] [] - 3: EOF@605..606 "" [Newline("\n")] [] + 2: JS_INITIALIZER_CLAUSE@586..595 + 0: EQ@586..588 "=" [] [Whitespace(" ")] + 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@588..595 + 0: JS_IDENTIFIER_EXPRESSION@588..589 + 0: JS_REFERENCE_IDENTIFIER@588..589 + 0: IDENT@588..589 "f" [] [] + 1: TS_TYPE_ARGUMENTS@589..595 + 0: L_ANGLE@589..590 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@590..594 + 0: TS_BOOLEAN_LITERAL_TYPE@590..594 + 0: TRUE_KW@590..594 "true" [] [] + 2: R_ANGLE@594..595 ">" [] [] + 1: SEMICOLON@595..596 ";" [] [] + 15: JS_EXPRESSION_STATEMENT@596..602 + 0: JS_BOOLEAN_LITERAL_EXPRESSION@596..601 + 0: TRUE_KW@596..601 "true" [Newline("\n")] [] + 1: SEMICOLON@601..602 ";" [] [] + 3: EOF@602..603 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts index 01093ae7fde..74af27aff2d 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -1,6 +1,6 @@ -let f1 = fx; -let f2 = fx; -let f3 = fx['test']; +let f1 = fx; +let f2 = fx; +let f3 = fx['test']; const a2 = f.g; // () => number const a3 = f.g; // () => U const a4 = f.g; // () => number diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast index 1f88a903bac..0ce8fcc79c2 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.rast @@ -60,66 +60,66 @@ JsModule { r_angle_token: R_ANGLE@65..66 ">" [] [], }, }, - semicolon_token: SEMICOLON@66..68 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@66..67 ";" [] [], }, TsTypeAliasDeclaration { - type_token: TYPE_KW@68..74 "type" [Newline("\n")] [Whitespace(" ")], + type_token: TYPE_KW@67..73 "type" [Newline("\n")] [Whitespace(" ")], binding_identifier: TsIdentifierBinding { - name_token: IDENT@74..75 "A" [] [], + name_token: IDENT@73..74 "A" [] [], }, type_parameters: TsTypeParameters { - l_angle_token: L_ANGLE@75..76 "<" [] [], + l_angle_token: L_ANGLE@74..75 "<" [] [], items: TsTypeParameterList [ TsTypeParameter { name: TsTypeParameterName { - ident_token: IDENT@76..77 "U" [] [], + ident_token: IDENT@75..76 "U" [] [], }, constraint: missing (optional), default: missing (optional), }, ], - r_angle_token: R_ANGLE@77..79 ">" [] [Whitespace(" ")], + r_angle_token: R_ANGLE@76..78 ">" [] [Whitespace(" ")], }, - eq_token: EQ@79..81 "=" [] [Whitespace(" ")], + eq_token: EQ@78..80 "=" [] [Whitespace(" ")], ty: TsReferenceType { name: JsReferenceIdentifier { - value_token: IDENT@81..93 "InstanceType" [] [], + value_token: IDENT@80..92 "InstanceType" [] [], }, type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@93..94 "<" [] [], + l_angle_token: L_ANGLE@92..93 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsTypeofType { - typeof_token: TYPEOF_KW@94..101 "typeof" [] [Whitespace(" ")], + typeof_token: TYPEOF_KW@93..100 "typeof" [] [Whitespace(" ")], expression_name: JsReferenceIdentifier { - value_token: IDENT@101..106 "Array" [] [], + value_token: IDENT@100..105 "Array" [] [], }, type_arguments: TsTypeArguments { - l_angle_token: L_ANGLE@106..107 "<" [] [], + l_angle_token: L_ANGLE@105..106 "<" [] [], ts_type_argument_list: TsTypeArgumentList [ TsReferenceType { name: JsReferenceIdentifier { - value_token: IDENT@107..108 "U" [] [], + value_token: IDENT@106..107 "U" [] [], }, type_arguments: missing (optional), }, ], - r_angle_token: R_ANGLE@108..109 ">" [] [], + r_angle_token: R_ANGLE@107..108 ">" [] [], }, }, ], - r_angle_token: R_ANGLE@109..110 ">" [] [], + r_angle_token: R_ANGLE@108..109 ">" [] [], }, }, - semicolon_token: SEMICOLON@110..112 ";" [] [Whitespace(" ")], + semicolon_token: SEMICOLON@109..110 ";" [] [], }, ], - eof_token: EOF@112..113 "" [Newline("\n")] [], + eof_token: EOF@110..111 "" [Newline("\n")] [], } -0: JS_MODULE@0..113 +0: JS_MODULE@0..111 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..112 + 2: JS_MODULE_ITEM_LIST@0..110 0: JS_VARIABLE_STATEMENT@0..15 0: JS_VARIABLE_DECLARATION@0..14 0: LET_KW@0..4 "let" [] [Whitespace(" ")] @@ -145,7 +145,7 @@ JsModule { 0: IDENT@32..33 "a" [] [] 2: (empty) 5: SEMICOLON@33..34 ";" [] [] - 2: TS_TYPE_ALIAS_DECLARATION@34..68 + 2: TS_TYPE_ALIAS_DECLARATION@34..67 0: TYPE_KW@34..40 "type" [Newline("\n")] [Whitespace(" ")] 1: TS_IDENTIFIER_BINDING@40..44 0: IDENT@40..44 "T21" [] [Whitespace(" ")] @@ -161,39 +161,39 @@ JsModule { 0: TS_STRING_TYPE@59..65 0: STRING_KW@59..65 "string" [] [] 2: R_ANGLE@65..66 ">" [] [] - 5: SEMICOLON@66..68 ";" [] [Whitespace(" ")] - 3: TS_TYPE_ALIAS_DECLARATION@68..112 - 0: TYPE_KW@68..74 "type" [Newline("\n")] [Whitespace(" ")] - 1: TS_IDENTIFIER_BINDING@74..75 - 0: IDENT@74..75 "A" [] [] - 2: TS_TYPE_PARAMETERS@75..79 - 0: L_ANGLE@75..76 "<" [] [] - 1: TS_TYPE_PARAMETER_LIST@76..77 - 0: TS_TYPE_PARAMETER@76..77 - 0: TS_TYPE_PARAMETER_NAME@76..77 - 0: IDENT@76..77 "U" [] [] + 5: SEMICOLON@66..67 ";" [] [] + 3: TS_TYPE_ALIAS_DECLARATION@67..110 + 0: TYPE_KW@67..73 "type" [Newline("\n")] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@73..74 + 0: IDENT@73..74 "A" [] [] + 2: TS_TYPE_PARAMETERS@74..78 + 0: L_ANGLE@74..75 "<" [] [] + 1: TS_TYPE_PARAMETER_LIST@75..76 + 0: TS_TYPE_PARAMETER@75..76 + 0: TS_TYPE_PARAMETER_NAME@75..76 + 0: IDENT@75..76 "U" [] [] 1: (empty) 2: (empty) - 2: R_ANGLE@77..79 ">" [] [Whitespace(" ")] - 3: EQ@79..81 "=" [] [Whitespace(" ")] - 4: TS_REFERENCE_TYPE@81..110 - 0: JS_REFERENCE_IDENTIFIER@81..93 - 0: IDENT@81..93 "InstanceType" [] [] - 1: TS_TYPE_ARGUMENTS@93..110 - 0: L_ANGLE@93..94 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@94..109 - 0: TS_TYPEOF_TYPE@94..109 - 0: TYPEOF_KW@94..101 "typeof" [] [Whitespace(" ")] - 1: JS_REFERENCE_IDENTIFIER@101..106 - 0: IDENT@101..106 "Array" [] [] - 2: TS_TYPE_ARGUMENTS@106..109 - 0: L_ANGLE@106..107 "<" [] [] - 1: TS_TYPE_ARGUMENT_LIST@107..108 - 0: TS_REFERENCE_TYPE@107..108 - 0: JS_REFERENCE_IDENTIFIER@107..108 - 0: IDENT@107..108 "U" [] [] + 2: R_ANGLE@76..78 ">" [] [Whitespace(" ")] + 3: EQ@78..80 "=" [] [Whitespace(" ")] + 4: TS_REFERENCE_TYPE@80..109 + 0: JS_REFERENCE_IDENTIFIER@80..92 + 0: IDENT@80..92 "InstanceType" [] [] + 1: TS_TYPE_ARGUMENTS@92..109 + 0: L_ANGLE@92..93 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@93..108 + 0: TS_TYPEOF_TYPE@93..108 + 0: TYPEOF_KW@93..100 "typeof" [] [Whitespace(" ")] + 1: JS_REFERENCE_IDENTIFIER@100..105 + 0: IDENT@100..105 "Array" [] [] + 2: TS_TYPE_ARGUMENTS@105..108 + 0: L_ANGLE@105..106 "<" [] [] + 1: TS_TYPE_ARGUMENT_LIST@106..107 + 0: TS_REFERENCE_TYPE@106..107 + 0: JS_REFERENCE_IDENTIFIER@106..107 + 0: IDENT@106..107 "U" [] [] 1: (empty) - 2: R_ANGLE@108..109 ">" [] [] - 2: R_ANGLE@109..110 ">" [] [] - 5: SEMICOLON@110..112 ";" [] [Whitespace(" ")] - 3: EOF@112..113 "" [Newline("\n")] [] + 2: R_ANGLE@107..108 ">" [] [] + 2: R_ANGLE@108..109 ">" [] [] + 5: SEMICOLON@109..110 ";" [] [] + 3: EOF@110..111 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts index b8f81473efb..805129ef7f4 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type.ts @@ -1,4 +1,4 @@ let a = "test"; type B = typeof a; -type T21 = typeof Array; -type A = InstanceType>; +type T21 = typeof Array; +type A = InstanceType>; From 9818ceb3d8cedf59c9ca52f7f7be649a84fb934d Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 12:01:21 +0800 Subject: [PATCH 14/26] =?UTF-8?q?fix:=20=F0=9F=90=9B=20lint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ts/expressions/expression_with_type_arguments.rs | 1 - crates/rome_js_parser/src/syntax/expr.rs | 3 +-- crates/rome_js_parser/src/syntax/typescript/types.rs | 7 +++---- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs index 29f078c4283..71be56bfce1 100644 --- a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs +++ b/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs @@ -1,7 +1,6 @@ use crate::{parentheses::NeedsParentheses, prelude::*}; use rome_formatter::write; use rome_js_syntax::{TsExpressionWithTypeArguments, TsExpressionWithTypeArgumentsFields}; -use rome_rowan::AstNode; #[derive(Debug, Clone, Default)] pub struct FormatTsExpressionWithTypeArguments; impl FormatNodeRule for FormatTsExpressionWithTypeArguments { diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index fba2438f1fe..e74e3ecd870 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -8,7 +8,6 @@ use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; use crate::parser::expected_node; -use crate::parser::rewrite_parser::RewriteCompletedMarker; use crate::parser::rewrite_parser::{RewriteMarker, RewriteParser}; use crate::parser::ToDiagnostic; use crate::parser::{expected_token, ParserProgress, RecoveryResult}; @@ -22,7 +21,7 @@ use crate::syntax::function::{ use crate::syntax::js_parse_error; use crate::syntax::js_parse_error::expected_simple_assignment_target; use crate::syntax::js_parse_error::{ - expected_expression, expected_identifier, expected_parameters, invalid_assignment_error, + expected_expression, expected_identifier, invalid_assignment_error, private_names_only_allowed_on_left_side_of_in_expression, }; use crate::syntax::jsx::parse_jsx_tag_expression; diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index a9e3e77903b..01550712320 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1291,7 +1291,7 @@ pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyn #[inline] pub fn can_follow_type_arguments_in_expr(cur_kind: JsSyntaxKind) -> bool { - match cur_kind { + matches!(cur_kind, T!['('] | BACKTICK // These tokens can't follow in a call expression, nor can they start an @@ -1316,9 +1316,8 @@ pub fn can_follow_type_arguments_in_expr(cur_kind: JsSyntaxKind) -> bool { | T![&] | T![|] | T!['}'] - | EOF => true, - _ => false, - } + | EOF + ) } pub(crate) fn parse_ts_type_arguments(p: &mut Parser) -> ParsedSyntax { From 706466a10808888db60100d88e19bdfaa6116ec5 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 12:06:09 +0800 Subject: [PATCH 15/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20lint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/main.rs | 9 --------- crates/rome_js_parser/src/syntax/expr.rs | 2 +- 2 files changed, 1 insertion(+), 10 deletions(-) delete mode 100644 crates/rome_js_parser/src/main.rs diff --git a/crates/rome_js_parser/src/main.rs b/crates/rome_js_parser/src/main.rs deleted file mode 100644 index 77a82a57a99..00000000000 --- a/crates/rome_js_parser/src/main.rs +++ /dev/null @@ -1,9 +0,0 @@ -use rome_js_parser::{parse, parse_module}; -use rome_js_syntax::{source_type, JsAnyRoot}; - -fn main() { - let source = "const b3 = f?.();"; - - let _root = parse(source, 0, source_type::SourceType::ts()).cast::(); - println!("{:#?}", _root.unwrap()); -} diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index e74e3ecd870..ed24be88579 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -773,7 +773,7 @@ fn parse_new_expr(p: &mut Parser, context: ExpressionContext) -> ParsedSyntax { return Present(m.complete(p, NEW_TARGET)); } - if let Some(lhs) = parse_primary_expression(p, context) + if let Some(lhs) = parse_primary_expression(p, context.and_ts_type_assertion_allowed(false)) .or_add_diagnostic(p, expected_expression) .map(|expr| parse_member_expression_rest(p, expr, context, false, &mut false)) { From 2184ba16ad75a507365cfaeb5f3f638908e861c0 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 4 Sep 2022 12:16:01 +0800 Subject: [PATCH 16/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 2 +- crates/rome_js_parser/src/syntax/typescript/types.rs | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index ed24be88579..a5647e0fdb8 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -21,7 +21,7 @@ use crate::syntax::function::{ use crate::syntax::js_parse_error; use crate::syntax::js_parse_error::expected_simple_assignment_target; use crate::syntax::js_parse_error::{ - expected_expression, expected_identifier, invalid_assignment_error, + expected_expression, expected_identifier, invalid_assignment_error, private_names_only_allowed_on_left_side_of_in_expression, }; use crate::syntax::jsx::parse_jsx_tag_expression; diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 01550712320..2be6a5c57f1 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -1291,7 +1291,8 @@ pub(crate) fn parse_ts_type_arguments_in_expression(p: &mut Parser) -> ParsedSyn #[inline] pub fn can_follow_type_arguments_in_expr(cur_kind: JsSyntaxKind) -> bool { - matches!(cur_kind, + matches!( + cur_kind, T!['('] | BACKTICK // These tokens can't follow in a call expression, nor can they start an From e9acc5b6a34eb3ed5a3cd1f7fcf6e8f115c03c57 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Thu, 8 Sep 2022 22:56:15 +0800 Subject: [PATCH 17/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20clean=20up?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 37 ++++-------------------- 1 file changed, 5 insertions(+), 32 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index a5647e0fdb8..7a1d9a9fc8d 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -709,29 +709,18 @@ fn parse_member_expression_rest( }; parse_template_literal(p, m, *in_optional_chain, true) } - _ => { + T![<] | T![<<] => { + // only those two possible token in cur position `parse_ts_type_arguments_in_expression` could possibly return a `Present(_)` if let Present(_) = parse_ts_type_arguments_in_expression(p) { let new_marker = lhs.precede(p); lhs = new_marker.complete(p, JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS); continue; - // match p.cur() { - // BACKTICK => { - // let m = lhs.precede(p); - // lhs = parse_template_literal(p, m, *in_optional_chain, true); - // continue; - // } - // T!['('] => { - // let m = lhs.precede(p); - // parse_call_arguments(p).ok(); - // lhs = m.complete(p, JsSyntaxKind::JS_CALL_EXPRESSION); - // continue; - // } - // _ => { - // } - // } }; break; } + _ => { + break; + } }; } @@ -1694,21 +1683,6 @@ fn parse_call_expression_rest( // type A = T; // a<(arg: T) => number, number, string>(); - // if TypeScript.is_supported(p) && matches!(p.cur(), T![<] | T![<<]) { - // // rewinds automatically if not a valid type arguments - // let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); - - // if type_arguments.is_some() { - // if p.at(BACKTICK) { - // lhs = parse_template_literal(p, m, optional_chain_call, true); - // continue; - // } - - // parse_call_arguments(p).or_add_diagnostic(p, expected_parameters); - // lhs = m.complete(p, JS_CALL_EXPRESSION); - // continue; - // } - // } let type_arguments = if optional_chain_call { let type_arguments = parse_ts_type_arguments_in_expression(p).ok(); if p.cur() == BACKTICK { @@ -1726,7 +1700,6 @@ fn parse_call_expression_rest( if type_arguments.is_some() || p.at(T!['(']) { parse_call_arguments(p) .or_add_diagnostic(p, |p, range| expected_node("(", range).to_diagnostic(p)); - // .expect("Expected parsed out arguments because the parser is positioned at '('"); lhs = m.complete(p, JS_CALL_EXPRESSION); continue; } From a1a419629dc80e884937c25c6154f8612e811285 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 10 Sep 2022 15:41:06 +0800 Subject: [PATCH 18/26] =?UTF-8?q?fix:=20=F0=9F=90=9B=20change=20expected?= =?UTF-8?q?=5Fnode=20to=20expected=5Ftoken?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 3 +-- .../test_data/inline/err/ts_instantiation_expressions1.rast | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 7a1d9a9fc8d..4dd26be883c 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -7,7 +7,6 @@ use super::typescript::*; use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; -use crate::parser::expected_node; use crate::parser::rewrite_parser::{RewriteMarker, RewriteParser}; use crate::parser::ToDiagnostic; use crate::parser::{expected_token, ParserProgress, RecoveryResult}; @@ -1699,7 +1698,7 @@ fn parse_call_expression_rest( if type_arguments.is_some() || p.at(T!['(']) { parse_call_arguments(p) - .or_add_diagnostic(p, |p, range| expected_node("(", range).to_diagnostic(p)); + .or_add_diagnostic(p, |p, _| expected_token(T!['(']).to_diagnostic(p)); lhs = m.complete(p, JS_CALL_EXPRESSION); continue; } diff --git a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast index d19533171fc..2f1021a34a4 100644 --- a/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast @@ -145,11 +145,11 @@ error[SyntaxError]: expected an expression but instead found ';' │ ^ Expected an expression here -- -error[SyntaxError]: expected a ( but instead found ';' +error[SyntaxError]: expected `(` but instead found `;` ┌─ ts_instantiation_expressions1.ts:2:23 │ 2 │ const b1 = f?.; // Error, `(` expected - │ ^ Expected a ( here + │ ^ unexpected -- const a8 = f; // Relational operator error From 4ce75ae2088e6e948c5bf76adf95a8906728b09b Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 10 Sep 2022 16:06:57 +0800 Subject: [PATCH 19/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20cr=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_parser/src/syntax/expr.rs | 3 + .../test_data/inline/err/ts_new_operator.rast | 88 +++++++++++++++++++ .../test_data/inline/err/ts_new_operator.ts | 1 + 3 files changed, 92 insertions(+) create mode 100644 crates/rome_js_parser/test_data/inline/err/ts_new_operator.rast create mode 100644 crates/rome_js_parser/test_data/inline/err/ts_new_operator.ts diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 4dd26be883c..791d4c8868c 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -726,6 +726,9 @@ fn parse_member_expression_rest( lhs } +// test_err ts ts_new_operator +// new A(); + // test ts ts_new_operator // var c2 = new T; // Ok // var x1 = new SS(); // OK diff --git a/crates/rome_js_parser/test_data/inline/err/ts_new_operator.rast b/crates/rome_js_parser/test_data/inline/err/ts_new_operator.rast new file mode 100644 index 00000000000..7c385b6b241 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_new_operator.rast @@ -0,0 +1,88 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + JsExpressionStatement { + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsNewExpression { + new_token: NEW_KW@0..4 "new" [] [Whitespace(" ")], + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@4..5 "A" [] [], + }, + }, + type_arguments: missing (optional), + arguments: missing (optional), + }, + operator_token: L_ANGLE@5..6 "<" [] [], + right: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@6..10 "test" [] [], + }, + }, + }, + operator_token: R_ANGLE@10..11 ">" [] [], + right: TsTypeAssertionExpression { + l_angle_token: L_ANGLE@11..12 "<" [] [], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@12..16 "test" [] [], + }, + type_arguments: missing (optional), + }, + r_angle_token: R_ANGLE@16..17 ">" [] [], + expression: JsParenthesizedExpression { + l_paren_token: L_PAREN@17..18 "(" [] [], + expression: missing (required), + r_paren_token: R_PAREN@18..19 ")" [] [], + }, + }, + }, + semicolon_token: SEMICOLON@19..20 ";" [] [], + }, + ], + eof_token: EOF@20..21 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..21 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..20 + 0: JS_EXPRESSION_STATEMENT@0..20 + 0: JS_BINARY_EXPRESSION@0..19 + 0: JS_BINARY_EXPRESSION@0..10 + 0: JS_NEW_EXPRESSION@0..5 + 0: NEW_KW@0..4 "new" [] [Whitespace(" ")] + 1: JS_IDENTIFIER_EXPRESSION@4..5 + 0: JS_REFERENCE_IDENTIFIER@4..5 + 0: IDENT@4..5 "A" [] [] + 2: (empty) + 3: (empty) + 1: L_ANGLE@5..6 "<" [] [] + 2: JS_IDENTIFIER_EXPRESSION@6..10 + 0: JS_REFERENCE_IDENTIFIER@6..10 + 0: IDENT@6..10 "test" [] [] + 1: R_ANGLE@10..11 ">" [] [] + 2: TS_TYPE_ASSERTION_EXPRESSION@11..19 + 0: L_ANGLE@11..12 "<" [] [] + 1: TS_REFERENCE_TYPE@12..16 + 0: JS_REFERENCE_IDENTIFIER@12..16 + 0: IDENT@12..16 "test" [] [] + 1: (empty) + 2: R_ANGLE@16..17 ">" [] [] + 3: JS_PARENTHESIZED_EXPRESSION@17..19 + 0: L_PAREN@17..18 "(" [] [] + 1: (empty) + 2: R_PAREN@18..19 ")" [] [] + 1: SEMICOLON@19..20 ";" [] [] + 3: EOF@20..21 "" [Newline("\n")] [] +-- +error[SyntaxError]: Parenthesized expression didnt contain anything + ┌─ ts_new_operator.ts:1:19 + │ +1 │ new A(); + │ ^ Expected an expression here + +-- +new A(); diff --git a/crates/rome_js_parser/test_data/inline/err/ts_new_operator.ts b/crates/rome_js_parser/test_data/inline/err/ts_new_operator.ts new file mode 100644 index 00000000000..3fa0c1b0252 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_new_operator.ts @@ -0,0 +1 @@ +new A(); From 10b49e586a2e00c788bad855b63237202b8c0f29 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 10 Sep 2022 17:16:55 +0800 Subject: [PATCH 20/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20rename=20Expressi?= =?UTF-8?q?onWithArguments=20to=20TsInstantiationExpr?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generated/node_factory.rs | 24 +-- .../src/generated/syntax_factory.rs | 52 +++--- crates/rome_js_formatter/src/generated.rs | 24 +-- .../src/js/any/expression.rs | 2 +- crates/rome_js_formatter/src/parentheses.rs | 6 +- ...guments.rs => instantiation_expression.rs} | 12 +- .../src/ts/expressions/mod.rs | 2 +- crates/rome_js_parser/src/syntax/expr.rs | 8 +- .../ok/ts_instantiation_expressions.rast | 48 ++--- crates/rome_js_syntax/src/generated/kind.rs | 2 +- crates/rome_js_syntax/src/generated/macros.rs | 10 +- crates/rome_js_syntax/src/generated/nodes.rs | 176 +++++++++--------- .../rome_js_syntax/src/generated/nodes_mut.rs | 28 +-- xtask/codegen/js.ungram | 5 +- xtask/codegen/src/kinds_src.rs | 2 +- 15 files changed, 199 insertions(+), 202 deletions(-) rename crates/rome_js_formatter/src/ts/expressions/{expression_with_type_arguments.rs => instantiation_expression.rs} (54%) diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 0822aef054d..9d617aa2ee9 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -4455,18 +4455,6 @@ pub fn ts_export_declare_clause( ], )) } -pub fn ts_expression_with_type_arguments( - expression: JsAnyExpression, - arguments: TsTypeArguments, -) -> TsExpressionWithTypeArguments { - TsExpressionWithTypeArguments::unwrap_cast(SyntaxNode::new_detached( - JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS, - [ - Some(SyntaxElement::Node(expression.into_syntax())), - Some(SyntaxElement::Node(arguments.into_syntax())), - ], - )) -} pub fn ts_extends_clause(extends_token: SyntaxToken, types: TsTypeList) -> TsExtendsClause { TsExtendsClause::unwrap_cast(SyntaxNode::new_detached( JsSyntaxKind::TS_EXTENDS_CLAUSE, @@ -4929,6 +4917,18 @@ pub fn ts_infer_type(infer_token: SyntaxToken, type_parameter: TsTypeParameterNa ], )) } +pub fn ts_instantiation_expression( + expression: JsAnyExpression, + arguments: TsTypeArguments, +) -> TsInstantiationExpression { + TsInstantiationExpression::unwrap_cast(SyntaxNode::new_detached( + JsSyntaxKind::TS_INSTANTIATION_EXPRESSION, + [ + Some(SyntaxElement::Node(expression.into_syntax())), + Some(SyntaxElement::Node(arguments.into_syntax())), + ], + )) +} pub fn ts_interface_declaration( interface_token: SyntaxToken, id: TsIdentifierBinding, diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index e990081f41a..e0033f74b61 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -6883,32 +6883,6 @@ impl SyntaxFactory for JsSyntaxFactory { } slots.into_node(TS_EXPORT_DECLARE_CLAUSE, children) } - TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { - let mut elements = (&children).into_iter(); - let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); - let mut current_element = elements.next(); - if let Some(element) = ¤t_element { - if JsAnyExpression::can_cast(element.kind()) { - slots.mark_present(); - current_element = elements.next(); - } - } - slots.next_slot(); - if let Some(element) = ¤t_element { - if TsTypeArguments::can_cast(element.kind()) { - slots.mark_present(); - current_element = elements.next(); - } - } - slots.next_slot(); - if current_element.is_some() { - return RawSyntaxNode::new( - TS_EXPRESSION_WITH_TYPE_ARGUMENTS.to_unknown(), - children.into_iter().map(Some), - ); - } - slots.into_node(TS_EXPRESSION_WITH_TYPE_ARGUMENTS, children) - } TS_EXTENDS_CLAUSE => { let mut elements = (&children).into_iter(); let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); @@ -7575,6 +7549,32 @@ impl SyntaxFactory for JsSyntaxFactory { } slots.into_node(TS_INFER_TYPE, children) } + TS_INSTANTIATION_EXPRESSION => { + let mut elements = (&children).into_iter(); + let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); + let mut current_element = elements.next(); + if let Some(element) = ¤t_element { + if JsAnyExpression::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if let Some(element) = ¤t_element { + if TsTypeArguments::can_cast(element.kind()) { + slots.mark_present(); + current_element = elements.next(); + } + } + slots.next_slot(); + if current_element.is_some() { + return RawSyntaxNode::new( + TS_INSTANTIATION_EXPRESSION.to_unknown(), + children.into_iter().map(Some), + ); + } + slots.into_node(TS_INSTANTIATION_EXPRESSION, children) + } TS_INTERFACE_DECLARATION => { let mut elements = (&children).into_iter(); let mut slots: RawNodeSlots<7usize> = RawNodeSlots::default(); diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index a91cc219b7f..46293030ee2 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -2786,36 +2786,36 @@ impl IntoFormat for rome_js_syntax::TsNonNullAssertionEx FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: non_null_assertion_expression :: FormatTsNonNullAssertionExpression :: default ()) } } -impl FormatRule - for crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments +impl FormatRule + for crate::ts::expressions::instantiation_expression::FormatTsInstantiationExpression { type Context = JsFormatContext; #[inline(always)] fn fmt( &self, - node: &rome_js_syntax::TsExpressionWithTypeArguments, + node: &rome_js_syntax::TsInstantiationExpression, f: &mut JsFormatter, ) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) + FormatNodeRule::::fmt(self, node, f) } } -impl<'a> AsFormat<'a> for rome_js_syntax::TsExpressionWithTypeArguments { +impl<'a> AsFormat<'a> for rome_js_syntax::TsInstantiationExpression { type Format = FormatRefWithRule< 'a, - rome_js_syntax::TsExpressionWithTypeArguments, - crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments, + rome_js_syntax::TsInstantiationExpression, + crate::ts::expressions::instantiation_expression::FormatTsInstantiationExpression, >; fn format(&'a self) -> Self::Format { - FormatRefWithRule :: new (self , crate :: ts :: expressions :: expression_with_type_arguments :: FormatTsExpressionWithTypeArguments :: default ()) + FormatRefWithRule :: new (self , crate :: ts :: expressions :: instantiation_expression :: FormatTsInstantiationExpression :: default ()) } } -impl IntoFormat for rome_js_syntax::TsExpressionWithTypeArguments { +impl IntoFormat for rome_js_syntax::TsInstantiationExpression { type Format = FormatOwnedWithRule< - rome_js_syntax::TsExpressionWithTypeArguments, - crate::ts::expressions::expression_with_type_arguments::FormatTsExpressionWithTypeArguments, + rome_js_syntax::TsInstantiationExpression, + crate::ts::expressions::instantiation_expression::FormatTsInstantiationExpression, >; fn into_format(self) -> Self::Format { - FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: expression_with_type_arguments :: FormatTsExpressionWithTypeArguments :: default ()) + FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: instantiation_expression :: FormatTsInstantiationExpression :: default ()) } } impl FormatRule diff --git a/crates/rome_js_formatter/src/js/any/expression.rs b/crates/rome_js_formatter/src/js/any/expression.rs index 4d50336fd40..070b3eb0726 100644 --- a/crates/rome_js_formatter/src/js/any/expression.rs +++ b/crates/rome_js_formatter/src/js/any/expression.rs @@ -42,7 +42,7 @@ impl FormatRule for FormatJsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(node) => node.format().fmt(f), JsAnyExpression::TsAsExpression(node) => node.format().fmt(f), JsAnyExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), - JsAnyExpression::TsExpressionWithTypeArguments(node) => node.format().fmt(f), + JsAnyExpression::TsInstantiationExpression(node) => node.format().fmt(f), JsAnyExpression::JsxTagExpression(node) => node.format().fmt(f), } } diff --git a/crates/rome_js_formatter/src/parentheses.rs b/crates/rome_js_formatter/src/parentheses.rs index 6ea6d68397a..940657259b4 100644 --- a/crates/rome_js_formatter/src/parentheses.rs +++ b/crates/rome_js_formatter/src/parentheses.rs @@ -158,9 +158,7 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses() } - JsAnyExpression::TsExpressionWithTypeArguments(arguments) => { - arguments.needs_parentheses() - } + JsAnyExpression::TsInstantiationExpression(arguments) => arguments.needs_parentheses(), } } @@ -255,7 +253,7 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses_with_parent(parent) } - JsAnyExpression::TsExpressionWithTypeArguments(expr) => { + JsAnyExpression::TsInstantiationExpression(expr) => { expr.needs_parentheses_with_parent(parent) } } diff --git a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs similarity index 54% rename from crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs rename to crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs index 71be56bfce1..3e196d4c118 100644 --- a/crates/rome_js_formatter/src/ts/expressions/expression_with_type_arguments.rs +++ b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs @@ -1,15 +1,15 @@ use crate::{parentheses::NeedsParentheses, prelude::*}; use rome_formatter::write; -use rome_js_syntax::{TsExpressionWithTypeArguments, TsExpressionWithTypeArgumentsFields}; +use rome_js_syntax::{TsInstantiationExpression, TsInstantiationExpressionFields}; #[derive(Debug, Clone, Default)] -pub struct FormatTsExpressionWithTypeArguments; -impl FormatNodeRule for FormatTsExpressionWithTypeArguments { +pub struct FormatTsInstantiationExpression; +impl FormatNodeRule for FormatTsInstantiationExpression { fn fmt_fields( &self, - node: &TsExpressionWithTypeArguments, + node: &TsInstantiationExpression, f: &mut JsFormatter, ) -> FormatResult<()> { - let TsExpressionWithTypeArgumentsFields { + let TsInstantiationExpressionFields { expression, arguments, } = node.as_fields(); @@ -18,7 +18,7 @@ impl FormatNodeRule for FormatTsExpressionWithTyp } } -impl NeedsParentheses for TsExpressionWithTypeArguments { +impl NeedsParentheses for TsInstantiationExpression { fn needs_parentheses_with_parent(&self, _: &rome_js_syntax::JsSyntaxNode) -> bool { false } diff --git a/crates/rome_js_formatter/src/ts/expressions/mod.rs b/crates/rome_js_formatter/src/ts/expressions/mod.rs index 52a129b8a05..c133f85b250 100644 --- a/crates/rome_js_formatter/src/ts/expressions/mod.rs +++ b/crates/rome_js_formatter/src/ts/expressions/mod.rs @@ -1,7 +1,7 @@ //! Generated file, do not edit by hand, see `xtask/codegen` pub(crate) mod as_expression; -pub(crate) mod expression_with_type_arguments; +pub(crate) mod instantiation_expression; pub(crate) mod name_with_type_arguments; pub(crate) mod non_null_assertion_expression; pub(crate) mod template_chunk_element; diff --git a/crates/rome_js_parser/src/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 791d4c8868c..752001b4546 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -703,7 +703,7 @@ fn parse_member_expression_rest( // test ts ts_optional_chain_call // (() => {})?.(); let m = match lhs.kind() { - TS_EXPRESSION_WITH_TYPE_ARGUMENTS => lhs.undo_completion(p), + TS_INSTANTIATION_EXPRESSION => lhs.undo_completion(p), _ => lhs.precede(p), }; parse_template_literal(p, m, *in_optional_chain, true) @@ -712,7 +712,7 @@ fn parse_member_expression_rest( // only those two possible token in cur position `parse_ts_type_arguments_in_expression` could possibly return a `Present(_)` if let Present(_) = parse_ts_type_arguments_in_expression(p) { let new_marker = lhs.precede(p); - lhs = new_marker.complete(p, JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS); + lhs = new_marker.complete(p, JsSyntaxKind::TS_INSTANTIATION_EXPRESSION); continue; }; break; @@ -768,7 +768,7 @@ fn parse_new_expr(p: &mut Parser, context: ExpressionContext) -> ParsedSyntax { .or_add_diagnostic(p, expected_expression) .map(|expr| parse_member_expression_rest(p, expr, context, false, &mut false)) { - if let TS_EXPRESSION_WITH_TYPE_ARGUMENTS = lhs.kind() { + if let TS_INSTANTIATION_EXPRESSION = lhs.kind() { lhs.undo_completion(p).abandon(p) }; } @@ -1669,7 +1669,7 @@ fn parse_call_expression_rest( // Cloning here is necessary because parsing out the type arguments may rewind in which // case we want to return the `lhs`. let m = match lhs.kind() { - TS_EXPRESSION_WITH_TYPE_ARGUMENTS if !p.at(T![?.]) => lhs.clone().undo_completion(p), + TS_INSTANTIATION_EXPRESSION if !p.at(T![?.]) => lhs.clone().undo_completion(p), _ => lhs.clone().precede(p), }; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast index af60bf7ded5..7f0e928501a 100644 --- a/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -13,7 +13,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@7..9 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@9..11 "fx" [] [], @@ -46,7 +46,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@28..30 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@30..32 "fx" [] [], @@ -83,7 +83,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@57..59 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsComputedMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { @@ -124,7 +124,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@88..90 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsStaticMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { @@ -164,7 +164,7 @@ JsModule { initializer: JsInitializerClause { eq_token: EQ@129..131 "=" [] [Whitespace(" ")], expression: JsStaticMemberExpression { - object: TsExpressionWithTypeArguments { + object: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@131..132 "f" [] [], @@ -202,9 +202,9 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@168..170 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsStaticMemberExpression { - object: TsExpressionWithTypeArguments { + object: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@170..171 "f" [] [], @@ -252,7 +252,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@217..219 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsComputedMemberExpression { object: JsIdentifierExpression { name: JsReferenceIdentifier { @@ -296,7 +296,7 @@ JsModule { expression: JsComputedMemberExpression { object: JsParenthesizedExpression { l_paren_token: L_PAREN@263..264 "(" [] [], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@264..265 "f" [] [], @@ -420,7 +420,7 @@ JsModule { initializer: JsInitializerClause { eq_token: EQ@358..360 "=" [] [Whitespace(" ")], expression: JsCallExpression { - callee: TsExpressionWithTypeArguments { + callee: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@360..361 "f" [] [], @@ -462,7 +462,7 @@ JsModule { initializer: JsInitializerClause { eq_token: EQ@384..386 "=" [] [Whitespace(" ")], expression: JsCallExpression { - callee: TsExpressionWithTypeArguments { + callee: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@386..387 "f" [] [], @@ -588,7 +588,7 @@ JsModule { variable_annotation: missing (optional), initializer: JsInitializerClause { eq_token: EQ@586..588 "=" [] [Whitespace(" ")], - expression: TsExpressionWithTypeArguments { + expression: TsInstantiationExpression { expression: JsIdentifierExpression { name: JsReferenceIdentifier { value_token: IDENT@588..589 "f" [] [], @@ -634,7 +634,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@7..19 0: EQ@7..9 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@9..19 + 1: TS_INSTANTIATION_EXPRESSION@9..19 0: JS_IDENTIFIER_EXPRESSION@9..11 0: JS_REFERENCE_IDENTIFIER@9..11 0: IDENT@9..11 "fx" [] [] @@ -655,7 +655,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@28..48 0: EQ@28..30 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@30..48 + 1: TS_INSTANTIATION_EXPRESSION@30..48 0: JS_IDENTIFIER_EXPRESSION@30..32 0: JS_REFERENCE_IDENTIFIER@30..32 0: IDENT@30..32 "fx" [] [] @@ -679,7 +679,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@57..77 0: EQ@57..59 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@59..77 + 1: TS_INSTANTIATION_EXPRESSION@59..77 0: JS_COMPUTED_MEMBER_EXPRESSION@59..69 0: JS_IDENTIFIER_EXPRESSION@59..61 0: JS_REFERENCE_IDENTIFIER@59..61 @@ -706,7 +706,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@88..101 0: EQ@88..90 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@90..101 + 1: TS_INSTANTIATION_EXPRESSION@90..101 0: JS_STATIC_MEMBER_EXPRESSION@90..93 0: JS_IDENTIFIER_EXPRESSION@90..91 0: JS_REFERENCE_IDENTIFIER@90..91 @@ -732,7 +732,7 @@ JsModule { 2: JS_INITIALIZER_CLAUSE@129..142 0: EQ@129..131 "=" [] [Whitespace(" ")] 1: JS_STATIC_MEMBER_EXPRESSION@131..142 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@131..140 + 0: TS_INSTANTIATION_EXPRESSION@131..140 0: JS_IDENTIFIER_EXPRESSION@131..132 0: JS_REFERENCE_IDENTIFIER@131..132 0: IDENT@131..132 "f" [] [] @@ -756,9 +756,9 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@168..189 0: EQ@168..170 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@170..189 + 1: TS_INSTANTIATION_EXPRESSION@170..189 0: JS_STATIC_MEMBER_EXPRESSION@170..181 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@170..179 + 0: TS_INSTANTIATION_EXPRESSION@170..179 0: JS_IDENTIFIER_EXPRESSION@170..171 0: JS_REFERENCE_IDENTIFIER@170..171 0: IDENT@170..171 "f" [] [] @@ -788,7 +788,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@217..233 0: EQ@217..219 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@219..233 + 1: TS_INSTANTIATION_EXPRESSION@219..233 0: JS_COMPUTED_MEMBER_EXPRESSION@219..225 0: JS_IDENTIFIER_EXPRESSION@219..220 0: JS_REFERENCE_IDENTIFIER@219..220 @@ -818,7 +818,7 @@ JsModule { 1: JS_COMPUTED_MEMBER_EXPRESSION@263..279 0: JS_PARENTHESIZED_EXPRESSION@263..274 0: L_PAREN@263..264 "(" [] [] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@264..273 + 1: TS_INSTANTIATION_EXPRESSION@264..273 0: JS_IDENTIFIER_EXPRESSION@264..265 0: JS_REFERENCE_IDENTIFIER@264..265 0: IDENT@264..265 "f" [] [] @@ -899,7 +899,7 @@ JsModule { 2: JS_INITIALIZER_CLAUSE@358..373 0: EQ@358..360 "=" [] [Whitespace(" ")] 1: JS_CALL_EXPRESSION@360..373 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@360..369 + 0: TS_INSTANTIATION_EXPRESSION@360..369 0: JS_IDENTIFIER_EXPRESSION@360..361 0: JS_REFERENCE_IDENTIFIER@360..361 0: IDENT@360..361 "f" [] [] @@ -927,7 +927,7 @@ JsModule { 2: JS_INITIALIZER_CLAUSE@384..407 0: EQ@384..386 "=" [] [Whitespace(" ")] 1: JS_CALL_EXPRESSION@386..407 - 0: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@386..395 + 0: TS_INSTANTIATION_EXPRESSION@386..395 0: JS_IDENTIFIER_EXPRESSION@386..387 0: JS_REFERENCE_IDENTIFIER@386..387 0: IDENT@386..387 "f" [] [] @@ -1009,7 +1009,7 @@ JsModule { 1: (empty) 2: JS_INITIALIZER_CLAUSE@586..595 0: EQ@586..588 "=" [] [Whitespace(" ")] - 1: TS_EXPRESSION_WITH_TYPE_ARGUMENTS@588..595 + 1: TS_INSTANTIATION_EXPRESSION@588..595 0: JS_IDENTIFIER_EXPRESSION@588..589 0: JS_REFERENCE_IDENTIFIER@588..589 0: IDENT@588..589 "f" [] [] diff --git a/crates/rome_js_syntax/src/generated/kind.rs b/crates/rome_js_syntax/src/generated/kind.rs index ed3fa3f92e1..2a8d161dcbd 100644 --- a/crates/rome_js_syntax/src/generated/kind.rs +++ b/crates/rome_js_syntax/src/generated/kind.rs @@ -441,7 +441,7 @@ pub enum JsSyntaxKind { TS_NON_NULL_ASSERTION_EXPRESSION, TS_TYPE_ASSERTION_EXPRESSION, TS_AS_EXPRESSION, - TS_EXPRESSION_WITH_TYPE_ARGUMENTS, + TS_INSTANTIATION_EXPRESSION, TS_ENUM_DECLARATION, TS_ENUM_MEMBER_LIST, TS_ENUM_MEMBER, diff --git a/crates/rome_js_syntax/src/generated/macros.rs b/crates/rome_js_syntax/src/generated/macros.rs index 9d44e41e85e..dfb34c7c652 100644 --- a/crates/rome_js_syntax/src/generated/macros.rs +++ b/crates/rome_js_syntax/src/generated/macros.rs @@ -848,11 +848,6 @@ macro_rules! map_syntax_node { let $pattern = unsafe { $crate::TsExportDeclareClause::new_unchecked(node) }; $body } - $crate::JsSyntaxKind::TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { - let $pattern = - unsafe { $crate::TsExpressionWithTypeArguments::new_unchecked(node) }; - $body - } $crate::JsSyntaxKind::TS_EXTENDS_CLAUSE => { let $pattern = unsafe { $crate::TsExtendsClause::new_unchecked(node) }; $body @@ -929,6 +924,11 @@ macro_rules! map_syntax_node { let $pattern = unsafe { $crate::TsInferType::new_unchecked(node) }; $body } + $crate::JsSyntaxKind::TS_INSTANTIATION_EXPRESSION => { + let $pattern = + unsafe { $crate::TsInstantiationExpression::new_unchecked(node) }; + $body + } $crate::JsSyntaxKind::TS_INTERFACE_DECLARATION => { let $pattern = unsafe { $crate::TsInterfaceDeclaration::new_unchecked(node) }; $body diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 62b42c12526..de017ed048f 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -8601,45 +8601,6 @@ pub struct TsExportDeclareClauseFields { pub declaration: SyntaxResult, } #[derive(Clone, PartialEq, Eq, Hash)] -pub struct TsExpressionWithTypeArguments { - pub(crate) syntax: SyntaxNode, -} -impl TsExpressionWithTypeArguments { - #[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) -> TsExpressionWithTypeArgumentsFields { - TsExpressionWithTypeArgumentsFields { - expression: self.expression(), - arguments: self.arguments(), - } - } - pub fn expression(&self) -> SyntaxResult { - support::required_node(&self.syntax, 0usize) - } - pub fn arguments(&self) -> SyntaxResult { - support::required_node(&self.syntax, 1usize) - } -} -#[cfg(feature = "serde")] -impl Serialize for TsExpressionWithTypeArguments { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - self.as_fields().serialize(serializer) - } -} -#[cfg_attr(feature = "serde", derive(Serialize))] -pub struct TsExpressionWithTypeArgumentsFields { - pub expression: SyntaxResult, - pub arguments: SyntaxResult, -} -#[derive(Clone, PartialEq, Eq, Hash)] pub struct TsExtendsClause { pub(crate) syntax: SyntaxNode, } @@ -9431,6 +9392,45 @@ pub struct TsInferTypeFields { pub type_parameter: SyntaxResult, } #[derive(Clone, PartialEq, Eq, Hash)] +pub struct TsInstantiationExpression { + pub(crate) syntax: SyntaxNode, +} +impl TsInstantiationExpression { + #[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) -> TsInstantiationExpressionFields { + TsInstantiationExpressionFields { + expression: self.expression(), + arguments: self.arguments(), + } + } + pub fn expression(&self) -> SyntaxResult { + support::required_node(&self.syntax, 0usize) + } + pub fn arguments(&self) -> SyntaxResult { + support::required_node(&self.syntax, 1usize) + } +} +#[cfg(feature = "serde")] +impl Serialize for TsInstantiationExpression { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + self.as_fields().serialize(serializer) + } +} +#[cfg_attr(feature = "serde", derive(Serialize))] +pub struct TsInstantiationExpressionFields { + pub expression: SyntaxResult, + pub arguments: SyntaxResult, +} +#[derive(Clone, PartialEq, Eq, Hash)] pub struct TsInterfaceDeclaration { pub(crate) syntax: SyntaxNode, } @@ -12712,7 +12712,7 @@ pub enum JsAnyExpression { JsxTagExpression(JsxTagExpression), NewTarget(NewTarget), TsAsExpression(TsAsExpression), - TsExpressionWithTypeArguments(TsExpressionWithTypeArguments), + TsInstantiationExpression(TsInstantiationExpression), TsNonNullAssertionExpression(TsNonNullAssertionExpression), TsTypeAssertionExpression(TsTypeAssertionExpression), } @@ -12915,9 +12915,9 @@ impl JsAnyExpression { _ => None, } } - pub fn as_ts_expression_with_type_arguments(&self) -> Option<&TsExpressionWithTypeArguments> { + pub fn as_ts_instantiation_expression(&self) -> Option<&TsInstantiationExpression> { match &self { - JsAnyExpression::TsExpressionWithTypeArguments(item) => Some(item), + JsAnyExpression::TsInstantiationExpression(item) => Some(item), _ => None, } } @@ -21741,35 +21741,6 @@ impl From for SyntaxNode { impl From for SyntaxElement { fn from(n: TsExportDeclareClause) -> SyntaxElement { n.syntax.into() } } -impl AstNode for TsExpressionWithTypeArguments { - type Language = Language; - const KIND_SET: SyntaxKindSet = - SyntaxKindSet::from_raw(RawSyntaxKind(TS_EXPRESSION_WITH_TYPE_ARGUMENTS as u16)); - fn can_cast(kind: SyntaxKind) -> bool { kind == TS_EXPRESSION_WITH_TYPE_ARGUMENTS } - 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 TsExpressionWithTypeArguments { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("TsExpressionWithTypeArguments") - .field("expression", &support::DebugSyntaxResult(self.expression())) - .field("arguments", &support::DebugSyntaxResult(self.arguments())) - .finish() - } -} -impl From for SyntaxNode { - fn from(n: TsExpressionWithTypeArguments) -> SyntaxNode { n.syntax } -} -impl From for SyntaxElement { - fn from(n: TsExpressionWithTypeArguments) -> SyntaxElement { n.syntax.into() } -} impl AstNode for TsExtendsClause { type Language = Language; const KIND_SET: SyntaxKindSet = @@ -22427,6 +22398,35 @@ impl From for SyntaxNode { impl From for SyntaxElement { fn from(n: TsInferType) -> SyntaxElement { n.syntax.into() } } +impl AstNode for TsInstantiationExpression { + type Language = Language; + const KIND_SET: SyntaxKindSet = + SyntaxKindSet::from_raw(RawSyntaxKind(TS_INSTANTIATION_EXPRESSION as u16)); + fn can_cast(kind: SyntaxKind) -> bool { kind == TS_INSTANTIATION_EXPRESSION } + 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 TsInstantiationExpression { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("TsInstantiationExpression") + .field("expression", &support::DebugSyntaxResult(self.expression())) + .field("arguments", &support::DebugSyntaxResult(self.arguments())) + .finish() + } +} +impl From for SyntaxNode { + fn from(n: TsInstantiationExpression) -> SyntaxNode { n.syntax } +} +impl From for SyntaxElement { + fn from(n: TsInstantiationExpression) -> SyntaxElement { n.syntax.into() } +} impl AstNode for TsInterfaceDeclaration { type Language = Language; const KIND_SET: SyntaxKindSet = @@ -26657,9 +26657,9 @@ impl From for JsAnyExpression { impl From for JsAnyExpression { fn from(node: TsAsExpression) -> JsAnyExpression { JsAnyExpression::TsAsExpression(node) } } -impl From for JsAnyExpression { - fn from(node: TsExpressionWithTypeArguments) -> JsAnyExpression { - JsAnyExpression::TsExpressionWithTypeArguments(node) +impl From for JsAnyExpression { + fn from(node: TsInstantiationExpression) -> JsAnyExpression { + JsAnyExpression::TsInstantiationExpression(node) } } impl From for JsAnyExpression { @@ -26707,7 +26707,7 @@ impl AstNode for JsAnyExpression { .union(JsxTagExpression::KIND_SET) .union(NewTarget::KIND_SET) .union(TsAsExpression::KIND_SET) - .union(TsExpressionWithTypeArguments::KIND_SET) + .union(TsInstantiationExpression::KIND_SET) .union(TsNonNullAssertionExpression::KIND_SET) .union(TsTypeAssertionExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { @@ -26744,7 +26744,7 @@ impl AstNode for JsAnyExpression { | JSX_TAG_EXPRESSION | NEW_TARGET | TS_AS_EXPRESSION - | TS_EXPRESSION_WITH_TYPE_ARGUMENTS + | TS_INSTANTIATION_EXPRESSION | TS_NON_NULL_ASSERTION_EXPRESSION | TS_TYPE_ASSERTION_EXPRESSION => true, k if JsAnyLiteralExpression::can_cast(k) => true, @@ -26819,10 +26819,8 @@ impl AstNode for JsAnyExpression { JSX_TAG_EXPRESSION => JsAnyExpression::JsxTagExpression(JsxTagExpression { syntax }), NEW_TARGET => JsAnyExpression::NewTarget(NewTarget { syntax }), TS_AS_EXPRESSION => JsAnyExpression::TsAsExpression(TsAsExpression { syntax }), - TS_EXPRESSION_WITH_TYPE_ARGUMENTS => { - JsAnyExpression::TsExpressionWithTypeArguments(TsExpressionWithTypeArguments { - syntax, - }) + TS_INSTANTIATION_EXPRESSION => { + JsAnyExpression::TsInstantiationExpression(TsInstantiationExpression { syntax }) } TS_NON_NULL_ASSERTION_EXPRESSION => { JsAnyExpression::TsNonNullAssertionExpression(TsNonNullAssertionExpression { @@ -26877,7 +26875,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => &it.syntax, JsAnyExpression::NewTarget(it) => &it.syntax, JsAnyExpression::TsAsExpression(it) => &it.syntax, - JsAnyExpression::TsExpressionWithTypeArguments(it) => &it.syntax, + JsAnyExpression::TsInstantiationExpression(it) => &it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => &it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => &it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.syntax(), @@ -26917,7 +26915,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => it.syntax, JsAnyExpression::NewTarget(it) => it.syntax, JsAnyExpression::TsAsExpression(it) => it.syntax, - JsAnyExpression::TsExpressionWithTypeArguments(it) => it.syntax, + JsAnyExpression::TsInstantiationExpression(it) => it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.into_syntax(), @@ -26960,7 +26958,7 @@ impl std::fmt::Debug for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::NewTarget(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsAsExpression(it) => std::fmt::Debug::fmt(it, f), - JsAnyExpression::TsExpressionWithTypeArguments(it) => std::fmt::Debug::fmt(it, f), + JsAnyExpression::TsInstantiationExpression(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsNonNullAssertionExpression(it) => std::fmt::Debug::fmt(it, f), JsAnyExpression::TsTypeAssertionExpression(it) => std::fmt::Debug::fmt(it, f), } @@ -27002,7 +27000,7 @@ impl From for SyntaxNode { JsAnyExpression::JsxTagExpression(it) => it.into(), JsAnyExpression::NewTarget(it) => it.into(), JsAnyExpression::TsAsExpression(it) => it.into(), - JsAnyExpression::TsExpressionWithTypeArguments(it) => it.into(), + JsAnyExpression::TsInstantiationExpression(it) => it.into(), JsAnyExpression::TsNonNullAssertionExpression(it) => it.into(), JsAnyExpression::TsTypeAssertionExpression(it) => it.into(), } @@ -32908,11 +32906,6 @@ impl std::fmt::Display for TsExportDeclareClause { std::fmt::Display::fmt(self.syntax(), f) } } -impl std::fmt::Display for TsExpressionWithTypeArguments { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) - } -} impl std::fmt::Display for TsExtendsClause { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { std::fmt::Display::fmt(self.syntax(), f) @@ -32998,6 +32991,11 @@ impl std::fmt::Display for TsInferType { 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) + } +} impl std::fmt::Display for TsInterfaceDeclaration { 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 d43baa3620d..ea730d2c4ee 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4212,20 +4212,6 @@ impl TsExportDeclareClause { ) } } -impl TsExpressionWithTypeArguments { - pub fn with_expression(self, element: JsAnyExpression) -> Self { - Self::unwrap_cast( - self.syntax - .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), - ) - } - pub fn with_arguments(self, element: TsTypeArguments) -> Self { - Self::unwrap_cast( - self.syntax - .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))), - ) - } -} impl TsExtendsClause { pub fn with_extends_token(self, element: SyntaxToken) -> Self { Self::unwrap_cast( @@ -4656,6 +4642,20 @@ impl TsInferType { ) } } +impl TsInstantiationExpression { + pub fn with_expression(self, element: JsAnyExpression) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), + ) + } + pub fn with_arguments(self, element: TsTypeArguments) -> Self { + Self::unwrap_cast( + self.syntax + .splice_slots(1usize..=1usize, once(Some(element.into_syntax().into()))), + ) + } +} impl TsInterfaceDeclaration { pub fn with_interface_token(self, element: SyntaxToken) -> Self { Self::unwrap_cast( diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index bb64c1afae1..412a7d23c4f 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -316,7 +316,7 @@ JsAnyExpression = | TsTypeAssertionExpression | TsAsExpression | TsNonNullAssertionExpression - | TsExpressionWithTypeArguments + | TsInstantiationExpression // JSX | JsxTagExpression @@ -2111,7 +2111,8 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression -TsExpressionWithTypeArguments = +// This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript +TsInstantiationExpression = expression: JsAnyExpression arguments: TsTypeArguments diff --git a/xtask/codegen/src/kinds_src.rs b/xtask/codegen/src/kinds_src.rs index 6a54077a537..c29e4578b0f 100644 --- a/xtask/codegen/src/kinds_src.rs +++ b/xtask/codegen/src/kinds_src.rs @@ -461,7 +461,7 @@ pub const JS_KINDS_SRC: KindsSrc = KindsSrc { "TS_NON_NULL_ASSERTION_EXPRESSION", "TS_TYPE_ASSERTION_EXPRESSION", "TS_AS_EXPRESSION", - "TS_EXPRESSION_WITH_TYPE_ARGUMENTS", + "TS_INSTANTIATION_EXPRESSION", "TS_ENUM_DECLARATION", "TS_ENUM_MEMBER_LIST", "TS_ENUM_MEMBER", From 013532e4d660bc23d0ae94395ee2797055505c6e Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sat, 10 Sep 2022 21:07:41 +0800 Subject: [PATCH 21/26] =?UTF-8?q?fix:=20=F0=9F=90=9B=20cr=20issues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/syntax/typescript/types.rs | 4 + .../test_data/inline/ok/ts_typeof_type2.rast | 90 +++++++++++++++++++ .../test_data/inline/ok/ts_typeof_type2.tsx | 2 + 3 files changed, 96 insertions(+) create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.rast create mode 100644 crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.tsx diff --git a/crates/rome_js_parser/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 2be6a5c57f1..a5035e00a4a 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -519,6 +519,10 @@ pub(crate) fn parse_ts_name(p: &mut Parser) -> ParsedSyntax { // type B = typeof a; // type T21 = typeof Array; // type A = InstanceType>; + +// test tsx ts_typeof_type2 +// type X = typeof Array +//
a
; fn parse_ts_typeof_type(p: &mut Parser) -> ParsedSyntax { if !p.at(T![typeof]) { return Absent; diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.rast b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.rast new file mode 100644 index 00000000000..a550bca8abf --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.rast @@ -0,0 +1,90 @@ +JsModule { + interpreter_token: missing (optional), + directives: JsDirectiveList [], + items: JsModuleItemList [ + TsTypeAliasDeclaration { + type_token: TYPE_KW@0..5 "type" [] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@5..7 "X" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + eq_token: EQ@7..9 "=" [] [Whitespace(" ")], + ty: TsTypeofType { + typeof_token: TYPEOF_KW@9..16 "typeof" [] [Whitespace(" ")], + expression_name: JsReferenceIdentifier { + value_token: IDENT@16..21 "Array" [] [], + }, + type_arguments: missing (optional), + }, + semicolon_token: missing (optional), + }, + JsExpressionStatement { + expression: JsxTagExpression { + tag: JsxElement { + opening_element: JsxOpeningElement { + l_angle_token: L_ANGLE@21..23 "<" [Newline("\n")] [], + name: JsxName { + value_token: JSX_IDENT@23..26 "div" [] [], + }, + type_arguments: missing (optional), + attributes: JsxAttributeList [], + r_angle_token: R_ANGLE@26..27 ">" [] [], + }, + children: JsxChildList [ + JsxText { + value_token: JSX_TEXT_LITERAL@27..28 "a" [] [], + }, + ], + closing_element: JsxClosingElement { + l_angle_token: L_ANGLE@28..29 "<" [] [], + slash_token: SLASH@29..30 "/" [] [], + name: JsxName { + value_token: JSX_IDENT@30..33 "div" [] [], + }, + r_angle_token: R_ANGLE@33..34 ">" [] [], + }, + }, + }, + semicolon_token: SEMICOLON@34..35 ";" [] [], + }, + ], + eof_token: EOF@35..36 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..36 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 2: JS_MODULE_ITEM_LIST@0..35 + 0: TS_TYPE_ALIAS_DECLARATION@0..21 + 0: TYPE_KW@0..5 "type" [] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@5..7 + 0: IDENT@5..7 "X" [] [Whitespace(" ")] + 2: (empty) + 3: EQ@7..9 "=" [] [Whitespace(" ")] + 4: TS_TYPEOF_TYPE@9..21 + 0: TYPEOF_KW@9..16 "typeof" [] [Whitespace(" ")] + 1: JS_REFERENCE_IDENTIFIER@16..21 + 0: IDENT@16..21 "Array" [] [] + 2: (empty) + 5: (empty) + 1: JS_EXPRESSION_STATEMENT@21..35 + 0: JSX_TAG_EXPRESSION@21..34 + 0: JSX_ELEMENT@21..34 + 0: JSX_OPENING_ELEMENT@21..27 + 0: L_ANGLE@21..23 "<" [Newline("\n")] [] + 1: JSX_NAME@23..26 + 0: JSX_IDENT@23..26 "div" [] [] + 2: (empty) + 3: JSX_ATTRIBUTE_LIST@26..26 + 4: R_ANGLE@26..27 ">" [] [] + 1: JSX_CHILD_LIST@27..28 + 0: JSX_TEXT@27..28 + 0: JSX_TEXT_LITERAL@27..28 "a" [] [] + 2: JSX_CLOSING_ELEMENT@28..34 + 0: L_ANGLE@28..29 "<" [] [] + 1: SLASH@29..30 "/" [] [] + 2: JSX_NAME@30..33 + 0: JSX_IDENT@30..33 "div" [] [] + 3: R_ANGLE@33..34 ">" [] [] + 1: SEMICOLON@34..35 ";" [] [] + 3: EOF@35..36 "" [Newline("\n")] [] diff --git a/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.tsx b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.tsx new file mode 100644 index 00000000000..17d547a5b6f --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_typeof_type2.tsx @@ -0,0 +1,2 @@ +type X = typeof Array +
a
; From 08f01a4ecc56f28196a84f2e6109bfbdf005a0d7 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Sun, 11 Sep 2022 18:59:46 +0800 Subject: [PATCH 22/26] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20checkpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generated/node_factory.rs | 2 +- .../src/generated/syntax_factory.rs | 2 +- crates/rome_js_formatter/src/generated.rs | 25 +++ .../src/js/any/left_hand_side_expression.rs | 20 ++ crates/rome_js_formatter/src/js/any/mod.rs | 1 + .../expressions/instantiation_expression.rs | 6 +- crates/rome_js_syntax/src/generated/nodes.rs | 212 +++++++++++++++++- .../rome_js_syntax/src/generated/nodes_mut.rs | 2 +- xtask/codegen/js.ungram | 10 +- 9 files changed, 271 insertions(+), 9 deletions(-) create mode 100644 crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 9d617aa2ee9..6f0eb26fc3d 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -4918,7 +4918,7 @@ pub fn ts_infer_type(infer_token: SyntaxToken, type_parameter: TsTypeParameterNa )) } pub fn ts_instantiation_expression( - expression: JsAnyExpression, + expression: JsLeftHandSideExpression, arguments: TsTypeArguments, ) -> TsInstantiationExpression { TsInstantiationExpression::unwrap_cast(SyntaxNode::new_detached( diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index e0033f74b61..909bdd35965 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -7554,7 +7554,7 @@ impl SyntaxFactory for JsSyntaxFactory { let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); let mut current_element = elements.next(); if let Some(element) = ¤t_element { - if JsAnyExpression::can_cast(element.kind()) { + if JsLeftHandSideExpression::can_cast(element.kind()) { slots.mark_present(); current_element = elements.next(); } diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index 46293030ee2..5bd2fc3e109 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -11983,6 +11983,31 @@ impl IntoFormat for rome_js_syntax::TsAnyTemplateElement ) } } +impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} impl<'a> AsFormat<'a> for rome_js_syntax::JsxAnyTag { type Format = FormatRefWithRule<'a, rome_js_syntax::JsxAnyTag, crate::jsx::any::tag::FormatJsxAnyTag>; diff --git a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs new file mode 100644 index 00000000000..d28bd45493c --- /dev/null +++ b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs @@ -0,0 +1,20 @@ +//! Generated file, do not edit by hand, see `xtask/codegen` + +use crate::prelude::*; +use rome_js_syntax::JsLeftHandSideExpression; +#[derive(Debug, Clone, Default)] +pub struct FormatJsLeftHandSideExpression; +impl FormatRule for FormatJsLeftHandSideExpression { + type Context = JsFormatContext; + fn fmt(&self, node: &JsLeftHandSideExpression, f: &mut JsFormatter) -> FormatResult<()> { + match node { + JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsStaticMemberExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsComputedMemberExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsIdentifierExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::TsTypeAssertionExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::TsAsExpression(node) => node.format().fmt(f), + } + } +} diff --git a/crates/rome_js_formatter/src/js/any/mod.rs b/crates/rome_js_formatter/src/js/any/mod.rs index f058d98aa30..4481e496148 100644 --- a/crates/rome_js_formatter/src/js/any/mod.rs +++ b/crates/rome_js_formatter/src/js/any/mod.rs @@ -27,6 +27,7 @@ pub(crate) mod function_body; pub(crate) mod import_assertion_entry; pub(crate) mod import_clause; pub(crate) mod in_property; +pub(crate) mod left_hand_side_expression; pub(crate) mod literal_expression; pub(crate) mod method_modifier; pub(crate) mod module_item; diff --git a/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs index 3e196d4c118..cde35615a0d 100644 --- a/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs +++ b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs @@ -1,4 +1,4 @@ -use crate::{parentheses::NeedsParentheses, prelude::*}; +use crate::{parentheses::{NeedsParentheses, unary_like_expression_needs_parentheses}, prelude::*}; use rome_formatter::write; use rome_js_syntax::{TsInstantiationExpression, TsInstantiationExpressionFields}; #[derive(Debug, Clone, Default)] @@ -19,7 +19,7 @@ impl FormatNodeRule for FormatTsInstantiationExpressi } impl NeedsParentheses for TsInstantiationExpression { - fn needs_parentheses_with_parent(&self, _: &rome_js_syntax::JsSyntaxNode) -> bool { - false + fn needs_parentheses_with_parent(&self, parent: &rome_js_syntax::JsSyntaxNode) -> bool { + unary_like_expression_needs_parentheses(self.syntax(), parent) } } diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index de017ed048f..8d382b5877c 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -9409,7 +9409,7 @@ impl TsInstantiationExpression { arguments: self.arguments(), } } - pub fn expression(&self) -> SyntaxResult { + pub fn expression(&self) -> SyntaxResult { support::required_node(&self.syntax, 0usize) } pub fn arguments(&self) -> SyntaxResult { @@ -9427,7 +9427,7 @@ impl Serialize for TsInstantiationExpression { } #[cfg_attr(feature = "serde", derive(Serialize))] pub struct TsInstantiationExpressionFields { - pub expression: SyntaxResult, + pub expression: SyntaxResult, pub arguments: SyntaxResult, } #[derive(Clone, PartialEq, Eq, Hash)] @@ -13819,6 +13819,61 @@ impl JsAnyTemplateElement { } #[derive(Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize))] +pub enum JsLeftHandSideExpression { + JsComputedMemberExpression(JsComputedMemberExpression), + JsIdentifierExpression(JsIdentifierExpression), + JsParenthesizedExpression(JsParenthesizedExpression), + JsStaticMemberExpression(JsStaticMemberExpression), + TsAsExpression(TsAsExpression), + TsNonNullAssertionExpression(TsNonNullAssertionExpression), + TsTypeAssertionExpression(TsTypeAssertionExpression), +} +impl JsLeftHandSideExpression { + pub fn as_js_computed_member_expression(&self) -> Option<&JsComputedMemberExpression> { + match &self { + JsLeftHandSideExpression::JsComputedMemberExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_identifier_expression(&self) -> Option<&JsIdentifierExpression> { + match &self { + JsLeftHandSideExpression::JsIdentifierExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_parenthesized_expression(&self) -> Option<&JsParenthesizedExpression> { + match &self { + JsLeftHandSideExpression::JsParenthesizedExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_static_member_expression(&self) -> Option<&JsStaticMemberExpression> { + match &self { + JsLeftHandSideExpression::JsStaticMemberExpression(item) => Some(item), + _ => None, + } + } + pub fn as_ts_as_expression(&self) -> Option<&TsAsExpression> { + match &self { + JsLeftHandSideExpression::TsAsExpression(item) => Some(item), + _ => None, + } + } + pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { + match &self { + JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), + _ => None, + } + } + pub fn as_ts_type_assertion_expression(&self) -> Option<&TsTypeAssertionExpression> { + match &self { + JsLeftHandSideExpression::TsTypeAssertionExpression(item) => Some(item), + _ => None, + } + } +} +#[derive(Clone, PartialEq, Eq, Hash)] +#[cfg_attr(feature = "serde", derive(Serialize))] pub enum JsxAnyAttribute { JsxAttribute(JsxAttribute), JsxSpreadAttribute(JsxSpreadAttribute), @@ -29310,6 +29365,154 @@ impl From for SyntaxElement { node.into() } } +impl From for JsLeftHandSideExpression { + fn from(node: JsComputedMemberExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsComputedMemberExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsIdentifierExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsIdentifierExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsParenthesizedExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsParenthesizedExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsStaticMemberExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsStaticMemberExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: TsAsExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::TsAsExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: TsNonNullAssertionExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::TsNonNullAssertionExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: TsTypeAssertionExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::TsTypeAssertionExpression(node) + } +} +impl AstNode for JsLeftHandSideExpression { + type Language = Language; + const KIND_SET: SyntaxKindSet = JsComputedMemberExpression::KIND_SET + .union(JsIdentifierExpression::KIND_SET) + .union(JsParenthesizedExpression::KIND_SET) + .union(JsStaticMemberExpression::KIND_SET) + .union(TsAsExpression::KIND_SET) + .union(TsNonNullAssertionExpression::KIND_SET) + .union(TsTypeAssertionExpression::KIND_SET); + fn can_cast(kind: SyntaxKind) -> bool { + matches!( + kind, + JS_COMPUTED_MEMBER_EXPRESSION + | JS_IDENTIFIER_EXPRESSION + | JS_PARENTHESIZED_EXPRESSION + | JS_STATIC_MEMBER_EXPRESSION + | TS_AS_EXPRESSION + | TS_NON_NULL_ASSERTION_EXPRESSION + | TS_TYPE_ASSERTION_EXPRESSION + ) + } + fn cast(syntax: SyntaxNode) -> Option { + let res = match syntax.kind() { + JS_COMPUTED_MEMBER_EXPRESSION => { + JsLeftHandSideExpression::JsComputedMemberExpression(JsComputedMemberExpression { + syntax, + }) + } + JS_IDENTIFIER_EXPRESSION => { + JsLeftHandSideExpression::JsIdentifierExpression(JsIdentifierExpression { syntax }) + } + JS_PARENTHESIZED_EXPRESSION => { + JsLeftHandSideExpression::JsParenthesizedExpression(JsParenthesizedExpression { + syntax, + }) + } + JS_STATIC_MEMBER_EXPRESSION => { + JsLeftHandSideExpression::JsStaticMemberExpression(JsStaticMemberExpression { + syntax, + }) + } + TS_AS_EXPRESSION => JsLeftHandSideExpression::TsAsExpression(TsAsExpression { syntax }), + TS_NON_NULL_ASSERTION_EXPRESSION => { + JsLeftHandSideExpression::TsNonNullAssertionExpression( + TsNonNullAssertionExpression { syntax }, + ) + } + TS_TYPE_ASSERTION_EXPRESSION => { + JsLeftHandSideExpression::TsTypeAssertionExpression(TsTypeAssertionExpression { + syntax, + }) + } + _ => return None, + }; + Some(res) + } + fn syntax(&self) -> &SyntaxNode { + match self { + JsLeftHandSideExpression::JsComputedMemberExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsIdentifierExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsParenthesizedExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsStaticMemberExpression(it) => &it.syntax, + JsLeftHandSideExpression::TsAsExpression(it) => &it.syntax, + JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => &it.syntax, + JsLeftHandSideExpression::TsTypeAssertionExpression(it) => &it.syntax, + } + } + fn into_syntax(self) -> SyntaxNode { + match self { + JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.syntax, + JsLeftHandSideExpression::JsIdentifierExpression(it) => it.syntax, + JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.syntax, + JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.syntax, + JsLeftHandSideExpression::TsAsExpression(it) => it.syntax, + JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.syntax, + JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.syntax, + } + } +} +impl std::fmt::Debug for JsLeftHandSideExpression { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + JsLeftHandSideExpression::JsComputedMemberExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsIdentifierExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsParenthesizedExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsStaticMemberExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::TsAsExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => { + std::fmt::Debug::fmt(it, f) + } + JsLeftHandSideExpression::TsTypeAssertionExpression(it) => std::fmt::Debug::fmt(it, f), + } + } +} +impl From for SyntaxNode { + fn from(n: JsLeftHandSideExpression) -> SyntaxNode { + match n { + JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.into(), + JsLeftHandSideExpression::JsIdentifierExpression(it) => it.into(), + JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.into(), + JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.into(), + JsLeftHandSideExpression::TsAsExpression(it) => it.into(), + JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.into(), + JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.into(), + } + } +} +impl From for SyntaxElement { + fn from(n: JsLeftHandSideExpression) -> SyntaxElement { + let node: SyntaxNode = n.into(); + node.into() + } +} impl From for JsxAnyAttribute { fn from(node: JsxAttribute) -> JsxAnyAttribute { JsxAnyAttribute::JsxAttribute(node) } } @@ -31796,6 +31999,11 @@ impl std::fmt::Display for JsAnyTemplateElement { std::fmt::Display::fmt(self.syntax(), f) } } +impl std::fmt::Display for JsLeftHandSideExpression { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + std::fmt::Display::fmt(self.syntax(), f) + } +} impl std::fmt::Display for JsxAnyAttribute { 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 ea730d2c4ee..9f80d08bb09 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4643,7 +4643,7 @@ impl TsInferType { } } impl TsInstantiationExpression { - pub fn with_expression(self, element: JsAnyExpression) -> Self { + pub fn with_expression(self, element: JsLeftHandSideExpression) -> Self { Self::unwrap_cast( self.syntax .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 412a7d23c4f..92e506e6d9a 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -2111,9 +2111,17 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression +JsLeftHandSideExpression = + JsParenthesizedExpression + | JsStaticMemberExpression + | JsComputedMemberExpression + | JsIdentifierExpression + | TsNonNullAssertionExpression + | TsTypeAssertionExpression + | TsAsExpression // This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript TsInstantiationExpression = - expression: JsAnyExpression + expression: JsLeftHandSideExpression arguments: TsTypeArguments TsAsExpression = From 3508048894d30086bbe2328fd2daf87c75e076ac Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Mon, 12 Sep 2022 23:38:55 +0800 Subject: [PATCH 23/26] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20more=20strict=20co?= =?UTF-8?q?nstraint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_formatter/src/generated.rs | 306 ++++++++-------- .../src/js/any/left_hand_side_expression.rs | 18 +- crates/rome_js_syntax/src/generated/nodes.rs | 333 +++++++++++++++--- xtask/codegen/js.ungram | 30 +- 4 files changed, 479 insertions(+), 208 deletions(-) diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index 5bd2fc3e109..f7c2a920890 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -2856,6 +2856,134 @@ impl IntoFormat for rome_js_syntax::JsxTagExpression { ) } } +impl FormatRule for crate::jsx::tag::element::FormatJsxElement { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxElement, + crate::jsx::tag::element::FormatJsxElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl IntoFormat for rome_js_syntax::JsxElement { + type Format = + FormatOwnedWithRule; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl FormatRule + for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &rome_js_syntax::JsxSelfClosingElement, + f: &mut JsFormatter, + ) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxFragment { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} +impl FormatRule + for crate::js::auxiliary::private_name::FormatJsPrivateName +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsPrivateName { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} impl FormatRule for crate::ts::expressions::type_arguments::FormatTsTypeArguments { @@ -3280,40 +3408,6 @@ impl IntoFormat for rome_js_syntax::JsReferenceIdentifie ) } } -impl FormatRule - for crate::js::auxiliary::private_name::FormatJsPrivateName -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsPrivateName { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} impl FormatRule for crate::js::objects::literal_member_name::FormatJsLiteralMemberName { @@ -8796,100 +8890,6 @@ impl IntoFormat for rome_js_syntax::TsQualifiedName { ) } } -impl FormatRule for crate::jsx::tag::element::FormatJsxElement { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxElement, - crate::jsx::tag::element::FormatJsxElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl IntoFormat for rome_js_syntax::JsxElement { - type Format = - FormatOwnedWithRule; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl FormatRule - for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt( - &self, - node: &rome_js_syntax::JsxSelfClosingElement, - f: &mut JsFormatter, - ) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxFragment { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} impl FormatRule for crate::jsx::tag::opening_element::FormatJsxOpeningElement { @@ -10839,6 +10839,31 @@ impl IntoFormat for rome_js_syntax::JsAnyLiteralExpressi ) } } +impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsLeftHandSideExpression, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), + ) + } +} impl<'a> AsFormat<'a> for rome_js_syntax::JsAnyTemplateElement { type Format = FormatRefWithRule< 'a, @@ -11983,31 +12008,6 @@ impl IntoFormat for rome_js_syntax::TsAnyTemplateElement ) } } -impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} impl<'a> AsFormat<'a> for rome_js_syntax::JsxAnyTag { type Format = FormatRefWithRule<'a, rome_js_syntax::JsxAnyTag, crate::jsx::any::tag::FormatJsxAnyTag>; diff --git a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs index d28bd45493c..142053291cc 100644 --- a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs +++ b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs @@ -8,13 +8,25 @@ impl FormatRule for FormatJsLeftHandSideExpression { type Context = JsFormatContext; fn fmt(&self, node: &JsLeftHandSideExpression, f: &mut JsFormatter) -> FormatResult<()> { match node { - JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsStaticMemberExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsComputedMemberExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsNewExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsCallExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxElement(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxSelfClosingElement(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsxFragment(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsTemplate(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsArrayExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsObjectExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsClassExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsFunctionExpression(node) => node.format().fmt(f), JsLeftHandSideExpression::JsIdentifierExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsAnyLiteralExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::TsInstantiationExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsThisExpression(node) => node.format().fmt(f), + JsLeftHandSideExpression::JsPrivateName(node) => node.format().fmt(f), JsLeftHandSideExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsTypeAssertionExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsAsExpression(node) => node.format().fmt(f), } } } diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 8d382b5877c..6c1f2fbeaf0 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -13820,54 +13820,138 @@ impl JsAnyTemplateElement { #[derive(Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize))] pub enum JsLeftHandSideExpression { + JsAnyLiteralExpression(JsAnyLiteralExpression), + JsArrayExpression(JsArrayExpression), + JsCallExpression(JsCallExpression), + JsClassExpression(JsClassExpression), JsComputedMemberExpression(JsComputedMemberExpression), + JsFunctionExpression(JsFunctionExpression), JsIdentifierExpression(JsIdentifierExpression), + JsNewExpression(JsNewExpression), + JsObjectExpression(JsObjectExpression), JsParenthesizedExpression(JsParenthesizedExpression), + JsPrivateName(JsPrivateName), JsStaticMemberExpression(JsStaticMemberExpression), - TsAsExpression(TsAsExpression), + JsTemplate(JsTemplate), + JsThisExpression(JsThisExpression), + JsxElement(JsxElement), + JsxFragment(JsxFragment), + JsxSelfClosingElement(JsxSelfClosingElement), + TsInstantiationExpression(TsInstantiationExpression), TsNonNullAssertionExpression(TsNonNullAssertionExpression), - TsTypeAssertionExpression(TsTypeAssertionExpression), } impl JsLeftHandSideExpression { + pub fn as_js_any_literal_expression(&self) -> Option<&JsAnyLiteralExpression> { + match &self { + JsLeftHandSideExpression::JsAnyLiteralExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_array_expression(&self) -> Option<&JsArrayExpression> { + match &self { + JsLeftHandSideExpression::JsArrayExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_call_expression(&self) -> Option<&JsCallExpression> { + match &self { + JsLeftHandSideExpression::JsCallExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_class_expression(&self) -> Option<&JsClassExpression> { + match &self { + JsLeftHandSideExpression::JsClassExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_computed_member_expression(&self) -> Option<&JsComputedMemberExpression> { match &self { JsLeftHandSideExpression::JsComputedMemberExpression(item) => Some(item), _ => None, } } + pub fn as_js_function_expression(&self) -> Option<&JsFunctionExpression> { + match &self { + JsLeftHandSideExpression::JsFunctionExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_identifier_expression(&self) -> Option<&JsIdentifierExpression> { match &self { JsLeftHandSideExpression::JsIdentifierExpression(item) => Some(item), _ => None, } } + pub fn as_js_new_expression(&self) -> Option<&JsNewExpression> { + match &self { + JsLeftHandSideExpression::JsNewExpression(item) => Some(item), + _ => None, + } + } + pub fn as_js_object_expression(&self) -> Option<&JsObjectExpression> { + match &self { + JsLeftHandSideExpression::JsObjectExpression(item) => Some(item), + _ => None, + } + } pub fn as_js_parenthesized_expression(&self) -> Option<&JsParenthesizedExpression> { match &self { JsLeftHandSideExpression::JsParenthesizedExpression(item) => Some(item), _ => None, } } + pub fn as_js_private_name(&self) -> Option<&JsPrivateName> { + match &self { + JsLeftHandSideExpression::JsPrivateName(item) => Some(item), + _ => None, + } + } pub fn as_js_static_member_expression(&self) -> Option<&JsStaticMemberExpression> { match &self { JsLeftHandSideExpression::JsStaticMemberExpression(item) => Some(item), _ => None, } } - pub fn as_ts_as_expression(&self) -> Option<&TsAsExpression> { + pub fn as_js_template(&self) -> Option<&JsTemplate> { match &self { - JsLeftHandSideExpression::TsAsExpression(item) => Some(item), + JsLeftHandSideExpression::JsTemplate(item) => Some(item), _ => None, } } - pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { + pub fn as_js_this_expression(&self) -> Option<&JsThisExpression> { match &self { - JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), + JsLeftHandSideExpression::JsThisExpression(item) => Some(item), _ => None, } } - pub fn as_ts_type_assertion_expression(&self) -> Option<&TsTypeAssertionExpression> { + pub fn as_jsx_element(&self) -> Option<&JsxElement> { + match &self { + JsLeftHandSideExpression::JsxElement(item) => Some(item), + _ => None, + } + } + pub fn as_jsx_fragment(&self) -> Option<&JsxFragment> { match &self { - JsLeftHandSideExpression::TsTypeAssertionExpression(item) => Some(item), + JsLeftHandSideExpression::JsxFragment(item) => Some(item), + _ => None, + } + } + pub fn as_jsx_self_closing_element(&self) -> Option<&JsxSelfClosingElement> { + match &self { + JsLeftHandSideExpression::JsxSelfClosingElement(item) => Some(item), + _ => None, + } + } + pub fn as_ts_instantiation_expression(&self) -> Option<&TsInstantiationExpression> { + match &self { + JsLeftHandSideExpression::TsInstantiationExpression(item) => Some(item), + _ => None, + } + } + pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { + match &self { + JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), _ => None, } } @@ -29365,29 +29449,89 @@ impl From for SyntaxElement { node.into() } } +impl From for JsLeftHandSideExpression { + fn from(node: JsArrayExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsArrayExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsCallExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsCallExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsClassExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsClassExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsComputedMemberExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsComputedMemberExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsFunctionExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsFunctionExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsIdentifierExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsIdentifierExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsNewExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsNewExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsObjectExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsObjectExpression(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsParenthesizedExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsParenthesizedExpression(node) } } +impl From for JsLeftHandSideExpression { + fn from(node: JsPrivateName) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsPrivateName(node) + } +} impl From for JsLeftHandSideExpression { fn from(node: JsStaticMemberExpression) -> JsLeftHandSideExpression { JsLeftHandSideExpression::JsStaticMemberExpression(node) } } -impl From for JsLeftHandSideExpression { - fn from(node: TsAsExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsAsExpression(node) +impl From for JsLeftHandSideExpression { + fn from(node: JsTemplate) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsTemplate(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsThisExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsThisExpression(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxElement) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxElement(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxFragment) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxFragment(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: JsxSelfClosingElement) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::JsxSelfClosingElement(node) + } +} +impl From for JsLeftHandSideExpression { + fn from(node: TsInstantiationExpression) -> JsLeftHandSideExpression { + JsLeftHandSideExpression::TsInstantiationExpression(node) } } impl From for JsLeftHandSideExpression { @@ -29395,115 +29539,216 @@ impl From for JsLeftHandSideExpression { JsLeftHandSideExpression::TsNonNullAssertionExpression(node) } } -impl From for JsLeftHandSideExpression { - fn from(node: TsTypeAssertionExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsTypeAssertionExpression(node) - } -} impl AstNode for JsLeftHandSideExpression { type Language = Language; - const KIND_SET: SyntaxKindSet = JsComputedMemberExpression::KIND_SET + const KIND_SET: SyntaxKindSet = JsAnyLiteralExpression::KIND_SET + .union(JsArrayExpression::KIND_SET) + .union(JsCallExpression::KIND_SET) + .union(JsClassExpression::KIND_SET) + .union(JsComputedMemberExpression::KIND_SET) + .union(JsFunctionExpression::KIND_SET) .union(JsIdentifierExpression::KIND_SET) + .union(JsNewExpression::KIND_SET) + .union(JsObjectExpression::KIND_SET) .union(JsParenthesizedExpression::KIND_SET) + .union(JsPrivateName::KIND_SET) .union(JsStaticMemberExpression::KIND_SET) - .union(TsAsExpression::KIND_SET) - .union(TsNonNullAssertionExpression::KIND_SET) - .union(TsTypeAssertionExpression::KIND_SET); + .union(JsTemplate::KIND_SET) + .union(JsThisExpression::KIND_SET) + .union(JsxElement::KIND_SET) + .union(JsxFragment::KIND_SET) + .union(JsxSelfClosingElement::KIND_SET) + .union(TsInstantiationExpression::KIND_SET) + .union(TsNonNullAssertionExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { - matches!( - kind, - JS_COMPUTED_MEMBER_EXPRESSION - | JS_IDENTIFIER_EXPRESSION - | JS_PARENTHESIZED_EXPRESSION - | JS_STATIC_MEMBER_EXPRESSION - | TS_AS_EXPRESSION - | TS_NON_NULL_ASSERTION_EXPRESSION - | TS_TYPE_ASSERTION_EXPRESSION - ) + match kind { + JS_ARRAY_EXPRESSION + | JS_CALL_EXPRESSION + | JS_CLASS_EXPRESSION + | JS_COMPUTED_MEMBER_EXPRESSION + | JS_FUNCTION_EXPRESSION + | JS_IDENTIFIER_EXPRESSION + | JS_NEW_EXPRESSION + | JS_OBJECT_EXPRESSION + | JS_PARENTHESIZED_EXPRESSION + | JS_PRIVATE_NAME + | JS_STATIC_MEMBER_EXPRESSION + | JS_TEMPLATE + | JS_THIS_EXPRESSION + | JSX_ELEMENT + | JSX_FRAGMENT + | JSX_SELF_CLOSING_ELEMENT + | TS_INSTANTIATION_EXPRESSION + | TS_NON_NULL_ASSERTION_EXPRESSION => true, + k if JsAnyLiteralExpression::can_cast(k) => true, + _ => false, + } } fn cast(syntax: SyntaxNode) -> Option { let res = match syntax.kind() { + JS_ARRAY_EXPRESSION => { + JsLeftHandSideExpression::JsArrayExpression(JsArrayExpression { syntax }) + } + JS_CALL_EXPRESSION => { + JsLeftHandSideExpression::JsCallExpression(JsCallExpression { syntax }) + } + JS_CLASS_EXPRESSION => { + JsLeftHandSideExpression::JsClassExpression(JsClassExpression { syntax }) + } JS_COMPUTED_MEMBER_EXPRESSION => { JsLeftHandSideExpression::JsComputedMemberExpression(JsComputedMemberExpression { syntax, }) } + JS_FUNCTION_EXPRESSION => { + JsLeftHandSideExpression::JsFunctionExpression(JsFunctionExpression { syntax }) + } JS_IDENTIFIER_EXPRESSION => { JsLeftHandSideExpression::JsIdentifierExpression(JsIdentifierExpression { syntax }) } + JS_NEW_EXPRESSION => { + JsLeftHandSideExpression::JsNewExpression(JsNewExpression { syntax }) + } + JS_OBJECT_EXPRESSION => { + JsLeftHandSideExpression::JsObjectExpression(JsObjectExpression { syntax }) + } JS_PARENTHESIZED_EXPRESSION => { JsLeftHandSideExpression::JsParenthesizedExpression(JsParenthesizedExpression { syntax, }) } + JS_PRIVATE_NAME => JsLeftHandSideExpression::JsPrivateName(JsPrivateName { syntax }), JS_STATIC_MEMBER_EXPRESSION => { JsLeftHandSideExpression::JsStaticMemberExpression(JsStaticMemberExpression { syntax, }) } - TS_AS_EXPRESSION => JsLeftHandSideExpression::TsAsExpression(TsAsExpression { syntax }), + JS_TEMPLATE => JsLeftHandSideExpression::JsTemplate(JsTemplate { syntax }), + JS_THIS_EXPRESSION => { + JsLeftHandSideExpression::JsThisExpression(JsThisExpression { syntax }) + } + JSX_ELEMENT => JsLeftHandSideExpression::JsxElement(JsxElement { syntax }), + JSX_FRAGMENT => JsLeftHandSideExpression::JsxFragment(JsxFragment { syntax }), + JSX_SELF_CLOSING_ELEMENT => { + JsLeftHandSideExpression::JsxSelfClosingElement(JsxSelfClosingElement { syntax }) + } + TS_INSTANTIATION_EXPRESSION => { + JsLeftHandSideExpression::TsInstantiationExpression(TsInstantiationExpression { + syntax, + }) + } TS_NON_NULL_ASSERTION_EXPRESSION => { JsLeftHandSideExpression::TsNonNullAssertionExpression( TsNonNullAssertionExpression { syntax }, ) } - TS_TYPE_ASSERTION_EXPRESSION => { - JsLeftHandSideExpression::TsTypeAssertionExpression(TsTypeAssertionExpression { - syntax, - }) + _ => { + if let Some(js_any_literal_expression) = JsAnyLiteralExpression::cast(syntax) { + return Some(JsLeftHandSideExpression::JsAnyLiteralExpression( + js_any_literal_expression, + )); + } + return None; } - _ => return None, }; Some(res) } fn syntax(&self) -> &SyntaxNode { match self { + JsLeftHandSideExpression::JsArrayExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsCallExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsClassExpression(it) => &it.syntax, JsLeftHandSideExpression::JsComputedMemberExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsFunctionExpression(it) => &it.syntax, JsLeftHandSideExpression::JsIdentifierExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsNewExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsObjectExpression(it) => &it.syntax, JsLeftHandSideExpression::JsParenthesizedExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsPrivateName(it) => &it.syntax, JsLeftHandSideExpression::JsStaticMemberExpression(it) => &it.syntax, - JsLeftHandSideExpression::TsAsExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsTemplate(it) => &it.syntax, + JsLeftHandSideExpression::JsThisExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsxElement(it) => &it.syntax, + JsLeftHandSideExpression::JsxFragment(it) => &it.syntax, + JsLeftHandSideExpression::JsxSelfClosingElement(it) => &it.syntax, + JsLeftHandSideExpression::TsInstantiationExpression(it) => &it.syntax, JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => &it.syntax, - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => &it.syntax, + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.syntax(), } } fn into_syntax(self) -> SyntaxNode { match self { + JsLeftHandSideExpression::JsArrayExpression(it) => it.syntax, + JsLeftHandSideExpression::JsCallExpression(it) => it.syntax, + JsLeftHandSideExpression::JsClassExpression(it) => it.syntax, JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.syntax, + JsLeftHandSideExpression::JsFunctionExpression(it) => it.syntax, JsLeftHandSideExpression::JsIdentifierExpression(it) => it.syntax, + JsLeftHandSideExpression::JsNewExpression(it) => it.syntax, + JsLeftHandSideExpression::JsObjectExpression(it) => it.syntax, JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.syntax, + JsLeftHandSideExpression::JsPrivateName(it) => it.syntax, JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.syntax, - JsLeftHandSideExpression::TsAsExpression(it) => it.syntax, + JsLeftHandSideExpression::JsTemplate(it) => it.syntax, + JsLeftHandSideExpression::JsThisExpression(it) => it.syntax, + JsLeftHandSideExpression::JsxElement(it) => it.syntax, + JsLeftHandSideExpression::JsxFragment(it) => it.syntax, + JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.syntax, + JsLeftHandSideExpression::TsInstantiationExpression(it) => it.syntax, JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.syntax, - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.syntax, + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into_syntax(), } } } impl std::fmt::Debug for JsLeftHandSideExpression { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsArrayExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsCallExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsClassExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsComputedMemberExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsFunctionExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsIdentifierExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsNewExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsObjectExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsParenthesizedExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsPrivateName(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::JsStaticMemberExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::TsAsExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsTemplate(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsThisExpression(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxElement(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxFragment(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::JsxSelfClosingElement(it) => std::fmt::Debug::fmt(it, f), + JsLeftHandSideExpression::TsInstantiationExpression(it) => std::fmt::Debug::fmt(it, f), JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => { std::fmt::Debug::fmt(it, f) } - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => std::fmt::Debug::fmt(it, f), } } } impl From for SyntaxNode { fn from(n: JsLeftHandSideExpression) -> SyntaxNode { match n { + JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into(), + JsLeftHandSideExpression::JsArrayExpression(it) => it.into(), + JsLeftHandSideExpression::JsCallExpression(it) => it.into(), + JsLeftHandSideExpression::JsClassExpression(it) => it.into(), JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.into(), + JsLeftHandSideExpression::JsFunctionExpression(it) => it.into(), JsLeftHandSideExpression::JsIdentifierExpression(it) => it.into(), + JsLeftHandSideExpression::JsNewExpression(it) => it.into(), + JsLeftHandSideExpression::JsObjectExpression(it) => it.into(), JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.into(), + JsLeftHandSideExpression::JsPrivateName(it) => it.into(), JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.into(), - JsLeftHandSideExpression::TsAsExpression(it) => it.into(), + JsLeftHandSideExpression::JsTemplate(it) => it.into(), + JsLeftHandSideExpression::JsThisExpression(it) => it.into(), + JsLeftHandSideExpression::JsxElement(it) => it.into(), + JsLeftHandSideExpression::JsxFragment(it) => it.into(), + JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.into(), + JsLeftHandSideExpression::TsInstantiationExpression(it) => it.into(), JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.into(), - JsLeftHandSideExpression::TsTypeAssertionExpression(it) => it.into(), } } } diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index 92e506e6d9a..be8f358fb35 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -321,6 +321,28 @@ JsAnyExpression = | JsxTagExpression +// reference https://github.dev/microsoft/TypeScript/blob/77374732df82c9d5c1319677dc595868bbc648b5/src/compiler/utilitiesPublic.ts#L1554-L1590 +JsLeftHandSideExpression = + JsStaticMemberExpression + | JsComputedMemberExpression + | JsNewExpression + | JsCallExpression + | JsxElement + | JsxSelfClosingElement + | JsxFragment + | JsTemplate + | JsArrayExpression + | JsParenthesizedExpression + | JsObjectExpression + | JsClassExpression + | JsFunctionExpression + | JsIdentifierExpression + | JsAnyLiteralExpression + | TsInstantiationExpression + | JsThisExpression + | JsPrivateName + | TsNonNullAssertionExpression + JsTemplate = tag: JsAnyExpression? type_arguments: TsTypeArguments? @@ -2111,14 +2133,6 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression -JsLeftHandSideExpression = - JsParenthesizedExpression - | JsStaticMemberExpression - | JsComputedMemberExpression - | JsIdentifierExpression - | TsNonNullAssertionExpression - | TsTypeAssertionExpression - | TsAsExpression // This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript TsInstantiationExpression = expression: JsLeftHandSideExpression From 2645de45f92462707ceb182fb366c2c153a29c54 Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Mon, 12 Sep 2022 23:47:40 +0800 Subject: [PATCH 24/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20fmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/ts/expressions/instantiation_expression.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs index cde35615a0d..75a4e1b76db 100644 --- a/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs +++ b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs @@ -1,4 +1,7 @@ -use crate::{parentheses::{NeedsParentheses, unary_like_expression_needs_parentheses}, prelude::*}; +use crate::{ + parentheses::{unary_like_expression_needs_parentheses, NeedsParentheses}, + prelude::*, +}; use rome_formatter::write; use rome_js_syntax::{TsInstantiationExpression, TsInstantiationExpressionFields}; #[derive(Debug, Clone, Default)] From daf8695a858625a65196d5ebdcc9f1d4d57c96cc Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Mon, 12 Sep 2022 23:57:47 +0800 Subject: [PATCH 25/26] =?UTF-8?q?chore:=20=F0=9F=A4=96=20compile=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/rome_js_syntax/src/expr_ext.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/rome_js_syntax/src/expr_ext.rs b/crates/rome_js_syntax/src/expr_ext.rs index f5ebf54f032..1662c45c0aa 100644 --- a/crates/rome_js_syntax/src/expr_ext.rs +++ b/crates/rome_js_syntax/src/expr_ext.rs @@ -546,6 +546,7 @@ impl JsAnyExpression { JsAnyExpression::JsComputedMemberExpression(_) | JsAnyExpression::JsStaticMemberExpression(_) | JsAnyExpression::ImportMeta(_) + | JsAnyExpression::TsInstantiationExpression(_) | JsAnyExpression::NewTarget(_) => OperatorPrecedence::Member, JsAnyExpression::JsThisExpression(_) From 487ba17464ca8dd78c64f84670b65e3dcd02905d Mon Sep 17 00:00:00 2001 From: IWANABETHATGUY Date: Tue, 13 Sep 2022 10:38:45 +0800 Subject: [PATCH 26/26] =?UTF-8?q?fix:=20=F0=9F=90=9B=20remove=20lefthandsi?= =?UTF-8?q?deexpression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/generated/node_factory.rs | 2 +- .../src/generated/syntax_factory.rs | 2 +- crates/rome_js_formatter/src/generated.rs | 281 +++++------ .../src/js/any/left_hand_side_expression.rs | 32 -- crates/rome_js_formatter/src/js/any/mod.rs | 1 - crates/rome_js_syntax/src/generated/nodes.rs | 457 +----------------- .../rome_js_syntax/src/generated/nodes_mut.rs | 2 +- xtask/codegen/js.ungram | 25 +- 8 files changed, 134 insertions(+), 668 deletions(-) delete mode 100644 crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 6f0eb26fc3d..9d617aa2ee9 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -4918,7 +4918,7 @@ pub fn ts_infer_type(infer_token: SyntaxToken, type_parameter: TsTypeParameterNa )) } pub fn ts_instantiation_expression( - expression: JsLeftHandSideExpression, + expression: JsAnyExpression, arguments: TsTypeArguments, ) -> TsInstantiationExpression { TsInstantiationExpression::unwrap_cast(SyntaxNode::new_detached( diff --git a/crates/rome_js_factory/src/generated/syntax_factory.rs b/crates/rome_js_factory/src/generated/syntax_factory.rs index 909bdd35965..e0033f74b61 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -7554,7 +7554,7 @@ impl SyntaxFactory for JsSyntaxFactory { let mut slots: RawNodeSlots<2usize> = RawNodeSlots::default(); let mut current_element = elements.next(); if let Some(element) = ¤t_element { - if JsLeftHandSideExpression::can_cast(element.kind()) { + if JsAnyExpression::can_cast(element.kind()) { slots.mark_present(); current_element = elements.next(); } diff --git a/crates/rome_js_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index f7c2a920890..46293030ee2 100644 --- a/crates/rome_js_formatter/src/generated.rs +++ b/crates/rome_js_formatter/src/generated.rs @@ -2856,134 +2856,6 @@ impl IntoFormat for rome_js_syntax::JsxTagExpression { ) } } -impl FormatRule for crate::jsx::tag::element::FormatJsxElement { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxElement, - crate::jsx::tag::element::FormatJsxElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl IntoFormat for rome_js_syntax::JsxElement { - type Format = - FormatOwnedWithRule; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) - } -} -impl FormatRule - for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt( - &self, - node: &rome_js_syntax::JsxSelfClosingElement, - f: &mut JsFormatter, - ) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxSelfClosingElement, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), - ) - } -} -impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsxFragment { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsxFragment, - crate::jsx::tag::fragment::FormatJsxFragment, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::jsx::tag::fragment::FormatJsxFragment::default(), - ) - } -} -impl FormatRule - for crate::js::auxiliary::private_name::FormatJsPrivateName -{ - type Context = JsFormatContext; - #[inline(always)] - fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { - FormatNodeRule::::fmt(self, node, f) - } -} -impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsPrivateName { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsPrivateName, - crate::js::auxiliary::private_name::FormatJsPrivateName, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::auxiliary::private_name::FormatJsPrivateName::default(), - ) - } -} impl FormatRule for crate::ts::expressions::type_arguments::FormatTsTypeArguments { @@ -3408,6 +3280,40 @@ impl IntoFormat for rome_js_syntax::JsReferenceIdentifie ) } } +impl FormatRule + for crate::js::auxiliary::private_name::FormatJsPrivateName +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsPrivateName, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsPrivateName { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsPrivateName { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsPrivateName, + crate::js::auxiliary::private_name::FormatJsPrivateName, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::js::auxiliary::private_name::FormatJsPrivateName::default(), + ) + } +} impl FormatRule for crate::js::objects::literal_member_name::FormatJsLiteralMemberName { @@ -8890,6 +8796,100 @@ impl IntoFormat for rome_js_syntax::TsQualifiedName { ) } } +impl FormatRule for crate::jsx::tag::element::FormatJsxElement { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxElement, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxElement, + crate::jsx::tag::element::FormatJsxElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl IntoFormat for rome_js_syntax::JsxElement { + type Format = + FormatOwnedWithRule; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new(self, crate::jsx::tag::element::FormatJsxElement::default()) + } +} +impl FormatRule + for crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &rome_js_syntax::JsxSelfClosingElement, + f: &mut JsFormatter, + ) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxSelfClosingElement { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxSelfClosingElement, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::self_closing_element::FormatJsxSelfClosingElement::default(), + ) + } +} +impl FormatRule for crate::jsx::tag::fragment::FormatJsxFragment { + type Context = JsFormatContext; + #[inline(always)] + fn fmt(&self, node: &rome_js_syntax::JsxFragment, f: &mut JsFormatter) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::JsxFragment { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} +impl IntoFormat for rome_js_syntax::JsxFragment { + type Format = FormatOwnedWithRule< + rome_js_syntax::JsxFragment, + crate::jsx::tag::fragment::FormatJsxFragment, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule::new( + self, + crate::jsx::tag::fragment::FormatJsxFragment::default(), + ) + } +} impl FormatRule for crate::jsx::tag::opening_element::FormatJsxOpeningElement { @@ -10839,31 +10839,6 @@ impl IntoFormat for rome_js_syntax::JsAnyLiteralExpressi ) } } -impl<'a> AsFormat<'a> for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatRefWithRule< - 'a, - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn format(&'a self) -> Self::Format { - FormatRefWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} -impl IntoFormat for rome_js_syntax::JsLeftHandSideExpression { - type Format = FormatOwnedWithRule< - rome_js_syntax::JsLeftHandSideExpression, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression, - >; - fn into_format(self) -> Self::Format { - FormatOwnedWithRule::new( - self, - crate::js::any::left_hand_side_expression::FormatJsLeftHandSideExpression::default(), - ) - } -} impl<'a> AsFormat<'a> for rome_js_syntax::JsAnyTemplateElement { type Format = FormatRefWithRule< 'a, diff --git a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs b/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs deleted file mode 100644 index 142053291cc..00000000000 --- a/crates/rome_js_formatter/src/js/any/left_hand_side_expression.rs +++ /dev/null @@ -1,32 +0,0 @@ -//! Generated file, do not edit by hand, see `xtask/codegen` - -use crate::prelude::*; -use rome_js_syntax::JsLeftHandSideExpression; -#[derive(Debug, Clone, Default)] -pub struct FormatJsLeftHandSideExpression; -impl FormatRule for FormatJsLeftHandSideExpression { - type Context = JsFormatContext; - fn fmt(&self, node: &JsLeftHandSideExpression, f: &mut JsFormatter) -> FormatResult<()> { - match node { - JsLeftHandSideExpression::JsStaticMemberExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsComputedMemberExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsNewExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsCallExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsxElement(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsxSelfClosingElement(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsxFragment(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsTemplate(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsArrayExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsParenthesizedExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsObjectExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsClassExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsFunctionExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsIdentifierExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsAnyLiteralExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsInstantiationExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsThisExpression(node) => node.format().fmt(f), - JsLeftHandSideExpression::JsPrivateName(node) => node.format().fmt(f), - JsLeftHandSideExpression::TsNonNullAssertionExpression(node) => node.format().fmt(f), - } - } -} diff --git a/crates/rome_js_formatter/src/js/any/mod.rs b/crates/rome_js_formatter/src/js/any/mod.rs index 4481e496148..f058d98aa30 100644 --- a/crates/rome_js_formatter/src/js/any/mod.rs +++ b/crates/rome_js_formatter/src/js/any/mod.rs @@ -27,7 +27,6 @@ pub(crate) mod function_body; pub(crate) mod import_assertion_entry; pub(crate) mod import_clause; pub(crate) mod in_property; -pub(crate) mod left_hand_side_expression; pub(crate) mod literal_expression; pub(crate) mod method_modifier; pub(crate) mod module_item; diff --git a/crates/rome_js_syntax/src/generated/nodes.rs b/crates/rome_js_syntax/src/generated/nodes.rs index 6c1f2fbeaf0..de017ed048f 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -9409,7 +9409,7 @@ impl TsInstantiationExpression { arguments: self.arguments(), } } - pub fn expression(&self) -> SyntaxResult { + pub fn expression(&self) -> SyntaxResult { support::required_node(&self.syntax, 0usize) } pub fn arguments(&self) -> SyntaxResult { @@ -9427,7 +9427,7 @@ impl Serialize for TsInstantiationExpression { } #[cfg_attr(feature = "serde", derive(Serialize))] pub struct TsInstantiationExpressionFields { - pub expression: SyntaxResult, + pub expression: SyntaxResult, pub arguments: SyntaxResult, } #[derive(Clone, PartialEq, Eq, Hash)] @@ -13819,145 +13819,6 @@ impl JsAnyTemplateElement { } #[derive(Clone, PartialEq, Eq, Hash)] #[cfg_attr(feature = "serde", derive(Serialize))] -pub enum JsLeftHandSideExpression { - JsAnyLiteralExpression(JsAnyLiteralExpression), - JsArrayExpression(JsArrayExpression), - JsCallExpression(JsCallExpression), - JsClassExpression(JsClassExpression), - JsComputedMemberExpression(JsComputedMemberExpression), - JsFunctionExpression(JsFunctionExpression), - JsIdentifierExpression(JsIdentifierExpression), - JsNewExpression(JsNewExpression), - JsObjectExpression(JsObjectExpression), - JsParenthesizedExpression(JsParenthesizedExpression), - JsPrivateName(JsPrivateName), - JsStaticMemberExpression(JsStaticMemberExpression), - JsTemplate(JsTemplate), - JsThisExpression(JsThisExpression), - JsxElement(JsxElement), - JsxFragment(JsxFragment), - JsxSelfClosingElement(JsxSelfClosingElement), - TsInstantiationExpression(TsInstantiationExpression), - TsNonNullAssertionExpression(TsNonNullAssertionExpression), -} -impl JsLeftHandSideExpression { - pub fn as_js_any_literal_expression(&self) -> Option<&JsAnyLiteralExpression> { - match &self { - JsLeftHandSideExpression::JsAnyLiteralExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_array_expression(&self) -> Option<&JsArrayExpression> { - match &self { - JsLeftHandSideExpression::JsArrayExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_call_expression(&self) -> Option<&JsCallExpression> { - match &self { - JsLeftHandSideExpression::JsCallExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_class_expression(&self) -> Option<&JsClassExpression> { - match &self { - JsLeftHandSideExpression::JsClassExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_computed_member_expression(&self) -> Option<&JsComputedMemberExpression> { - match &self { - JsLeftHandSideExpression::JsComputedMemberExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_function_expression(&self) -> Option<&JsFunctionExpression> { - match &self { - JsLeftHandSideExpression::JsFunctionExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_identifier_expression(&self) -> Option<&JsIdentifierExpression> { - match &self { - JsLeftHandSideExpression::JsIdentifierExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_new_expression(&self) -> Option<&JsNewExpression> { - match &self { - JsLeftHandSideExpression::JsNewExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_object_expression(&self) -> Option<&JsObjectExpression> { - match &self { - JsLeftHandSideExpression::JsObjectExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_parenthesized_expression(&self) -> Option<&JsParenthesizedExpression> { - match &self { - JsLeftHandSideExpression::JsParenthesizedExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_private_name(&self) -> Option<&JsPrivateName> { - match &self { - JsLeftHandSideExpression::JsPrivateName(item) => Some(item), - _ => None, - } - } - pub fn as_js_static_member_expression(&self) -> Option<&JsStaticMemberExpression> { - match &self { - JsLeftHandSideExpression::JsStaticMemberExpression(item) => Some(item), - _ => None, - } - } - pub fn as_js_template(&self) -> Option<&JsTemplate> { - match &self { - JsLeftHandSideExpression::JsTemplate(item) => Some(item), - _ => None, - } - } - pub fn as_js_this_expression(&self) -> Option<&JsThisExpression> { - match &self { - JsLeftHandSideExpression::JsThisExpression(item) => Some(item), - _ => None, - } - } - pub fn as_jsx_element(&self) -> Option<&JsxElement> { - match &self { - JsLeftHandSideExpression::JsxElement(item) => Some(item), - _ => None, - } - } - pub fn as_jsx_fragment(&self) -> Option<&JsxFragment> { - match &self { - JsLeftHandSideExpression::JsxFragment(item) => Some(item), - _ => None, - } - } - pub fn as_jsx_self_closing_element(&self) -> Option<&JsxSelfClosingElement> { - match &self { - JsLeftHandSideExpression::JsxSelfClosingElement(item) => Some(item), - _ => None, - } - } - pub fn as_ts_instantiation_expression(&self) -> Option<&TsInstantiationExpression> { - match &self { - JsLeftHandSideExpression::TsInstantiationExpression(item) => Some(item), - _ => None, - } - } - pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { - match &self { - JsLeftHandSideExpression::TsNonNullAssertionExpression(item) => Some(item), - _ => None, - } - } -} -#[derive(Clone, PartialEq, Eq, Hash)] -#[cfg_attr(feature = "serde", derive(Serialize))] pub enum JsxAnyAttribute { JsxAttribute(JsxAttribute), JsxSpreadAttribute(JsxSpreadAttribute), @@ -29449,315 +29310,6 @@ impl From for SyntaxElement { node.into() } } -impl From for JsLeftHandSideExpression { - fn from(node: JsArrayExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsArrayExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsCallExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsCallExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsClassExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsClassExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsComputedMemberExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsComputedMemberExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsFunctionExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsFunctionExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsIdentifierExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsIdentifierExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsNewExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsNewExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsObjectExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsObjectExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsParenthesizedExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsParenthesizedExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsPrivateName) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsPrivateName(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsStaticMemberExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsStaticMemberExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsTemplate) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsTemplate(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsThisExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsThisExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsxElement) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsxElement(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsxFragment) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsxFragment(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: JsxSelfClosingElement) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::JsxSelfClosingElement(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: TsInstantiationExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsInstantiationExpression(node) - } -} -impl From for JsLeftHandSideExpression { - fn from(node: TsNonNullAssertionExpression) -> JsLeftHandSideExpression { - JsLeftHandSideExpression::TsNonNullAssertionExpression(node) - } -} -impl AstNode for JsLeftHandSideExpression { - type Language = Language; - const KIND_SET: SyntaxKindSet = JsAnyLiteralExpression::KIND_SET - .union(JsArrayExpression::KIND_SET) - .union(JsCallExpression::KIND_SET) - .union(JsClassExpression::KIND_SET) - .union(JsComputedMemberExpression::KIND_SET) - .union(JsFunctionExpression::KIND_SET) - .union(JsIdentifierExpression::KIND_SET) - .union(JsNewExpression::KIND_SET) - .union(JsObjectExpression::KIND_SET) - .union(JsParenthesizedExpression::KIND_SET) - .union(JsPrivateName::KIND_SET) - .union(JsStaticMemberExpression::KIND_SET) - .union(JsTemplate::KIND_SET) - .union(JsThisExpression::KIND_SET) - .union(JsxElement::KIND_SET) - .union(JsxFragment::KIND_SET) - .union(JsxSelfClosingElement::KIND_SET) - .union(TsInstantiationExpression::KIND_SET) - .union(TsNonNullAssertionExpression::KIND_SET); - fn can_cast(kind: SyntaxKind) -> bool { - match kind { - JS_ARRAY_EXPRESSION - | JS_CALL_EXPRESSION - | JS_CLASS_EXPRESSION - | JS_COMPUTED_MEMBER_EXPRESSION - | JS_FUNCTION_EXPRESSION - | JS_IDENTIFIER_EXPRESSION - | JS_NEW_EXPRESSION - | JS_OBJECT_EXPRESSION - | JS_PARENTHESIZED_EXPRESSION - | JS_PRIVATE_NAME - | JS_STATIC_MEMBER_EXPRESSION - | JS_TEMPLATE - | JS_THIS_EXPRESSION - | JSX_ELEMENT - | JSX_FRAGMENT - | JSX_SELF_CLOSING_ELEMENT - | TS_INSTANTIATION_EXPRESSION - | TS_NON_NULL_ASSERTION_EXPRESSION => true, - k if JsAnyLiteralExpression::can_cast(k) => true, - _ => false, - } - } - fn cast(syntax: SyntaxNode) -> Option { - let res = match syntax.kind() { - JS_ARRAY_EXPRESSION => { - JsLeftHandSideExpression::JsArrayExpression(JsArrayExpression { syntax }) - } - JS_CALL_EXPRESSION => { - JsLeftHandSideExpression::JsCallExpression(JsCallExpression { syntax }) - } - JS_CLASS_EXPRESSION => { - JsLeftHandSideExpression::JsClassExpression(JsClassExpression { syntax }) - } - JS_COMPUTED_MEMBER_EXPRESSION => { - JsLeftHandSideExpression::JsComputedMemberExpression(JsComputedMemberExpression { - syntax, - }) - } - JS_FUNCTION_EXPRESSION => { - JsLeftHandSideExpression::JsFunctionExpression(JsFunctionExpression { syntax }) - } - JS_IDENTIFIER_EXPRESSION => { - JsLeftHandSideExpression::JsIdentifierExpression(JsIdentifierExpression { syntax }) - } - JS_NEW_EXPRESSION => { - JsLeftHandSideExpression::JsNewExpression(JsNewExpression { syntax }) - } - JS_OBJECT_EXPRESSION => { - JsLeftHandSideExpression::JsObjectExpression(JsObjectExpression { syntax }) - } - JS_PARENTHESIZED_EXPRESSION => { - JsLeftHandSideExpression::JsParenthesizedExpression(JsParenthesizedExpression { - syntax, - }) - } - JS_PRIVATE_NAME => JsLeftHandSideExpression::JsPrivateName(JsPrivateName { syntax }), - JS_STATIC_MEMBER_EXPRESSION => { - JsLeftHandSideExpression::JsStaticMemberExpression(JsStaticMemberExpression { - syntax, - }) - } - JS_TEMPLATE => JsLeftHandSideExpression::JsTemplate(JsTemplate { syntax }), - JS_THIS_EXPRESSION => { - JsLeftHandSideExpression::JsThisExpression(JsThisExpression { syntax }) - } - JSX_ELEMENT => JsLeftHandSideExpression::JsxElement(JsxElement { syntax }), - JSX_FRAGMENT => JsLeftHandSideExpression::JsxFragment(JsxFragment { syntax }), - JSX_SELF_CLOSING_ELEMENT => { - JsLeftHandSideExpression::JsxSelfClosingElement(JsxSelfClosingElement { syntax }) - } - TS_INSTANTIATION_EXPRESSION => { - JsLeftHandSideExpression::TsInstantiationExpression(TsInstantiationExpression { - syntax, - }) - } - TS_NON_NULL_ASSERTION_EXPRESSION => { - JsLeftHandSideExpression::TsNonNullAssertionExpression( - TsNonNullAssertionExpression { syntax }, - ) - } - _ => { - if let Some(js_any_literal_expression) = JsAnyLiteralExpression::cast(syntax) { - return Some(JsLeftHandSideExpression::JsAnyLiteralExpression( - js_any_literal_expression, - )); - } - return None; - } - }; - Some(res) - } - fn syntax(&self) -> &SyntaxNode { - match self { - JsLeftHandSideExpression::JsArrayExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsCallExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsClassExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsComputedMemberExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsFunctionExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsIdentifierExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsNewExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsObjectExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsParenthesizedExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsPrivateName(it) => &it.syntax, - JsLeftHandSideExpression::JsStaticMemberExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsTemplate(it) => &it.syntax, - JsLeftHandSideExpression::JsThisExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsxElement(it) => &it.syntax, - JsLeftHandSideExpression::JsxFragment(it) => &it.syntax, - JsLeftHandSideExpression::JsxSelfClosingElement(it) => &it.syntax, - JsLeftHandSideExpression::TsInstantiationExpression(it) => &it.syntax, - JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => &it.syntax, - JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.syntax(), - } - } - fn into_syntax(self) -> SyntaxNode { - match self { - JsLeftHandSideExpression::JsArrayExpression(it) => it.syntax, - JsLeftHandSideExpression::JsCallExpression(it) => it.syntax, - JsLeftHandSideExpression::JsClassExpression(it) => it.syntax, - JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.syntax, - JsLeftHandSideExpression::JsFunctionExpression(it) => it.syntax, - JsLeftHandSideExpression::JsIdentifierExpression(it) => it.syntax, - JsLeftHandSideExpression::JsNewExpression(it) => it.syntax, - JsLeftHandSideExpression::JsObjectExpression(it) => it.syntax, - JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.syntax, - JsLeftHandSideExpression::JsPrivateName(it) => it.syntax, - JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.syntax, - JsLeftHandSideExpression::JsTemplate(it) => it.syntax, - JsLeftHandSideExpression::JsThisExpression(it) => it.syntax, - JsLeftHandSideExpression::JsxElement(it) => it.syntax, - JsLeftHandSideExpression::JsxFragment(it) => it.syntax, - JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.syntax, - JsLeftHandSideExpression::TsInstantiationExpression(it) => it.syntax, - JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.syntax, - JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into_syntax(), - } - } -} -impl std::fmt::Debug for JsLeftHandSideExpression { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - match self { - JsLeftHandSideExpression::JsAnyLiteralExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsArrayExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsCallExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsClassExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsComputedMemberExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsFunctionExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsIdentifierExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsNewExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsObjectExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsParenthesizedExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsPrivateName(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsStaticMemberExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsTemplate(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsThisExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsxElement(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsxFragment(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::JsxSelfClosingElement(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::TsInstantiationExpression(it) => std::fmt::Debug::fmt(it, f), - JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => { - std::fmt::Debug::fmt(it, f) - } - } - } -} -impl From for SyntaxNode { - fn from(n: JsLeftHandSideExpression) -> SyntaxNode { - match n { - JsLeftHandSideExpression::JsAnyLiteralExpression(it) => it.into(), - JsLeftHandSideExpression::JsArrayExpression(it) => it.into(), - JsLeftHandSideExpression::JsCallExpression(it) => it.into(), - JsLeftHandSideExpression::JsClassExpression(it) => it.into(), - JsLeftHandSideExpression::JsComputedMemberExpression(it) => it.into(), - JsLeftHandSideExpression::JsFunctionExpression(it) => it.into(), - JsLeftHandSideExpression::JsIdentifierExpression(it) => it.into(), - JsLeftHandSideExpression::JsNewExpression(it) => it.into(), - JsLeftHandSideExpression::JsObjectExpression(it) => it.into(), - JsLeftHandSideExpression::JsParenthesizedExpression(it) => it.into(), - JsLeftHandSideExpression::JsPrivateName(it) => it.into(), - JsLeftHandSideExpression::JsStaticMemberExpression(it) => it.into(), - JsLeftHandSideExpression::JsTemplate(it) => it.into(), - JsLeftHandSideExpression::JsThisExpression(it) => it.into(), - JsLeftHandSideExpression::JsxElement(it) => it.into(), - JsLeftHandSideExpression::JsxFragment(it) => it.into(), - JsLeftHandSideExpression::JsxSelfClosingElement(it) => it.into(), - JsLeftHandSideExpression::TsInstantiationExpression(it) => it.into(), - JsLeftHandSideExpression::TsNonNullAssertionExpression(it) => it.into(), - } - } -} -impl From for SyntaxElement { - fn from(n: JsLeftHandSideExpression) -> SyntaxElement { - let node: SyntaxNode = n.into(); - node.into() - } -} impl From for JsxAnyAttribute { fn from(node: JsxAttribute) -> JsxAnyAttribute { JsxAnyAttribute::JsxAttribute(node) } } @@ -32244,11 +31796,6 @@ impl std::fmt::Display for JsAnyTemplateElement { std::fmt::Display::fmt(self.syntax(), f) } } -impl std::fmt::Display for JsLeftHandSideExpression { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - std::fmt::Display::fmt(self.syntax(), f) - } -} impl std::fmt::Display for JsxAnyAttribute { 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 9f80d08bb09..ea730d2c4ee 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4643,7 +4643,7 @@ impl TsInferType { } } impl TsInstantiationExpression { - pub fn with_expression(self, element: JsLeftHandSideExpression) -> Self { + pub fn with_expression(self, element: JsAnyExpression) -> Self { Self::unwrap_cast( self.syntax .splice_slots(0usize..=0usize, once(Some(element.into_syntax().into()))), diff --git a/xtask/codegen/js.ungram b/xtask/codegen/js.ungram index be8f358fb35..15b158d8e2a 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -320,29 +320,6 @@ JsAnyExpression = // JSX | JsxTagExpression - -// reference https://github.dev/microsoft/TypeScript/blob/77374732df82c9d5c1319677dc595868bbc648b5/src/compiler/utilitiesPublic.ts#L1554-L1590 -JsLeftHandSideExpression = - JsStaticMemberExpression - | JsComputedMemberExpression - | JsNewExpression - | JsCallExpression - | JsxElement - | JsxSelfClosingElement - | JsxFragment - | JsTemplate - | JsArrayExpression - | JsParenthesizedExpression - | JsObjectExpression - | JsClassExpression - | JsFunctionExpression - | JsIdentifierExpression - | JsAnyLiteralExpression - | TsInstantiationExpression - | JsThisExpression - | JsPrivateName - | TsNonNullAssertionExpression - JsTemplate = tag: JsAnyExpression? type_arguments: TsTypeArguments? @@ -2135,7 +2112,7 @@ TsTypeAssertionExpression = // This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript TsInstantiationExpression = - expression: JsLeftHandSideExpression + expression: JsAnyExpression arguments: TsTypeArguments TsAsExpression =