Skip to content

Commit bcf3a18

Browse files
committed
feat(fe): parse decorators on class expressions
1 parent 6ad9e6e commit bcf3a18

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/quick-lint-js/fe/parse-expression.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,11 +633,18 @@ Expression* Parser::parse_primary_expression(Parse_Visitor_Base& v,
633633
}
634634

635635
// class {}
636+
parse_class:
636637
case Token_Type::kw_class: {
637638
Expression* class_expression = this->parse_class_expression(v);
638639
return class_expression;
639640
}
640641

642+
// @myDecorator class {}
643+
case Token_Type::at:
644+
// TODO(strager): Should we make a Decorated expression type?
645+
this->parse_and_visit_decorator(v);
646+
goto parse_class;
647+
641648
// new XMLHttpRequest()
642649
// new.target
643650
case Token_Type::kw_new: {

test/test-parse-decorator.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,32 @@ TEST_F(Test_Parse_Decorator, export_default_class_decorator) {
123123
}
124124
}
125125

126+
TEST_F(Test_Parse_Decorator, class_expression_decorator) {
127+
{
128+
Spy_Visitor p = test_parse_and_visit_statement(
129+
u8"(@myDecorator class C {});"_sv, no_diags, javascript_options);
130+
EXPECT_THAT(p.visits, ElementsAreArray({
131+
"visit_variable_use", // myDecorator
132+
"visit_enter_class_scope", // C
133+
"visit_enter_class_scope_body", // {
134+
"visit_exit_class_scope", // }
135+
}));
136+
EXPECT_THAT(p.variable_uses, ElementsAreArray({u8"myDecorator"_sv}));
137+
}
138+
139+
{
140+
Spy_Visitor p = test_parse_and_visit_statement(
141+
u8"(@myDecorator class {});"_sv, no_diags, javascript_options);
142+
EXPECT_THAT(p.visits, ElementsAreArray({
143+
"visit_variable_use", // myDecorator
144+
"visit_enter_class_scope", // class
145+
"visit_enter_class_scope_body", // {
146+
"visit_exit_class_scope", // }
147+
}));
148+
EXPECT_THAT(p.variable_uses, ElementsAreArray({u8"myDecorator"_sv}));
149+
}
150+
}
151+
126152
TEST_F(Test_Parse_Decorator,
127153
private_identifiers_are_allowed_as_property_names) {
128154
Spy_Visitor p = test_parse_and_visit_statement(

0 commit comments

Comments
 (0)