Skip to content

Commit e47b6e4

Browse files
committed
fix!: correct ASI for arrow function followed by parenthesized expressions. arrow_functions are now expressions rather than primary_expressions and new_expressions are now primary_expressions
1 parent d48469f commit e47b6e4

File tree

8 files changed

+51853
-47702
lines changed

8 files changed

+51853
-47702
lines changed

grammar.js

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,12 @@ module.exports = grammar({
1515
$._automatic_semicolon,
1616
$._template_chars,
1717
$._ternary_qmark,
18+
$._shorthand_arrow,
1819
$.html_comment,
20+
// we use these just as signaling to the ASI scanner
1921
'||',
22+
'(',
23+
'[',
2024
// We use escape sequence and regex pattern to tell the scanner if we're currently inside a string or template string, in which case
2125
// it should NOT parse html comments.
2226
$.escape_sequence,
@@ -58,7 +62,6 @@ module.exports = grammar({
5862
precedences: $ => [
5963
[
6064
'member',
61-
'template_call',
6265
'call',
6366
$.update_expression,
6467
'unary_void',
@@ -78,8 +81,9 @@ module.exports = grammar({
7881
$.sequence_expression,
7982
$.arrow_function,
8083
],
84+
['new', $.primary_expression],
8185
['assign', $.primary_expression],
82-
['member', 'template_call', 'new', 'call', $.expression],
86+
['member', 'new_args', 'call', 'new_no_args', $.expression],
8387
['declaration', 'literal'],
8488
[$.primary_expression, $.statement_block, 'object'],
8589
[$.meta_property, $.import],
@@ -488,12 +492,14 @@ module.exports = grammar({
488492
$.binary_expression,
489493
$.ternary_expression,
490494
$.update_expression,
491-
$.new_expression,
492495
$.yield_expression,
496+
$.arrow_function,
493497
),
494498

499+
// Note: this is similar to MemberExpression from the ecmascript spec
495500
primary_expression: $ => choice(
496501
$.subscript_expression,
502+
$.new_expression,
497503
$.member_expression,
498504
$.parenthesized_expression,
499505
$._identifier,
@@ -510,7 +516,6 @@ module.exports = grammar({
510516
$.object,
511517
$.array,
512518
$.function_expression,
513-
$.arrow_function,
514519
$.generator_function,
515520
$.class,
516521
$.meta_property,
@@ -768,11 +773,10 @@ module.exports = grammar({
768773
)),
769774
$._call_signature,
770775
),
771-
'=>',
772-
field('body', choice(
773-
$.expression,
774-
$.statement_block,
775-
)),
776+
choice(
777+
seq($._shorthand_arrow, field('body', $.expression)),
778+
seq(choice('=>', $._shorthand_arrow), field('body', $.statement_block)),
779+
),
776780
),
777781

778782
// Override
@@ -783,12 +787,8 @@ module.exports = grammar({
783787

784788
call_expression: $ => choice(
785789
prec('call', seq(
786-
field('function', choice($.expression, $.import)),
787-
field('arguments', $.arguments),
788-
)),
789-
prec('template_call', seq(
790-
field('function', choice($.primary_expression, $.new_expression)),
791-
field('arguments', $.template_string),
790+
field('function', choice($.primary_expression, $.import)),
791+
field('arguments', choice($.arguments, $.template_string)),
792792
)),
793793
prec('member', seq(
794794
field('function', $.primary_expression),
@@ -797,11 +797,17 @@ module.exports = grammar({
797797
)),
798798
),
799799

800-
new_expression: $ => prec.right('new', seq(
801-
'new',
802-
field('constructor', choice($.primary_expression, $.new_expression)),
803-
field('arguments', optional(prec.dynamic(1, $.arguments))),
804-
)),
800+
new_expression: $ => choice(
801+
prec('new_args', seq(
802+
'new',
803+
field('constructor', $.primary_expression),
804+
field('arguments', $.arguments),
805+
)),
806+
prec('new_no_args', seq(
807+
'new',
808+
field('constructor', $.primary_expression),
809+
)),
810+
),
805811

806812
await_expression: $ => prec('unary_void', seq(
807813
'await',

0 commit comments

Comments
 (0)