Skip to content

Commit d0bbf64

Browse files
Martin JambonMartin Jambon
authored andcommitted
Add partial support for optional chaining: a?.b and a?.[b] but not f?.(x).
1 parent feca6ec commit d0bbf64

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

grammar.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,8 +624,9 @@ module.exports = grammar({
624624
field('parameters', $.formal_parameters)
625625
),
626626

627-
call_expression: $ => prec(PREC.CALL, seq(
627+
call_expression: $ => prec(PREC.MEMBER, seq(
628628
field('function', choice($._expression, $.super, $.function)),
629+
// optional('?.'), // TODO: optional chaining; doesn't work as is.
629630
field('arguments', choice($.arguments, $.template_string))
630631
)),
631632

@@ -674,13 +675,20 @@ module.exports = grammar({
674675
$.super,
675676
alias($._reserved_identifier, $.identifier)
676677
)),
677-
'.',
678+
choice('.', '?.'),
678679
field('property', alias($.identifier, $.property_identifier))
679680
)),
680681

681682
subscript_expression: $ => prec.right(PREC.MEMBER, seq(
682-
field('object', choice($._expression, $.super)),
683-
'[', field('index', $._expressions), ']'
683+
field('object', choice(
684+
$._expression,
685+
$.identifier,
686+
$.super,
687+
alias($._reserved_identifier, $.identifier)
688+
)),
689+
choice('[', seq('?.', '[')),
690+
field('index', $._expressions),
691+
']'
684692
)),
685693

686694
_lhs_expression: $ => choice(

test/corpus/expressions.txt

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,36 @@ function(x, y) {
705705
(statement_block))
706706
(arguments (identifier) (identifier)))))
707707

708+
============================================
709+
Optional chaining property access
710+
============================================
711+
712+
a . b;
713+
a ?. b;
714+
715+
---
716+
717+
(program
718+
(expression_statement
719+
(member_expression (identifier) (property_identifier)))
720+
(expression_statement
721+
(member_expression (identifier) (property_identifier))))
722+
723+
============================================
724+
Optional chaining array access
725+
============================================
726+
727+
a [b];
728+
a ?. [b];
729+
730+
---
731+
732+
(program
733+
(expression_statement
734+
(subscript_expression (identifier) (identifier)))
735+
(expression_statement
736+
(subscript_expression (identifier) (identifier))))
737+
708738
============================================
709739
Constructor calls
710740
============================================

0 commit comments

Comments
 (0)