Skip to content

Commit 88ff5c0

Browse files
committed
refactor(fe): avoid boolean parameter allow_in_operator; use precedence::in_operator
We pass the allow_in_operator boolean around in a few spots. Boolean parameters are a bit ugly, and also I need other parts of 'precedence' for a future patch. Refactor several parsing functions to accept a precedence object instead of one boolean extracted from the precedence.
1 parent d81893e commit 88ff5c0

File tree

2 files changed

+27
-33
lines changed

2 files changed

+27
-33
lines changed

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

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -685,8 +685,7 @@ expression* parser::parse_primary_expression(parse_visitor_base& v,
685685
expression* arrow_function = this->parse_arrow_function_body(
686686
v, function_attributes::normal,
687687
/*parameter_list_begin=*/arrow_span.begin(),
688-
/*allow_in_operator=*/prec.in_operator,
689-
expression_arena::array_ptr<expression*>(),
688+
/*prec=*/prec, expression_arena::array_ptr<expression*>(),
690689
/*return_type_visits=*/nullptr);
691690
return arrow_function;
692691
}
@@ -747,17 +746,16 @@ expression* parser::parse_primary_expression(parse_visitor_base& v,
747746
expression* parser::parse_async_expression(parse_visitor_base& v,
748747
const token& async_token,
749748
precedence prec) {
750-
expression* ast = this->parse_async_expression_only(
751-
v, async_token, /*allow_in_operator=*/prec.in_operator);
749+
expression* ast =
750+
this->parse_async_expression_only(v, async_token, /*prec=*/prec);
752751
if (!prec.binary_operators) {
753752
return ast;
754753
}
755754
return this->parse_expression_remainder(v, ast, prec);
756755
}
757756

758757
expression* parser::parse_async_expression_only(
759-
parse_visitor_base& v, const token& async_or_await_token,
760-
bool allow_in_operator) {
758+
parse_visitor_base& v, const token& async_or_await_token, precedence prec) {
761759
bool is_async = async_or_await_token.type == token_type::kw_async;
762760
bool is_await = async_or_await_token.type == token_type::kw_await;
763761
QLJS_ASSERT(is_async || is_await);
@@ -786,8 +784,7 @@ expression* parser::parse_async_expression_only(
786784
}
787785
expression* ast = this->parse_arrow_function_body_no_scope(
788786
v, function_attributes::async, async_begin,
789-
/*allow_in_operator=*/allow_in_operator,
790-
this->expressions_.make_array(std::move(parameters)),
787+
/*prec=*/prec, this->expressions_.make_array(std::move(parameters)),
791788
/*return_type_visits=*/return_type_visits);
792789
v.visit_exit_function_scope();
793790
return ast;
@@ -1251,8 +1248,7 @@ expression* parser::parse_await_expression(parse_visitor_base& v,
12511248
return this->make_expression<expression::variable>(
12521249
await_token.identifier_name(), await_token.type);
12531250
} else {
1254-
return this->parse_async_expression_only(
1255-
v, await_token, /*allow_in_operator=*/prec.in_operator);
1251+
return this->parse_async_expression_only(v, await_token, /*prec=*/prec);
12561252
}
12571253
}
12581254

@@ -1490,7 +1486,7 @@ expression* parser::parse_expression_remainder(parse_visitor_base& v,
14901486
expression* arrow_function = this->parse_arrow_function_body(
14911487
v, /*attributes=*/function_attributes::async,
14921488
/*parameter_list_begin=*/call->left_paren_span().begin(),
1493-
/*allow_in_operator=*/prec.in_operator,
1489+
/*prec=*/prec,
14941490
/*parameters=*/
14951491
expression_arena::array_ptr<expression*>(
14961492
call->children_.begin() + 1, // Drop the callee.
@@ -1911,7 +1907,7 @@ expression* parser::parse_expression_remainder(parse_visitor_base& v,
19111907
binary_builder.replace_last(this->parse_arrow_function_expression_remainder(
19121908
v, /*generic_parameter_visits=*/nullptr, lhs,
19131909
/*return_type_visits=*/return_type_visits,
1914-
/*allow_in_operator=*/prec.in_operator));
1910+
/*prec=*/prec));
19151911
goto next;
19161912
}
19171913

@@ -1976,7 +1972,7 @@ expression* parser::parse_expression_remainder(parse_visitor_base& v,
19761972
/*generic_parameter_visits=*/nullptr,
19771973
binary_builder.last_expression(),
19781974
/*return_type_visits=*/nullptr,
1979-
/*allow_in_operator=*/prec.in_operator));
1975+
/*prec=*/prec));
19801976
}
19811977
break;
19821978
}
@@ -2139,7 +2135,7 @@ expression* parser::parse_expression_remainder(parse_visitor_base& v,
21392135
expression* parser::parse_arrow_function_expression_remainder(
21402136
parse_visitor_base& v, buffering_visitor* generic_parameter_visits,
21412137
expression* parameters_expression, buffering_visitor* return_type_visits,
2142-
bool allow_in_operator) {
2138+
precedence prec) {
21432139
const char8* parameter_list_begin = nullptr;
21442140
if (parameters_expression->kind() == expression_kind::paren) {
21452141
parameter_list_begin = parameters_expression->span().begin();
@@ -2312,8 +2308,7 @@ expression* parser::parse_arrow_function_expression_remainder(
23122308
expression* arrow_function = this->parse_arrow_function_body_no_scope(
23132309
v, /*attributes=*/function_attributes::normal,
23142310
/*parameter_list_begin=*/parameter_list_begin,
2315-
/*allow_in_operator=*/allow_in_operator,
2316-
this->expressions_.make_array(std::move(parameters)),
2311+
/*prec=*/prec, this->expressions_.make_array(std::move(parameters)),
23172312
/*return_type_visits=*/return_type_visits);
23182313
arrow_function = this->maybe_wrap_erroneous_arrow_function(
23192314
arrow_function, /*parameters_expression=*/parameters_expression);
@@ -2430,20 +2425,20 @@ parser::parse_arrow_function_parameters_or_call_arguments(
24302425

24312426
expression* parser::parse_arrow_function_body(
24322427
parse_visitor_base& v, function_attributes attributes,
2433-
const char8* parameter_list_begin, bool allow_in_operator,
2428+
const char8* parameter_list_begin, precedence prec,
24342429
expression_arena::array_ptr<expression*>&& parameters,
24352430
buffering_visitor* return_type_visits) {
24362431
v.visit_enter_function_scope();
24372432
expression* arrow = this->parse_arrow_function_body_no_scope(
2438-
v, attributes, parameter_list_begin, allow_in_operator,
2439-
std::move(parameters), return_type_visits);
2433+
v, attributes, parameter_list_begin, prec, std::move(parameters),
2434+
return_type_visits);
24402435
v.visit_exit_function_scope();
24412436
return arrow;
24422437
}
24432438

24442439
expression* parser::parse_arrow_function_body_no_scope(
24452440
parse_visitor_base& v, function_attributes attributes,
2446-
const char8* parameter_list_begin, bool allow_in_operator,
2441+
const char8* parameter_list_begin, precedence prec,
24472442
expression_arena::array_ptr<expression*>&& parameters,
24482443
buffering_visitor* return_type_visits) {
24492444
function_guard guard = this->enter_function(attributes);
@@ -2466,9 +2461,10 @@ expression* parser::parse_arrow_function_body_no_scope(
24662461
this->parse_and_visit_statement_block_no_scope(v);
24672462
} else {
24682463
this->parse_and_visit_expression(
2464+
// FIXME(strager): Should we inherit other things from prec?
24692465
v, precedence{
24702466
.commas = false,
2471-
.in_operator = allow_in_operator,
2467+
.in_operator = prec.in_operator,
24722468
.colon_type_annotation = allow_type_annotations::never,
24732469
});
24742470
}
@@ -3189,9 +3185,8 @@ expression* parser::parse_jsx_or_typescript_generic_expression(
31893185
case token_type::equal:
31903186
case token_type::kw_extends:
31913187
this->lexer_.roll_back_transaction(std::move(transaction));
3192-
return this->parse_typescript_generic_arrow_expression(
3193-
v,
3194-
/*allow_in_operator=*/prec.in_operator);
3188+
return this->parse_typescript_generic_arrow_expression(v,
3189+
/*prec=*/prec);
31953190

31963191
// <T>() => {} // Generic arrow function.
31973192
// <T>expr // Cast.
@@ -3634,7 +3629,7 @@ expression* parser::parse_jsx_element_or_fragment(parse_visitor_base& v,
36343629
}
36353630

36363631
expression* parser::parse_typescript_generic_arrow_expression(
3637-
parse_visitor_base& v, bool allow_in_operator) {
3632+
parse_visitor_base& v, precedence prec) {
36383633
const char8* begin = this->peek().begin;
36393634

36403635
v.visit_enter_function_scope();
@@ -3661,8 +3656,7 @@ expression* parser::parse_typescript_generic_arrow_expression(
36613656

36623657
expression* ast = this->parse_arrow_function_body_no_scope(
36633658
v, function_attributes::normal, begin,
3664-
/*allow_in_operator=*/allow_in_operator,
3665-
this->expressions_.make_array(std::move(parameters)),
3659+
/*prec=*/prec, this->expressions_.make_array(std::move(parameters)),
36663660
/*return_type_visits=*/&return_type_visits);
36673661

36683662
v.visit_exit_function_scope();
@@ -3750,7 +3744,7 @@ expression* parser::parse_typescript_angle_type_assertion_expression(
37503744
v,
37513745
/*generic_parameter_visits=*/&generic_parameter_visits, ast,
37523746
/*return_type_visits=*/&return_type_visits,
3753-
/*allow_in_operator=*/prec.in_operator);
3747+
/*prec=*/prec);
37543748
}
37553749
}
37563750

src/quick-lint-js/fe/parse.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -573,15 +573,15 @@ class parser {
573573
// a unary operator or a mistyped 'async'.
574574
expression *parse_async_expression_only(parse_visitor_base &,
575575
const token &async_or_await_token,
576-
bool allow_in_operator);
576+
precedence);
577577
expression *parse_await_expression(parse_visitor_base &,
578578
const token &await_token, precedence prec);
579579
expression *parse_expression_remainder(parse_visitor_base &, expression *,
580580
precedence);
581581
expression *parse_arrow_function_expression_remainder(
582582
parse_visitor_base &, buffering_visitor *generic_parameter_visits,
583583
expression *parameters_expression, buffering_visitor *return_type_visits,
584-
bool allow_in_operator);
584+
precedence);
585585
expression::call *parse_call_expression_remainder(parse_visitor_base &,
586586
expression *callee);
587587
expression *parse_index_expression_remainder(parse_visitor_base &,
@@ -590,12 +590,12 @@ class parser {
590590
parse_arrow_function_parameters_or_call_arguments(parse_visitor_base &v);
591591
expression *parse_arrow_function_body(
592592
parse_visitor_base &, function_attributes,
593-
const char8 *parameter_list_begin, bool allow_in_operator,
593+
const char8 *parameter_list_begin, precedence,
594594
expression_arena::array_ptr<expression *> &&parameters,
595595
buffering_visitor *return_type_visits);
596596
expression *parse_arrow_function_body_no_scope(
597597
parse_visitor_base &, function_attributes,
598-
const char8 *parameter_list_begin, bool allow_in_operator,
598+
const char8 *parameter_list_begin, precedence,
599599
expression_arena::array_ptr<expression *> &&parameters,
600600
buffering_visitor *return_type_visits);
601601
expression *parse_function_expression(parse_visitor_base &,
@@ -618,7 +618,7 @@ class parser {
618618
const char8 *less_begin);
619619
void check_jsx_attribute(const identifier &attribute_name);
620620
expression *parse_typescript_generic_arrow_expression(parse_visitor_base &,
621-
bool allow_in_operator);
621+
precedence);
622622
expression *parse_typescript_angle_type_assertion_expression(
623623
parse_visitor_base &, precedence, bool is_invalid_due_to_jsx_ambiguity);
624624
expression *parse_tagged_template(parse_visitor_base &, expression *tag);

0 commit comments

Comments
 (0)