Skip to content

Commit be425ce

Browse files
committed
Refactor: don't treat '<' as a binary-only operator
QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL and QLJS_CASE_BINARY_ONLY_OPERATOR include '<'. This is wrong, because '<' is also used to start a JSX expression. Remove '<' from QLJS_CASE_BINARY_ONLY_OPERATOR[_SYMBOL], and explicitly mention '<' in all uses of QLJS_CASE_BINARY_ONLY_OPERATOR[_SYMBOL]. Relatedly, rename QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_LESS_AND_STAR to QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_STAR. This commit should not change behavior.
1 parent b319de9 commit be425ce

File tree

4 files changed

+35
-24
lines changed

4 files changed

+35
-24
lines changed

src/parse.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ bool parser::is_let_token_a_variable_reference(
455455
case token_type::equal_greater:
456456
case token_type::incomplete_template:
457457
case token_type::left_paren:
458+
case token_type::less:
458459
case token_type::minus:
459460
case token_type::minus_minus:
460461
case token_type::plus:

src/quick-lint-js/parse-expression-inl.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ expression* parser::parse_primary_expression(Visitor& v, precedence prec) {
600600
case token_type::dot:
601601
case token_type::equal:
602602
case token_type::kw_in:
603+
case token_type::less:
603604
case token_type::question: {
604605
if (this->peek().type == token_type::star) {
605606
token star_token = this->peek();
@@ -885,6 +886,12 @@ expression* parser::parse_await_expression(Visitor& v, token await_token,
885886
case token_type::semicolon:
886887
return true;
887888

889+
// await <x>y</x>/g // operator
890+
// await < other // identifier
891+
case token_type::less:
892+
// TODO(strager): Resolve the ambiguity.
893+
return true;
894+
888895
// await /regexp/;
889896
// await / rhs;
890897
case token_type::slash:
@@ -1063,6 +1070,7 @@ expression* parser::parse_expression_remainder(Visitor& v, expression* ast,
10631070

10641071
// x + y
10651072
QLJS_CASE_BINARY_ONLY_OPERATOR:
1073+
case token_type::less:
10661074
case token_type::minus:
10671075
case token_type::plus:
10681076
case token_type::slash: {
@@ -1248,11 +1256,12 @@ expression* parser::parse_expression_remainder(Visitor& v, expression* ast,
12481256
case token_type::end_of_file:
12491257
case token_type::equal:
12501258
case token_type::left_paren:
1259+
case token_type::less:
12511260
case token_type::minus:
12521261
case token_type::plus:
12531262
case token_type::question:
1254-
case token_type::semicolon:
1255-
case token_type::right_paren: {
1263+
case token_type::right_paren:
1264+
case token_type::semicolon: {
12561265
source_code_span empty_property_name(dot_span.end(), dot_span.end());
12571266
binary_builder.replace_last(this->make_expression<expression::dot>(
12581267
binary_builder.last_expression(), identifier(empty_property_name)));
@@ -2143,7 +2152,7 @@ expression* parser::parse_object_literal(Visitor& v) {
21432152

21442153
// {x += y} // Invalid.
21452154
expression_without_key:
2146-
QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_LESS_AND_STAR:
2155+
QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_STAR:
21472156
QLJS_CASE_COMPOUND_ASSIGNMENT_OPERATOR:
21482157
QLJS_CASE_CONDITIONAL_ASSIGNMENT_OPERATOR:
21492158
case token_type::dot:

src/quick-lint-js/parse-statement-inl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ bool parser::parse_and_visit_statement(
159159
case token_type::kw_in:
160160
case token_type::kw_yield:
161161
case token_type::left_paren:
162+
case token_type::less:
162163
case token_type::minus:
163164
case token_type::minus_minus:
164165
case token_type::plus:
@@ -213,6 +214,7 @@ bool parser::parse_and_visit_statement(
213214
case token_type::kw_void:
214215
case token_type::left_paren:
215216
case token_type::left_square:
217+
case token_type::less:
216218
case token_type::minus:
217219
case token_type::minus_minus:
218220
case token_type::number:

src/quick-lint-js/token.h

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -85,29 +85,28 @@
8585
QLJS_CASE_CONTEXTUAL_KEYWORD: \
8686
QLJS_CASE_RESERVED_KEYWORD
8787

88-
#define QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_LESS_AND_STAR \
89-
case ::quick_lint_js::token_type::ampersand: \
90-
case ::quick_lint_js::token_type::ampersand_ampersand: \
91-
case ::quick_lint_js::token_type::bang_equal: \
92-
case ::quick_lint_js::token_type::bang_equal_equal: \
93-
case ::quick_lint_js::token_type::circumflex: \
94-
case ::quick_lint_js::token_type::equal_equal: \
95-
case ::quick_lint_js::token_type::equal_equal_equal: \
96-
case ::quick_lint_js::token_type::greater: \
97-
case ::quick_lint_js::token_type::greater_equal: \
98-
case ::quick_lint_js::token_type::greater_greater: \
99-
case ::quick_lint_js::token_type::greater_greater_greater: \
100-
case ::quick_lint_js::token_type::less_equal: \
101-
case ::quick_lint_js::token_type::less_less: \
102-
case ::quick_lint_js::token_type::percent: \
103-
case ::quick_lint_js::token_type::pipe: \
104-
case ::quick_lint_js::token_type::pipe_pipe: \
105-
case ::quick_lint_js::token_type::question_question: \
88+
#define QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_STAR \
89+
case ::quick_lint_js::token_type::ampersand: \
90+
case ::quick_lint_js::token_type::ampersand_ampersand: \
91+
case ::quick_lint_js::token_type::bang_equal: \
92+
case ::quick_lint_js::token_type::bang_equal_equal: \
93+
case ::quick_lint_js::token_type::circumflex: \
94+
case ::quick_lint_js::token_type::equal_equal: \
95+
case ::quick_lint_js::token_type::equal_equal_equal: \
96+
case ::quick_lint_js::token_type::greater: \
97+
case ::quick_lint_js::token_type::greater_equal: \
98+
case ::quick_lint_js::token_type::greater_greater: \
99+
case ::quick_lint_js::token_type::greater_greater_greater: \
100+
case ::quick_lint_js::token_type::less_equal: \
101+
case ::quick_lint_js::token_type::less_less: \
102+
case ::quick_lint_js::token_type::percent: \
103+
case ::quick_lint_js::token_type::pipe: \
104+
case ::quick_lint_js::token_type::pipe_pipe: \
105+
case ::quick_lint_js::token_type::question_question: \
106106
case ::quick_lint_js::token_type::star_star
107107

108-
#define QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL \
109-
QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_LESS_AND_STAR: \
110-
case ::quick_lint_js::token_type::less: \
108+
#define QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL \
109+
QLJS_CASE_BINARY_ONLY_OPERATOR_SYMBOL_EXCEPT_STAR: \
111110
case ::quick_lint_js::token_type::star
112111

113112
#define QLJS_CASE_BINARY_ONLY_OPERATOR \

0 commit comments

Comments
 (0)