Skip to content

Commit 452151f

Browse files
New Patterns (#155)
* Adds `pattern` construct in place of `formal_parameter` * Adds generated source files. * Makes patterns a supertype, also removes some unneeded comments. * Fixes bugs due to new patterns * Simplifies locals.scm query * Make patterns visible. * Allow primary_expression to be targeted as a supertype * Removes extraneous comments Co-authored-by: Max Brunsfeld <[email protected]>
1 parent 37af80d commit 452151f

File tree

9 files changed

+36175
-28415
lines changed

9 files changed

+36175
-28415
lines changed

grammar.js

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,17 +41,15 @@ module.exports = grammar({
4141
$._statement,
4242
$._declaration,
4343
$._expression,
44-
$._destructuring_pattern,
44+
$.primary_expression,
45+
$.pattern,
4546
],
4647

4748
inline: $ => [
4849
$._call_signature,
49-
$._primary_expression,
5050
$._statement,
5151
$._expressions,
5252
$._semicolon,
53-
$._formal_parameter,
54-
$._destructuring_pattern,
5553
$._reserved_identifier,
5654
$._jsx_attribute,
5755
$._jsx_element_name,
@@ -64,16 +62,22 @@ module.exports = grammar({
6462
],
6563

6664
conflicts: $ => [
67-
[$._expression, $._property_name],
68-
[$._expression, $._property_name, $.arrow_function],
69-
[$._expression, $.arrow_function],
70-
[$._expression, $.method_definition],
71-
[$._expression, $.formal_parameters],
72-
[$._expression, $.rest_parameter],
65+
[$.primary_expression, $._property_name],
66+
[$.primary_expression, $._property_name, $.arrow_function],
67+
[$.primary_expression, $.arrow_function],
68+
[$.primary_expression, $.method_definition],
69+
[$.primary_expression, $.rest_parameter],
70+
[$.primary_expression, $.pattern],
71+
[$.primary_expression, $.assignment_expression, ],
72+
[$.primary_expression, $._for_header],
73+
[$.object, $.object_pattern],
74+
[$.array, $.array_pattern],
75+
[$.assignment_expression, $.pattern],
76+
[$.assignment_expression, $.rest_parameter],
77+
[$.assignment_expression, $.object_assignment_pattern],
78+
[$.assignment_expression, $.assignment_pattern],
7379
[$.labeled_statement, $._property_name],
74-
[$.assignment_pattern, $.assignment_expression],
7580
[$.computed_property_name, $.array],
76-
[$._for_header, $._expression],
7781
],
7882

7983
word: $ => $.identifier,
@@ -401,7 +405,7 @@ module.exports = grammar({
401405
),
402406

403407
_expression: $ => choice(
404-
$._primary_expression,
408+
$.primary_expression,
405409
$._jsx_element,
406410
$.jsx_fragment,
407411
$.assignment_expression,
@@ -415,7 +419,7 @@ module.exports = grammar({
415419
$.yield_expression,
416420
),
417421

418-
_primary_expression: $ => choice(
422+
primary_expression: $ => choice(
419423
$.this,
420424
$.super,
421425
$.identifier,
@@ -455,7 +459,6 @@ module.exports = grammar({
455459
$.pair,
456460
$.spread_element,
457461
$.method_definition,
458-
$.assignment_pattern,
459462
alias(
460463
choice($.identifier, $._reserved_identifier),
461464
$.shorthand_property_identifier
@@ -464,9 +467,29 @@ module.exports = grammar({
464467
'}'
465468
)),
466469

470+
object_pattern: $ => prec(PREC.OBJECT, seq(
471+
'{',
472+
commaSep(optional(choice(
473+
$.pair_pattern,
474+
$.rest_parameter,
475+
$.object_assignment_pattern,
476+
alias(
477+
choice($.identifier, $._reserved_identifier),
478+
$.shorthand_property_identifier_pattern
479+
)
480+
))),
481+
'}'
482+
)),
483+
467484
assignment_pattern: $ => seq(
485+
field('left', $.pattern),
486+
'=',
487+
field('right', $._expression)
488+
),
489+
490+
object_assignment_pattern: $ => seq(
468491
field('left', choice(
469-
alias(choice($._reserved_identifier, $.identifier), $.shorthand_property_identifier),
492+
alias(choice($._reserved_identifier, $.identifier), $.shorthand_property_identifier_pattern),
470493
$._destructuring_pattern
471494
)),
472495
'=',
@@ -482,6 +505,14 @@ module.exports = grammar({
482505
']'
483506
),
484507

508+
array_pattern: $ => seq(
509+
'[',
510+
commaSep(optional(choice(
511+
$.pattern
512+
))),
513+
']'
514+
),
515+
485516
_jsx_element: $ => choice($.jsx_element, $.jsx_self_closing_element),
486517

487518
jsx_element: $ => seq(
@@ -655,15 +686,15 @@ module.exports = grammar({
655686
field('arguments', choice($.arguments, $.template_string))
656687
)),
657688
prec(PREC.MEMBER, seq(
658-
field('function', $._primary_expression),
689+
field('function', $.primary_expression),
659690
'?.',
660691
field('arguments', $.arguments)
661692
))
662693
),
663694

664695
new_expression: $ => prec.right(PREC.NEW, seq(
665696
'new',
666-
field('constructor', $._primary_expression),
697+
field('constructor', $.primary_expression),
667698
field('arguments', optional(prec.dynamic(1, $.arguments)))
668699
)),
669700

@@ -673,13 +704,13 @@ module.exports = grammar({
673704
),
674705

675706
member_expression: $ => prec(PREC.MEMBER, seq(
676-
field('object', choice($._expression, $._primary_expression)),
707+
field('object', choice($._expression, $.primary_expression)),
677708
choice('.', '?.'),
678709
field('property', alias($.identifier, $.property_identifier))
679710
)),
680711

681712
subscript_expression: $ => prec.right(PREC.MEMBER, seq(
682-
field('object', choice($._expression, $._primary_expression)),
713+
field('object', choice($._expression, $.primary_expression)),
683714
optional('?.'),
684715
'[', field('index', $._expressions), ']'
685716
)),
@@ -719,8 +750,8 @@ module.exports = grammar({
719750
),
720751

721752
_destructuring_pattern: $ => choice(
722-
alias($.object, $.object_pattern),
723-
alias($.array, $.array_pattern)
753+
$.object_pattern,
754+
$.array_pattern
724755
),
725756

726757
spread_element: $ => seq('...', $._expression),
@@ -997,13 +1028,13 @@ module.exports = grammar({
9971028
formal_parameters: $ => seq(
9981029
'(',
9991030
optional(seq(
1000-
commaSep1($._formal_parameter),
1031+
commaSep1($.pattern),
10011032
optional(',')
10021033
)),
10031034
')'
10041035
),
10051036

1006-
_formal_parameter: $ => choice(
1037+
pattern: $ => choice(
10071038
$.identifier,
10081039
alias($._reserved_identifier, $.identifier),
10091040
$._destructuring_pattern,
@@ -1035,6 +1066,12 @@ module.exports = grammar({
10351066
field('value', $._expression)
10361067
),
10371068

1069+
pair_pattern: $ => seq(
1070+
field('key', $._property_name),
1071+
':',
1072+
field('value', $.pattern)
1073+
),
1074+
10381075
_property_name: $ => choice(
10391076
alias(choice(
10401077
$.identifier,

queries/highlights.scm

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
; Special identifiers
22
;--------------------
33

4-
((identifier) @constant
4+
([
5+
(identifier)
6+
(shorthand_property_identifier)
7+
(shorthand_property_identifier_pattern)
8+
] @constant
59
(#match? @constant "^[A-Z_][A-Z\\d_]+$"))
610

7-
((shorthand_property_identifier) @constant
8-
(#match? @constant "^[A-Z_][A-Z\\d_]+$"))
911

1012
((identifier) @constructor
1113
(#match? @constructor "^[A-Z]"))
@@ -65,8 +67,8 @@
6567
(identifier) @variable.parameter)
6668
(object_pattern
6769
[
68-
(pair value: (identifier) @variable.parameter)
69-
(shorthand_property_identifier) @variable.parameter
70+
(pair_pattern value: (identifier) @variable.parameter)
71+
(shorthand_property_identifier_pattern) @variable.parameter
7072
])
7173
]
7274
)

queries/locals.scm

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,7 @@
1212
; Definitions
1313
;------------
1414

15-
(formal_parameters
16-
[
17-
(identifier) @local.definition
18-
(array_pattern
19-
(identifier) @local.definition)
20-
(object_pattern
21-
[
22-
(pair value: (identifier) @local.definition)
23-
(shorthand_property_identifier) @local.definition
24-
])
25-
])
15+
(pattern/identifier)@local.definition
2616

2717
(variable_declarator
2818
name: (identifier) @local.definition)

0 commit comments

Comments
 (0)