diff --git a/crates/rome_js_factory/src/generated/node_factory.rs b/crates/rome_js_factory/src/generated/node_factory.rs index 0c3dc5d71da..9d617aa2ee9 100644 --- a/crates/rome_js_factory/src/generated/node_factory.rs +++ b/crates/rome_js_factory/src/generated/node_factory.rs @@ -4917,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, @@ -6091,14 +6103,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..e0033f74b61 100644 --- a/crates/rome_js_factory/src/generated/syntax_factory.rs +++ b/crates/rome_js_factory/src/generated/syntax_factory.rs @@ -7549,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(); @@ -9338,7 +9364,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 +9380,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_formatter/src/generated.rs b/crates/rome_js_formatter/src/generated.rs index e4e8cb29bc5..46293030ee2 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::instantiation_expression::FormatTsInstantiationExpression +{ + type Context = JsFormatContext; + #[inline(always)] + fn fmt( + &self, + node: &rome_js_syntax::TsInstantiationExpression, + f: &mut JsFormatter, + ) -> FormatResult<()> { + FormatNodeRule::::fmt(self, node, f) + } +} +impl<'a> AsFormat<'a> for rome_js_syntax::TsInstantiationExpression { + type Format = FormatRefWithRule< + 'a, + rome_js_syntax::TsInstantiationExpression, + crate::ts::expressions::instantiation_expression::FormatTsInstantiationExpression, + >; + fn format(&'a self) -> Self::Format { + FormatRefWithRule :: new (self , crate :: ts :: expressions :: instantiation_expression :: FormatTsInstantiationExpression :: default ()) + } +} +impl IntoFormat for rome_js_syntax::TsInstantiationExpression { + type Format = FormatOwnedWithRule< + rome_js_syntax::TsInstantiationExpression, + crate::ts::expressions::instantiation_expression::FormatTsInstantiationExpression, + >; + fn into_format(self) -> Self::Format { + FormatOwnedWithRule :: new (self , crate :: ts :: expressions :: instantiation_expression :: FormatTsInstantiationExpression :: 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..070b3eb0726 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::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 fe053e32d2a..940657259b4 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::TsInstantiationExpression(arguments) => arguments.needs_parentheses(), } } @@ -252,6 +253,9 @@ impl NeedsParentheses for JsAnyExpression { JsAnyExpression::TsTypeAssertionExpression(type_assertion) => { type_assertion.needs_parentheses_with_parent(parent) } + JsAnyExpression::TsInstantiationExpression(expr) => { + expr.needs_parentheses_with_parent(parent) + } } } } diff --git a/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs new file mode 100644 index 00000000000..75a4e1b76db --- /dev/null +++ b/crates/rome_js_formatter/src/ts/expressions/instantiation_expression.rs @@ -0,0 +1,28 @@ +use crate::{ + parentheses::{unary_like_expression_needs_parentheses, NeedsParentheses}, + prelude::*, +}; +use rome_formatter::write; +use rome_js_syntax::{TsInstantiationExpression, TsInstantiationExpressionFields}; +#[derive(Debug, Clone, Default)] +pub struct FormatTsInstantiationExpression; +impl FormatNodeRule for FormatTsInstantiationExpression { + fn fmt_fields( + &self, + node: &TsInstantiationExpression, + f: &mut JsFormatter, + ) -> FormatResult<()> { + let TsInstantiationExpressionFields { + expression, + arguments, + } = node.as_fields(); + + write![f, [expression.format(), arguments.format()]] + } +} + +impl NeedsParentheses for TsInstantiationExpression { + 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_formatter/src/ts/expressions/mod.rs b/crates/rome_js_formatter/src/ts/expressions/mod.rs index c5674577a5e..c133f85b250 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 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_formatter/src/ts/types/typeof_type.rs b/crates/rome_js_formatter/src/ts/types/typeof_type.rs index 666e6330363..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,13 +10,19 @@ 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(); 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/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_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/syntax/expr.rs b/crates/rome_js_parser/src/syntax/expr.rs index 14ac09989e5..752001b4546 100644 --- a/crates/rome_js_parser/src/syntax/expr.rs +++ b/crates/rome_js_parser/src/syntax/expr.rs @@ -8,6 +8,7 @@ use crate::event::rewrite_events; use crate::event::RewriteParseEvents; use crate::lexer::{LexContext, ReLexContext}; 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; @@ -19,7 +20,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; @@ -701,16 +702,38 @@ fn parse_member_expression_rest( BACKTICK => { // test ts ts_optional_chain_call // (() => {})?.(); - let m = lhs.precede(p); + let m = match lhs.kind() { + TS_INSTANTIATION_EXPRESSION => lhs.undo_completion(p), + _ => lhs.precede(p), + }; parse_template_literal(p, m, *in_optional_chain, true) } - _ => break, - } + 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_INSTANTIATION_EXPRESSION); + continue; + }; + break; + } + _ => { + break; + } + }; } lhs } +// test_err ts ts_new_operator +// new A(); + +// 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; @@ -741,27 +764,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.and_ts_type_assertion_allowed(false)) + .or_add_diagnostic(p, expected_expression) + .map(|expr| parse_member_expression_rest(p, expr, context, false, &mut false)) + { + if let TS_INSTANTIATION_EXPRESSION = 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)) @@ -1645,15 +1662,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_INSTANTIATION_EXPRESSION if !p.at(T![?.]) => 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; @@ -1665,26 +1684,24 @@ 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; - } - - parse_call_arguments(p).or_add_diagnostic(p, expected_parameters); - lhs = m.complete(p, JS_CALL_EXPRESSION); + 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; } - } 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 '('"); + .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/src/syntax/typescript/types.rs b/crates/rome_js_parser/src/syntax/typescript/types.rs index 388219f75f9..a5035e00a4a 100644 --- a/crates/rome_js_parser/src/syntax/typescript/types.rs +++ b/crates/rome_js_parser/src/syntax/typescript/types.rs @@ -517,6 +517,12 @@ 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>; + +// 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; @@ -525,6 +531,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); + if !p.has_preceding_line_break() { + parse_ts_type_arguments(p).ok(); + } Present(m.complete(p, TS_TYPEOF_TYPE)) } @@ -1231,6 +1240,35 @@ 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']; +// 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 +// 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 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 + 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 @@ -1246,7 +1284,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 +1293,38 @@ 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 { + matches!( + 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 + ) +} + 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/err/ts_instantiation_expressions1.rast b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast new file mode 100644 index 00000000000..2f1021a34a4 --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.rast @@ -0,0 +1,156 @@ +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 ...")], + }, + 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@107..108 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..108 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 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(" ")] + 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 ...")] + 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 + │ +1 │ const a8 = f; // Relational operator error + │ ^ Expected an expression here + +-- +error[SyntaxError]: expected `(` but instead found `;` + ┌─ ts_instantiation_expressions1.ts:2:23 + │ +2 │ const b1 = f?.; // Error, `(` expected + │ ^ unexpected + +-- +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 new file mode 100644 index 00000000000..3f80de13b1b --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/err/ts_instantiation_expressions1.ts @@ -0,0 +1,2 @@ +const a8 = f; // Relational operator error +const b1 = f?.; // Error, `(` expected 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(); 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..7f0e928501a --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.rast @@ -0,0 +1,1027 @@ +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: TsInstantiationExpression { + 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..20 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: LET_KW@20..25 "let" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@25..28 "f2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@28..30 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@30..32 "fx" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@32..33 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@33..39 "string" [] [], + }, + COMMA@39..41 "," [] [Whitespace(" ")], + TsNumberType { + number_token: NUMBER_KW@41..47 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@47..48 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@48..49 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: LET_KW@49..54 "let" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@54..57 "f3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@57..59 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsComputedMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@59..61 "fx" [] [], + }, + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@61..62 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@62..68 "'test'" [] [], + }, + r_brack_token: R_BRACK@68..69 "]" [] [], + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@69..70 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsStringType { + string_token: STRING_KW@70..76 "string" [] [], + }, + ], + r_angle_token: R_ANGLE@76..77 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@77..78 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@78..85 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@85..88 "a2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@88..90 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsStaticMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@90..91 "f" [] [], + }, + }, + operator_token: DOT@91..92 "." [] [], + member: JsName { + value_token: IDENT@92..93 "g" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@93..94 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@94..100 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@100..101 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@101..119 ";" [] [Whitespace(" "), Comments("// () => number")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@119..126 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@126..129 "a3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@129..131 "=" [] [Whitespace(" ")], + expression: JsStaticMemberExpression { + object: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@131..132 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@132..133 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@133..139 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@139..140 ">" [] [], + }, + }, + operator_token: DOT@140..141 "." [] [], + member: JsName { + value_token: IDENT@141..142 "g" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@142..158 ";" [] [Whitespace(" "), Comments("// () => U")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@158..165 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@165..168 "a4" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@168..170 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsStaticMemberExpression { + object: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@170..171 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@171..172 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@172..178 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@178..179 ">" [] [], + }, + }, + operator_token: DOT@179..180 "." [] [], + member: JsName { + value_token: IDENT@180..181 "g" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@181..182 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@182..188 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@188..189 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@189..207 ";" [] [Whitespace(" "), Comments("// () => number")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@207..214 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@214..217 "a5" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@217..219 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsComputedMemberExpression { + object: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@219..220 "f" [] [], + }, + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@220..221 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@221..224 "'g'" [] [], + }, + r_brack_token: R_BRACK@224..225 "]" [] [], + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@225..226 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@226..232 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@232..233 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@233..251 ";" [] [Whitespace(" "), Comments("// () => number")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@251..258 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@258..261 "a7" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@261..263 "=" [] [Whitespace(" ")], + expression: JsComputedMemberExpression { + object: JsParenthesizedExpression { + l_paren_token: L_PAREN@263..264 "(" [] [], + expression: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@264..265 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@265..266 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@266..272 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@272..273 ">" [] [], + }, + }, + r_paren_token: R_PAREN@273..274 ")" [] [], + }, + optional_chain_token: missing (optional), + l_brack_token: L_BRACK@274..275 "[" [] [], + member: JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@275..278 "'g'" [] [], + }, + r_brack_token: R_BRACK@278..279 "]" [] [], + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@279..280 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@280..287 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@287..290 "a6" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@290..292 "=" [] [Whitespace(" ")], + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@292..293 "f" [] [], + }, + }, + operator_token: L_ANGLE@293..294 "<" [] [], + right: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@294..300 "number" [] [], + }, + }, + }, + operator_token: R_ANGLE@300..301 ">" [] [], + right: JsArrayExpression { + l_brack_token: L_BRACK@301..302 "[" [] [], + elements: JsArrayElementList [ + JsStringLiteralExpression { + value_token: JS_STRING_LITERAL@302..305 "'g'" [] [], + }, + ], + r_brack_token: R_BRACK@305..306 "]" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@306..322 ";" [] [Whitespace(" "), Comments("// type Error")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@322..329 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@329..332 "b2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@332..334 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@334..335 "f" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@335..337 "?." [] [], + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@337..338 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@338..344 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@344..345 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@345..346 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@346..347 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@347..348 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@348..355 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@355..358 "b3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@358..360 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@360..361 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@361..362 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@362..368 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@368..369 ">" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@369..371 "?." [] [], + type_arguments: missing (optional), + arguments: JsCallArguments { + l_paren_token: L_PAREN@371..372 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@372..373 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@373..374 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@374..381 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@381..384 "b4" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@384..386 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@386..387 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@387..388 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@388..394 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@394..395 ">" [] [], + }, + }, + optional_chain_token: QUESTIONDOT@395..397 "?." [] [], + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@397..398 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsNumberType { + number_token: NUMBER_KW@398..404 "number" [] [], + }, + ], + r_angle_token: R_ANGLE@404..405 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@405..406 "(" [] [], + args: JsCallArgumentList [], + r_paren_token: R_PAREN@406..407 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@407..451 ";" [] [Whitespace(" "), Comments("// Type Error, expect ...")], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@451..458 "const" [Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@458..461 "x1" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@461..463 "=" [] [Whitespace(" ")], + expression: JsCallExpression { + callee: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@463..464 "f" [] [], + }, + }, + optional_chain_token: missing (optional), + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@464..465 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsBooleanLiteralType { + literal: TRUE_KW@465..469 "true" [] [], + }, + ], + r_angle_token: R_ANGLE@469..470 ">" [] [], + }, + arguments: JsCallArguments { + l_paren_token: L_PAREN@470..472 "(" [Newline("\n")] [], + args: JsCallArgumentList [ + JsBooleanLiteralExpression { + value_token: TRUE_KW@472..476 "true" [] [], + }, + ], + r_paren_token: R_PAREN@476..477 ")" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@477..478 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@478..520 "const" [Newline("\n"), Comments("// Parsed as relation ..."), Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@520..523 "x2" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@523..525 "=" [] [Whitespace(" ")], + expression: JsBinaryExpression { + left: JsBinaryExpression { + left: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@525..526 "f" [] [], + }, + }, + operator_token: L_ANGLE@526..527 "<" [] [], + right: JsBooleanLiteralExpression { + value_token: TRUE_KW@527..531 "true" [] [], + }, + }, + operator_token: R_ANGLE@531..532 ">" [] [], + right: JsBooleanLiteralExpression { + value_token: TRUE_KW@532..537 "true" [Newline("\n")] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@537..538 ";" [] [], + }, + JsVariableStatement { + declaration: JsVariableDeclaration { + kind: CONST_KW@538..583 "const" [Newline("\n"), Comments("// Parsed as instanti ..."), Newline("\n")] [Whitespace(" ")], + declarators: JsVariableDeclaratorList [ + JsVariableDeclarator { + id: JsIdentifierBinding { + name_token: IDENT@583..586 "x3" [] [Whitespace(" ")], + }, + variable_annotation: missing (optional), + initializer: JsInitializerClause { + eq_token: EQ@586..588 "=" [] [Whitespace(" ")], + expression: TsInstantiationExpression { + expression: JsIdentifierExpression { + name: JsReferenceIdentifier { + value_token: IDENT@588..589 "f" [] [], + }, + }, + arguments: TsTypeArguments { + l_angle_token: L_ANGLE@589..590 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsBooleanLiteralType { + literal: TRUE_KW@590..594 "true" [] [], + }, + ], + r_angle_token: R_ANGLE@594..595 ">" [] [], + }, + }, + }, + }, + ], + }, + semicolon_token: SEMICOLON@595..596 ";" [] [], + }, + JsExpressionStatement { + expression: JsBooleanLiteralExpression { + value_token: TRUE_KW@596..601 "true" [Newline("\n")] [], + }, + semicolon_token: SEMICOLON@601..602 ";" [] [], + }, + ], + eof_token: EOF@602..603 "" [Newline("\n")] [], +} + +0: JS_MODULE@0..603 + 0: (empty) + 1: JS_DIRECTIVE_LIST@0..0 + 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 + 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..19 + 0: EQ@7..9 "=" [] [Whitespace(" ")] + 1: TS_INSTANTIATION_EXPRESSION@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..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@28..48 + 0: EQ@28..30 "=" [] [Whitespace(" ")] + 1: TS_INSTANTIATION_EXPRESSION@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@57..77 + 0: EQ@57..59 "=" [] [Whitespace(" ")] + 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 + 0: IDENT@59..61 "fx" [] [] + 1: (empty) + 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@88..101 + 0: EQ@88..90 "=" [] [Whitespace(" ")] + 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 + 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@129..142 + 0: EQ@129..131 "=" [] [Whitespace(" ")] + 1: JS_STATIC_MEMBER_EXPRESSION@131..142 + 0: TS_INSTANTIATION_EXPRESSION@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@168..189 + 0: EQ@168..170 "=" [] [Whitespace(" ")] + 1: TS_INSTANTIATION_EXPRESSION@170..189 + 0: JS_STATIC_MEMBER_EXPRESSION@170..181 + 0: TS_INSTANTIATION_EXPRESSION@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@217..233 + 0: EQ@217..219 "=" [] [Whitespace(" ")] + 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 + 0: IDENT@219..220 "f" [] [] + 1: (empty) + 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@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_INSTANTIATION_EXPRESSION@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@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@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@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@358..373 + 0: EQ@358..360 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@360..373 + 0: TS_INSTANTIATION_EXPRESSION@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@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@384..407 + 0: EQ@384..386 "=" [] [Whitespace(" ")] + 1: JS_CALL_EXPRESSION@386..407 + 0: TS_INSTANTIATION_EXPRESSION@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@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@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@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@586..595 + 0: EQ@586..588 "=" [] [Whitespace(" ")] + 1: TS_INSTANTIATION_EXPRESSION@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 new file mode 100644 index 00000000000..74af27aff2d --- /dev/null +++ b/crates/rome_js_parser/test_data/inline/ok/ts_instantiation_expressions.ts @@ -0,0 +1,20 @@ +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 +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 x1 = f +(true); +// Parsed as relational expression +const x2 = f +true; +// Parsed as instantiation expression +const x3 = f; +true; 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 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 93303165869..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 @@ -34,17 +34,92 @@ 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..67 ";" [] [], + }, + TsTypeAliasDeclaration { + type_token: TYPE_KW@67..73 "type" [Newline("\n")] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@73..74 "A" [] [], + }, + type_parameters: TsTypeParameters { + l_angle_token: L_ANGLE@74..75 "<" [] [], + items: TsTypeParameterList [ + TsTypeParameter { + name: TsTypeParameterName { + ident_token: IDENT@75..76 "U" [] [], + }, + constraint: missing (optional), + default: missing (optional), + }, + ], + r_angle_token: R_ANGLE@76..78 ">" [] [Whitespace(" ")], + }, + eq_token: EQ@78..80 "=" [] [Whitespace(" ")], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@80..92 "InstanceType" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@92..93 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsTypeofType { + typeof_token: TYPEOF_KW@93..100 "typeof" [] [Whitespace(" ")], + expression_name: JsReferenceIdentifier { + value_token: IDENT@100..105 "Array" [] [], + }, + type_arguments: TsTypeArguments { + l_angle_token: L_ANGLE@105..106 "<" [] [], + ts_type_argument_list: TsTypeArgumentList [ + TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@106..107 "U" [] [], + }, + type_arguments: missing (optional), + }, + ], + r_angle_token: R_ANGLE@107..108 ">" [] [], + }, + }, + ], + r_angle_token: R_ANGLE@108..109 ">" [] [], + }, + }, + semicolon_token: SEMICOLON@109..110 ";" [] [], + }, ], - eof_token: EOF@34..35 "" [Newline("\n")] [], + eof_token: EOF@110..111 "" [Newline("\n")] [], } -0: JS_MODULE@0..35 +0: JS_MODULE@0..111 0: (empty) 1: JS_DIRECTIVE_LIST@0..0 - 2: JS_MODULE_ITEM_LIST@0..34 + 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(" ")] @@ -68,5 +143,57 @@ 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..67 + 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..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@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@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 6bc5223df33..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,2 +1,4 @@ let a = "test"; type B = typeof a; +type T21 = typeof Array; +type A = InstanceType>; 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
; 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(_) diff --git a/crates/rome_js_syntax/src/generated/kind.rs b/crates/rome_js_syntax/src/generated/kind.rs index 3a64f255ed9..2a8d161dcbd 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_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 bbdc45266df..dfb34c7c652 100644 --- a/crates/rome_js_syntax/src/generated/macros.rs +++ b/crates/rome_js_syntax/src/generated/macros.rs @@ -924,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 076314e6f28..de017ed048f 100644 --- a/crates/rome_js_syntax/src/generated/nodes.rs +++ b/crates/rome_js_syntax/src/generated/nodes.rs @@ -9392,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, } @@ -11705,6 +11744,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 +11753,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 +11768,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 { @@ -12670,6 +12712,7 @@ pub enum JsAnyExpression { JsxTagExpression(JsxTagExpression), NewTarget(NewTarget), TsAsExpression(TsAsExpression), + TsInstantiationExpression(TsInstantiationExpression), TsNonNullAssertionExpression(TsNonNullAssertionExpression), TsTypeAssertionExpression(TsTypeAssertionExpression), } @@ -12872,6 +12915,12 @@ impl JsAnyExpression { _ => None, } } + pub fn as_ts_instantiation_expression(&self) -> Option<&TsInstantiationExpression> { + match &self { + JsAnyExpression::TsInstantiationExpression(item) => Some(item), + _ => None, + } + } pub fn as_ts_non_null_assertion_expression(&self) -> Option<&TsNonNullAssertionExpression> { match &self { JsAnyExpression::TsNonNullAssertionExpression(item) => Some(item), @@ -22349,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 = @@ -24308,6 +24386,10 @@ impl std::fmt::Debug for TsTypeofType { "expression_name", &support::DebugSyntaxResult(self.expression_name()), ) + .field( + "type_arguments", + &support::DebugOptionalElement(self.type_arguments()), + ) .finish() } } @@ -26575,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: TsInstantiationExpression) -> JsAnyExpression { + JsAnyExpression::TsInstantiationExpression(node) + } +} impl From for JsAnyExpression { fn from(node: TsNonNullAssertionExpression) -> JsAnyExpression { JsAnyExpression::TsNonNullAssertionExpression(node) @@ -26620,6 +26707,7 @@ impl AstNode for JsAnyExpression { .union(JsxTagExpression::KIND_SET) .union(NewTarget::KIND_SET) .union(TsAsExpression::KIND_SET) + .union(TsInstantiationExpression::KIND_SET) .union(TsNonNullAssertionExpression::KIND_SET) .union(TsTypeAssertionExpression::KIND_SET); fn can_cast(kind: SyntaxKind) -> bool { @@ -26656,6 +26744,7 @@ impl AstNode for JsAnyExpression { | JSX_TAG_EXPRESSION | NEW_TARGET | TS_AS_EXPRESSION + | TS_INSTANTIATION_EXPRESSION | TS_NON_NULL_ASSERTION_EXPRESSION | TS_TYPE_ASSERTION_EXPRESSION => true, k if JsAnyLiteralExpression::can_cast(k) => true, @@ -26730,6 +26819,9 @@ 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_INSTANTIATION_EXPRESSION => { + JsAnyExpression::TsInstantiationExpression(TsInstantiationExpression { syntax }) + } TS_NON_NULL_ASSERTION_EXPRESSION => { JsAnyExpression::TsNonNullAssertionExpression(TsNonNullAssertionExpression { syntax, @@ -26783,6 +26875,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => &it.syntax, JsAnyExpression::NewTarget(it) => &it.syntax, JsAnyExpression::TsAsExpression(it) => &it.syntax, + JsAnyExpression::TsInstantiationExpression(it) => &it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => &it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => &it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.syntax(), @@ -26822,6 +26915,7 @@ impl AstNode for JsAnyExpression { JsAnyExpression::JsxTagExpression(it) => it.syntax, JsAnyExpression::NewTarget(it) => it.syntax, JsAnyExpression::TsAsExpression(it) => it.syntax, + JsAnyExpression::TsInstantiationExpression(it) => it.syntax, JsAnyExpression::TsNonNullAssertionExpression(it) => it.syntax, JsAnyExpression::TsTypeAssertionExpression(it) => it.syntax, JsAnyExpression::JsAnyLiteralExpression(it) => it.into_syntax(), @@ -26864,6 +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::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), } @@ -26905,6 +27000,7 @@ impl From for SyntaxNode { JsAnyExpression::JsxTagExpression(it) => it.into(), JsAnyExpression::NewTarget(it) => it.into(), JsAnyExpression::TsAsExpression(it) => it.into(), + JsAnyExpression::TsInstantiationExpression(it) => it.into(), JsAnyExpression::TsNonNullAssertionExpression(it) => it.into(), JsAnyExpression::TsTypeAssertionExpression(it) => it.into(), } @@ -32895,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 baad0a1a56a..ea730d2c4ee 100644 --- a/crates/rome_js_syntax/src/generated/nodes_mut.rs +++ b/crates/rome_js_syntax/src/generated/nodes_mut.rs @@ -4642,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( @@ -5740,6 +5754,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..15b158d8e2a 100644 --- a/xtask/codegen/js.ungram +++ b/xtask/codegen/js.ungram @@ -316,10 +316,10 @@ JsAnyExpression = | TsTypeAssertionExpression | TsAsExpression | TsNonNullAssertionExpression + | TsInstantiationExpression // JSX | JsxTagExpression - JsTemplate = tag: JsAnyExpression? type_arguments: TsTypeArguments? @@ -1848,6 +1848,7 @@ TsAnyTypePredicateParameterName = TsTypeofType = 'typeof' expression_name: TsAnyName + type_arguments: TsTypeArguments? TsConstructorType = 'abstract'? @@ -2109,6 +2110,11 @@ TsTypeAssertionExpression = '>' expression: JsAnyExpression +// This `SyntaxKind` is related to `ExpressionWithTypeArguments` in Typescript +TsInstantiationExpression = + 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..c29e4578b0f 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_INSTANTIATION_EXPRESSION", "TS_ENUM_DECLARATION", "TS_ENUM_MEMBER_LIST", "TS_ENUM_MEMBER",