Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Commit

Permalink
fix(rome_js_parser): Crash at @ character in class name / body #4669
Browse files Browse the repository at this point in the history
  • Loading branch information
denbezrukov committed Jul 10, 2023
1 parent db94996 commit a9f0df3
Show file tree
Hide file tree
Showing 17 changed files with 295 additions and 19 deletions.
19 changes: 14 additions & 5 deletions crates/rome_js_parser/src/syntax/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -561,7 +561,20 @@ fn parse_class_member(p: &mut JsParser, inside_abstract_class: bool) -> ParsedSy
Present(member)
}
Absent => {
debug_assert!(modifiers.is_empty());
// If the modifier list contains a modifier other than a decorator, such modifiers can also be valid member names.
debug_assert!(!modifiers
.flags
.contains(ModifierFlags::ALL_MODIFIERS_EXCEPT_DECORATOR));

// test_err ts ts_broken_class_member_modifiers
// class C {
// @decorator
// }
// class CC {
// @
// }
// class @
// class C@
modifiers.abandon(p);
Absent
}
Expand Down Expand Up @@ -2024,11 +2037,7 @@ impl ClassMemberModifiers {
}

/// Abandons the marker for the modifier list
///
/// ## Panics
/// If the modifier list isn't empty
fn abandon(mut self, p: &mut JsParser) {
debug_assert!(self.is_empty());
self.list_marker.undo_completion(p).abandon(p);
self.bomb.defuse();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,259 @@
JsModule {
interpreter_token: missing (optional),
directives: JsDirectiveList [],
items: JsModuleItemList [
JsBogusStatement {
items: [
JsDecoratorList [],
[email protected] "class" [] [Whitespace(" ")],
JsIdentifierBinding {
name_token: [email protected] "C" [] [Whitespace(" ")],
},
[email protected] "{" [] [],
JsBogus {
items: [
JsDecorator {
at_token: [email protected] "@" [Newline("\n"), Whitespace("\t")] [],
expression: JsIdentifierExpression {
name: JsReferenceIdentifier {
value_token: [email protected] "decorator" [] [],
},
},
},
],
},
[email protected] "}" [Newline("\n"), Whitespace("\t")] [],
],
},
JsBogusStatement {
items: [
JsDecoratorList [],
[email protected] "class" [Newline("\n")] [Whitespace(" ")],
JsIdentifierBinding {
name_token: [email protected] "CC" [] [Whitespace(" ")],
},
[email protected] "{" [] [],
JsBogus {
items: [
JsDecorator {
at_token: [email protected] "@" [Newline("\n"), Whitespace("\t")] [],
expression: missing (required),
},
],
},
[email protected] "}" [Newline("\n"), Whitespace("\t")] [],
],
},
JsBogusStatement {
items: [
JsDecoratorList [],
[email protected] "class" [Newline("\n")] [Whitespace(" ")],
JsBogus {
items: [
JsDecorator {
at_token: [email protected] "@" [] [],
expression: JsBogusExpression {
items: [
JsDecoratorList [],
[email protected] "class" [Newline("\n")] [Whitespace(" ")],
JsIdentifierBinding {
name_token: [email protected] "C" [] [],
},
JsBogus {
items: [
JsDecorator {
at_token: [email protected] "@" [] [],
expression: missing (required),
},
],
},
],
},
},
],
},
],
},
],
eof_token: [email protected] "" [Newline("\n")] [],
}

0: [email protected]
0: (empty)
1: [email protected]
2: [email protected]
0: [email protected]
0: [email protected]
1: [email protected] "class" [] [Whitespace(" ")]
2: [email protected]
0: [email protected] "C" [] [Whitespace(" ")]
3: [email protected] "{" [] []
4: [email protected]
0: [email protected]
0: [email protected] "@" [Newline("\n"), Whitespace("\t")] []
1: [email protected]
0: [email protected]
0: [email protected] "decorator" [] []
5: [email protected] "}" [Newline("\n"), Whitespace("\t")] []
1: [email protected]
0: [email protected]
1: [email protected] "class" [Newline("\n")] [Whitespace(" ")]
2: [email protected]
0: [email protected] "CC" [] [Whitespace(" ")]
3: [email protected] "{" [] []
4: [email protected]
0: [email protected]
0: [email protected] "@" [Newline("\n"), Whitespace("\t")] []
1: (empty)
5: [email protected] "}" [Newline("\n"), Whitespace("\t")] []
2: [email protected]
0: [email protected]
1: [email protected] "class" [Newline("\n")] [Whitespace(" ")]
2: [email protected]
0: [email protected]
0: [email protected] "@" [] []
1: [email protected]
0: [email protected]
1: [email protected] "class" [Newline("\n")] [Whitespace(" ")]
2: [email protected]
0: [email protected] "C" [] []
3: [email protected]
0: [email protected]
0: [email protected] "@" [] []
1: (empty)
3: [email protected] "" [Newline("\n")] []
--
ts_broken_class_member_modifiers.ts:3:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected an identifier, a string literal, a number literal, a private field name, or a computed name but instead found '}'

1 │ class C {
2 │ @decorator
> 3 │ }
│ ^
4 │ class CC {
5 │ @

i Expected an identifier, a string literal, a number literal, a private field name, or a computed name here

1 │ class C {
2 │ @decorator
> 3 │ }
│ ^
4 │ class CC {
5 │ @

--
ts_broken_class_member_modifiers.ts:6:2 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected an expression but instead found '}'

4 │ class CC {
5 │ @
> 6 │ }
│ ^
7 │ class @
8 │ class C@

i Expected an expression here

4 │ class CC {
5 │ @
> 6 │ }
│ ^
7 │ class @
8 │ class C@

--
ts_broken_class_member_modifiers.ts:7:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× class declarations must have a name

5 │ @
6 │ }
> 7 │ class @
│ ^^^^^^
8 │ class C@
9 │

--
ts_broken_class_member_modifiers.ts:7:7 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected `{` but instead found `@`

5 │ @
6 │ }
> 7 │ class @
│ ^
8 │ class C@
9 │

i Remove @

--
ts_broken_class_member_modifiers.ts:8:8 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected `{` but instead found `@`

6 │ }
7 │ class @
> 8 │ class C@
│ ^
9 │

i Remove @

--
ts_broken_class_member_modifiers.ts:9:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected an expression but instead found the end of the file

7 │ class @
8 │ class C@
> 9 │

i Expected an expression here

7 │ class @
8 │ class C@
> 9 │

--
ts_broken_class_member_modifiers.ts:8:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× Invalid decorator `class C@`

6 │ }
7 │ class @
> 8 │ class C@
│ ^^^^^^^^
9 │

--
ts_broken_class_member_modifiers.ts:9:1 parse ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

× expected an identifier, a string literal, a number literal, a private field name, or a computed name but instead found the end of the file

7 │ class @
8 │ class C@
> 9 │

i Expected an identifier, a string literal, a number literal, a private field name, or a computed name here

7 │ class @
8 │ class C@
> 9 │

--
class C {
@decorator
}
class CC {
@
}
class @
class C@
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
class C {
@decorator
}
class CC {
@
}
class @
class C@
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{ "parse_class_parameter_decorators": true }
{ "parse_class_parameter_decorators": true }

0 comments on commit a9f0df3

Please sign in to comment.