From e8e7566ca005ad3c107bc1efc115649bd24b16f8 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 21 Jan 2024 20:02:25 +0800 Subject: [PATCH 1/3] fix(js_parser): Allow `const` in TsMethodSignatureTypeMember --- crates/biome_js_parser/src/syntax/typescript/types.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/biome_js_parser/src/syntax/typescript/types.rs b/crates/biome_js_parser/src/syntax/typescript/types.rs index 78d4dc0cc154..8fe8b18d420c 100644 --- a/crates/biome_js_parser/src/syntax/typescript/types.rs +++ b/crates/biome_js_parser/src/syntax/typescript/types.rs @@ -1232,6 +1232,7 @@ fn parse_ts_type_member(p: &mut JsParser, context: TypeContext) -> ParsedSyntax // type C = { m(a: string, b: number, c: string): any } // type D = { readonly: string, readonly a: number } // type E = { m(a: A, b: B): never } +// type F = { m(a: A): never } fn parse_ts_property_or_method_signature_type_member( p: &mut JsParser, context: TypeContext, @@ -1254,7 +1255,7 @@ fn parse_ts_property_or_method_signature_type_member( p.eat(T![?]); if p.at(T!['(']) || p.at(T![<]) { - parse_ts_call_signature(p, context); + parse_ts_call_signature(p, context.and_allow_const_modifier(true)); parse_ts_type_member_semi(p); let method = m.complete(p, TS_METHOD_SIGNATURE_TYPE_MEMBER); From 657ec58b4aafca640ab530405ab8c6988eef357c Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 21 Jan 2024 20:13:24 +0800 Subject: [PATCH 2/3] fix(js_parser): Allow `const` in TsCallSignatureTypeMember --- crates/biome_js_parser/src/syntax/typescript/types.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/biome_js_parser/src/syntax/typescript/types.rs b/crates/biome_js_parser/src/syntax/typescript/types.rs index 8fe8b18d420c..9aa38da380de 100644 --- a/crates/biome_js_parser/src/syntax/typescript/types.rs +++ b/crates/biome_js_parser/src/syntax/typescript/types.rs @@ -1278,13 +1278,14 @@ fn parse_ts_property_or_method_signature_type_member( // type A = { (): string; } // type B = { (a, b, c): number } // type C = { (a: A, b: B): number } +// type D = { (a: A): number } fn parse_ts_call_signature_type_member(p: &mut JsParser, context: TypeContext) -> ParsedSyntax { if !(p.at(T!['(']) || p.at(T![<])) { return Absent; } let m = p.start(); - parse_ts_call_signature(p, context); + parse_ts_call_signature(p, context.and_allow_const_modifier(true)); parse_ts_type_member_semi(p); Present(m.complete(p, TS_CALL_SIGNATURE_TYPE_MEMBER)) } From f5836f722834869a7aed6a1e368c875fa78c3e41 Mon Sep 17 00:00:00 2001 From: magic-akari Date: Sun, 21 Jan 2024 20:32:27 +0800 Subject: [PATCH 3/3] chore: update test snapshots --- .../inline/ok/ts_call_signature_member.rast | 118 ++++++++++++++++- .../inline/ok/ts_call_signature_member.ts | 1 + ...s_property_or_method_signature_member.rast | 125 +++++++++++++++++- .../ts_property_or_method_signature_member.ts | 1 + 4 files changed, 237 insertions(+), 8 deletions(-) diff --git a/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.rast b/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.rast index b6affa0d31d8..f8dc98617455 100644 --- a/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.rast +++ b/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.rast @@ -181,15 +181,80 @@ JsModule { }, semicolon_token: missing (optional), }, + TsTypeAliasDeclaration { + type_token: TYPE_KW@95..101 "type" [Newline("\n")] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@101..103 "D" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + eq_token: EQ@103..105 "=" [] [Whitespace(" ")], + ty: TsObjectType { + l_curly_token: L_CURLY@105..107 "{" [] [Whitespace(" ")], + members: TsTypeMemberList [ + TsCallSignatureTypeMember { + type_parameters: TsTypeParameters { + l_angle_token: L_ANGLE@107..108 "<" [] [], + items: TsTypeParameterList [ + TsTypeParameter { + modifiers: TsTypeParameterModifierList [ + TsConstModifier { + modifier_token: CONST_KW@108..114 "const" [] [Whitespace(" ")], + }, + ], + name: TsTypeParameterName { + ident_token: IDENT@114..115 "A" [] [], + }, + constraint: missing (optional), + default: missing (optional), + }, + ], + r_angle_token: R_ANGLE@115..116 ">" [] [], + }, + parameters: JsParameters { + l_paren_token: L_PAREN@116..117 "(" [] [], + items: JsParameterList [ + JsFormalParameter { + decorators: JsDecoratorList [], + binding: JsIdentifierBinding { + name_token: IDENT@117..118 "a" [] [], + }, + question_mark_token: missing (optional), + type_annotation: TsTypeAnnotation { + colon_token: COLON@118..120 ":" [] [Whitespace(" ")], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@120..121 "A" [] [], + }, + type_arguments: missing (optional), + }, + }, + initializer: missing (optional), + }, + ], + r_paren_token: R_PAREN@121..122 ")" [] [], + }, + return_type_annotation: TsReturnTypeAnnotation { + colon_token: COLON@122..124 ":" [] [Whitespace(" ")], + ty: TsNumberType { + number_token: NUMBER_KW@124..131 "number" [] [Whitespace(" ")], + }, + }, + separator_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@131..132 "}" [] [], + }, + semicolon_token: missing (optional), + }, ], - eof_token: EOF@95..96 "" [Newline("\n")] [], + eof_token: EOF@132..133 "" [Newline("\n")] [], } -0: JS_MODULE@0..96 +0: JS_MODULE@0..133 0: (empty) 1: (empty) 2: JS_DIRECTIVE_LIST@0..0 - 3: JS_MODULE_ITEM_LIST@0..95 + 3: JS_MODULE_ITEM_LIST@0..132 0: TS_TYPE_ALIAS_DECLARATION@0..24 0: TYPE_KW@0..5 "type" [] [Whitespace(" ")] 1: TS_IDENTIFIER_BINDING@5..7 @@ -320,4 +385,49 @@ JsModule { 3: (empty) 2: R_CURLY@94..95 "}" [] [] 5: (empty) - 4: EOF@95..96 "" [Newline("\n")] [] + 3: TS_TYPE_ALIAS_DECLARATION@95..132 + 0: TYPE_KW@95..101 "type" [Newline("\n")] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@101..103 + 0: IDENT@101..103 "D" [] [Whitespace(" ")] + 2: (empty) + 3: EQ@103..105 "=" [] [Whitespace(" ")] + 4: TS_OBJECT_TYPE@105..132 + 0: L_CURLY@105..107 "{" [] [Whitespace(" ")] + 1: TS_TYPE_MEMBER_LIST@107..131 + 0: TS_CALL_SIGNATURE_TYPE_MEMBER@107..131 + 0: TS_TYPE_PARAMETERS@107..116 + 0: L_ANGLE@107..108 "<" [] [] + 1: TS_TYPE_PARAMETER_LIST@108..115 + 0: TS_TYPE_PARAMETER@108..115 + 0: TS_TYPE_PARAMETER_MODIFIER_LIST@108..114 + 0: TS_CONST_MODIFIER@108..114 + 0: CONST_KW@108..114 "const" [] [Whitespace(" ")] + 1: TS_TYPE_PARAMETER_NAME@114..115 + 0: IDENT@114..115 "A" [] [] + 2: (empty) + 3: (empty) + 2: R_ANGLE@115..116 ">" [] [] + 1: JS_PARAMETERS@116..122 + 0: L_PAREN@116..117 "(" [] [] + 1: JS_PARAMETER_LIST@117..121 + 0: JS_FORMAL_PARAMETER@117..121 + 0: JS_DECORATOR_LIST@117..117 + 1: JS_IDENTIFIER_BINDING@117..118 + 0: IDENT@117..118 "a" [] [] + 2: (empty) + 3: TS_TYPE_ANNOTATION@118..121 + 0: COLON@118..120 ":" [] [Whitespace(" ")] + 1: TS_REFERENCE_TYPE@120..121 + 0: JS_REFERENCE_IDENTIFIER@120..121 + 0: IDENT@120..121 "A" [] [] + 1: (empty) + 4: (empty) + 2: R_PAREN@121..122 ")" [] [] + 2: TS_RETURN_TYPE_ANNOTATION@122..131 + 0: COLON@122..124 ":" [] [Whitespace(" ")] + 1: TS_NUMBER_TYPE@124..131 + 0: NUMBER_KW@124..131 "number" [] [Whitespace(" ")] + 3: (empty) + 2: R_CURLY@131..132 "}" [] [] + 5: (empty) + 4: EOF@132..133 "" [Newline("\n")] [] diff --git a/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.ts b/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.ts index 1d95d251019a..890b6d27c1f4 100644 --- a/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.ts +++ b/crates/biome_js_parser/test_data/inline/ok/ts_call_signature_member.ts @@ -1,3 +1,4 @@ type A = { (): string; } type B = { (a, b, c): number } type C = { (a: A, b: B): number } +type D = { (a: A): number } diff --git a/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.rast b/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.rast index 6d06bbbeaa7c..076d49985a0b 100644 --- a/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.rast +++ b/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.rast @@ -313,15 +313,84 @@ JsModule { }, semicolon_token: missing (optional), }, + TsTypeAliasDeclaration { + type_token: TYPE_KW@216..222 "type" [Newline("\n")] [Whitespace(" ")], + binding_identifier: TsIdentifierBinding { + name_token: IDENT@222..224 "F" [] [Whitespace(" ")], + }, + type_parameters: missing (optional), + eq_token: EQ@224..226 "=" [] [Whitespace(" ")], + ty: TsObjectType { + l_curly_token: L_CURLY@226..228 "{" [] [Whitespace(" ")], + members: TsTypeMemberList [ + TsMethodSignatureTypeMember { + name: JsLiteralMemberName { + value: IDENT@228..229 "m" [] [], + }, + optional_token: missing (optional), + type_parameters: TsTypeParameters { + l_angle_token: L_ANGLE@229..230 "<" [] [], + items: TsTypeParameterList [ + TsTypeParameter { + modifiers: TsTypeParameterModifierList [ + TsConstModifier { + modifier_token: CONST_KW@230..236 "const" [] [Whitespace(" ")], + }, + ], + name: TsTypeParameterName { + ident_token: IDENT@236..237 "A" [] [], + }, + constraint: missing (optional), + default: missing (optional), + }, + ], + r_angle_token: R_ANGLE@237..238 ">" [] [], + }, + parameters: JsParameters { + l_paren_token: L_PAREN@238..239 "(" [] [], + items: JsParameterList [ + JsFormalParameter { + decorators: JsDecoratorList [], + binding: JsIdentifierBinding { + name_token: IDENT@239..240 "a" [] [], + }, + question_mark_token: missing (optional), + type_annotation: TsTypeAnnotation { + colon_token: COLON@240..242 ":" [] [Whitespace(" ")], + ty: TsReferenceType { + name: JsReferenceIdentifier { + value_token: IDENT@242..243 "A" [] [], + }, + type_arguments: missing (optional), + }, + }, + initializer: missing (optional), + }, + ], + r_paren_token: R_PAREN@243..244 ")" [] [], + }, + return_type_annotation: TsReturnTypeAnnotation { + colon_token: COLON@244..246 ":" [] [Whitespace(" ")], + ty: TsNeverType { + never_token: NEVER_KW@246..252 "never" [] [Whitespace(" ")], + }, + }, + separator_token: missing (optional), + }, + ], + r_curly_token: R_CURLY@252..253 "}" [] [], + }, + semicolon_token: missing (optional), + }, ], - eof_token: EOF@216..217 "" [Newline("\n")] [], + eof_token: EOF@253..254 "" [Newline("\n")] [], } -0: JS_MODULE@0..217 +0: JS_MODULE@0..254 0: (empty) 1: (empty) 2: JS_DIRECTIVE_LIST@0..0 - 3: JS_MODULE_ITEM_LIST@0..216 + 3: JS_MODULE_ITEM_LIST@0..253 0: TS_TYPE_ALIAS_DECLARATION@0..37 0: TYPE_KW@0..5 "type" [] [Whitespace(" ")] 1: TS_IDENTIFIER_BINDING@5..7 @@ -546,4 +615,52 @@ JsModule { 5: (empty) 2: R_CURLY@215..216 "}" [] [] 5: (empty) - 4: EOF@216..217 "" [Newline("\n")] [] + 5: TS_TYPE_ALIAS_DECLARATION@216..253 + 0: TYPE_KW@216..222 "type" [Newline("\n")] [Whitespace(" ")] + 1: TS_IDENTIFIER_BINDING@222..224 + 0: IDENT@222..224 "F" [] [Whitespace(" ")] + 2: (empty) + 3: EQ@224..226 "=" [] [Whitespace(" ")] + 4: TS_OBJECT_TYPE@226..253 + 0: L_CURLY@226..228 "{" [] [Whitespace(" ")] + 1: TS_TYPE_MEMBER_LIST@228..252 + 0: TS_METHOD_SIGNATURE_TYPE_MEMBER@228..252 + 0: JS_LITERAL_MEMBER_NAME@228..229 + 0: IDENT@228..229 "m" [] [] + 1: (empty) + 2: TS_TYPE_PARAMETERS@229..238 + 0: L_ANGLE@229..230 "<" [] [] + 1: TS_TYPE_PARAMETER_LIST@230..237 + 0: TS_TYPE_PARAMETER@230..237 + 0: TS_TYPE_PARAMETER_MODIFIER_LIST@230..236 + 0: TS_CONST_MODIFIER@230..236 + 0: CONST_KW@230..236 "const" [] [Whitespace(" ")] + 1: TS_TYPE_PARAMETER_NAME@236..237 + 0: IDENT@236..237 "A" [] [] + 2: (empty) + 3: (empty) + 2: R_ANGLE@237..238 ">" [] [] + 3: JS_PARAMETERS@238..244 + 0: L_PAREN@238..239 "(" [] [] + 1: JS_PARAMETER_LIST@239..243 + 0: JS_FORMAL_PARAMETER@239..243 + 0: JS_DECORATOR_LIST@239..239 + 1: JS_IDENTIFIER_BINDING@239..240 + 0: IDENT@239..240 "a" [] [] + 2: (empty) + 3: TS_TYPE_ANNOTATION@240..243 + 0: COLON@240..242 ":" [] [Whitespace(" ")] + 1: TS_REFERENCE_TYPE@242..243 + 0: JS_REFERENCE_IDENTIFIER@242..243 + 0: IDENT@242..243 "A" [] [] + 1: (empty) + 4: (empty) + 2: R_PAREN@243..244 ")" [] [] + 4: TS_RETURN_TYPE_ANNOTATION@244..252 + 0: COLON@244..246 ":" [] [Whitespace(" ")] + 1: TS_NEVER_TYPE@246..252 + 0: NEVER_KW@246..252 "never" [] [Whitespace(" ")] + 5: (empty) + 2: R_CURLY@252..253 "}" [] [] + 5: (empty) + 4: EOF@253..254 "" [Newline("\n")] [] diff --git a/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.ts b/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.ts index ac0ed50b481d..647fa057d20a 100644 --- a/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.ts +++ b/crates/biome_js_parser/test_data/inline/ok/ts_property_or_method_signature_member.ts @@ -3,3 +3,4 @@ type B = { a: string, b(): number } type C = { m(a: string, b: number, c: string): any } type D = { readonly: string, readonly a: number } type E = { m(a: A, b: B): never } +type F = { m(a: A): never }