Skip to content

Commit 67b3e04

Browse files
committed
Support Spread and Rest operator
Fixes #291
1 parent 10f29f5 commit 67b3e04

7 files changed

+1109
-158
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 58 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -106,33 +106,40 @@ repository:
106106
- include: '#array-binding-pattern'
107107
- name: variable.other.readwrite.ts
108108
match: ([_$[:alpha:]][_$[:alnum:]]*)
109-
- name: variable.other.readwrite.ts
110-
match: ([_$[:alpha:]][_$[:alnum:]]*)
109+
- include: '#object-binding-pattern'
110+
- include: '#destructuring-variable-rest'
111111
- include: '#punctuation-comma'
112112

113113
array-binding-element:
114114
patterns:
115115
- include: '#comment'
116116
- include: '#object-binding-pattern'
117117
- include: '#array-binding-pattern'
118-
- name: variable.other.readwrite.ts
119-
match: ([_$[:alpha:]][_$[:alnum:]]*)
118+
- include: '#destructuring-variable-rest'
120119
- include: '#punctuation-comma'
121120

121+
destructuring-variable-rest:
122+
match: (?:(\.\.\.)\s*)?([_$[:alpha:]][_$[:alnum:]]*)
123+
captures:
124+
'1': { name: keyword.operator.rest.ts }
125+
'2': { name: variable.other.readwrite.ts }
126+
122127
object-binding-pattern:
123-
begin: \{
128+
begin: (?:(\.\.\.)\s*)?(\{)
124129
beginCaptures:
125-
'0': { name: punctuation.definition.binding-pattern.object.ts }
130+
'1': { name: keyword.operator.rest.ts }
131+
'2': { name: punctuation.definition.binding-pattern.object.ts }
126132
end: \}
127133
endCaptures:
128134
'0': { name: punctuation.definition.binding-pattern.object.ts }
129135
patterns:
130136
- include: '#object-binding-element'
131137

132138
array-binding-pattern:
133-
begin: \[
139+
begin: (?:(\.\.\.)\s*)?(\[)
134140
beginCaptures:
135-
'0': { name: punctuation.definition.binding-pattern.array.ts }
141+
'1': { name: keyword.operator.rest.ts }
142+
'2': { name: punctuation.definition.binding-pattern.array.ts }
136143
end: \]
137144
endCaptures:
138145
'0': { name: punctuation.definition.binding-pattern.array.ts }
@@ -171,8 +178,7 @@ repository:
171178
- include: '#ternary-expression'
172179
- include: '#new-expr'
173180
- include: '#object-literal'
174-
- include: '#expression-operator'
175-
- include: '#operators'
181+
- include: '#expression-operators'
176182
- include: '#support-objects'
177183
- include: '#function-call'
178184
- include: '#identifiers'
@@ -457,6 +463,12 @@ repository:
457463
- include: '#method-declaration'
458464
- include: '#indexer-declaration'
459465
- include: '#type-annotation'
466+
- begin: \.\.\.
467+
beginCaptures:
468+
'0': { name: keyword.operator.spread.ts }
469+
end: '(?=\}|;|,|$)|(?<=\})'
470+
patterns:
471+
- include: '#type'
460472
- include: '#punctuation-comma'
461473
- include: '#punctuation-semicolon'
462474

@@ -609,7 +621,7 @@ repository:
609621
match: '(?:\s*\b(public|private|protected)\b\s+)?(\.\.\.)?\s*(?<!=|:)([_$[:alpha:]][_$[:alnum:]]*)\s*(\??)'
610622
captures:
611623
'1': { name: storage.modifier.ts }
612-
'2': { name: keyword.operator.spread.ts }
624+
'2': { name: keyword.operator.rest.ts }
613625
'3': { name: variable.parameter.ts }
614626
'4': { name: keyword.operator.optional.ts }
615627

@@ -647,33 +659,40 @@ repository:
647659
- include: '#parameter-array-binding-pattern'
648660
- name: variable.parameter.ts
649661
match: ([_$[:alpha:]][_$[:alnum:]]*)
650-
- name: variable.parameter.ts
651-
match: ([_$[:alpha:]][_$[:alnum:]]*)
662+
- include: '#parameter-object-binding-pattern'
663+
- include: '#destructuring-parameter-rest'
652664
- include: '#punctuation-comma'
653665

654666
parameter-array-binding-element:
655667
patterns:
656668
- include: '#comment'
657669
- include: '#parameter-object-binding-pattern'
658670
- include: '#parameter-array-binding-pattern'
659-
- name: variable.parameter.ts
660-
match: ([_$[:alpha:]][_$[:alnum:]]*)
671+
- include: '#destructuring-parameter-rest'
661672
- include: '#punctuation-comma'
662673

674+
destructuring-parameter-rest:
675+
match: (?:(\.\.\.)\s*)?([_$[:alpha:]][_$[:alnum:]]*)
676+
captures:
677+
'1': { name: keyword.operator.rest.ts }
678+
'2': { name: variable.parameter.ts }
679+
663680
parameter-object-binding-pattern:
664-
begin: \{
681+
begin: (?:(\.\.\.)\s*)?(\{)
665682
beginCaptures:
666-
'0': { name: punctuation.definition.binding-pattern.object.ts }
683+
'1': { name: keyword.operator.rest.ts }
684+
'2': { name: punctuation.definition.binding-pattern.object.ts }
667685
end: \}
668686
endCaptures:
669687
'0': { name: punctuation.definition.binding-pattern.object.ts }
670688
patterns:
671689
- include: '#parameter-object-binding-element'
672690

673691
parameter-array-binding-pattern:
674-
begin: \[
692+
begin: (?:(\.\.\.)\s*)?(\[)
675693
beginCaptures:
676-
'0': { name: punctuation.definition.binding-pattern.array.ts }
694+
'1': { name: keyword.operator.rest.ts }
695+
'2': { name: punctuation.definition.binding-pattern.array.ts }
677696
end: \]
678697
endCaptures:
679698
'0': { name: punctuation.definition.binding-pattern.array.ts }
@@ -723,11 +742,10 @@ repository:
723742
- include: '#numeric-literal'
724743
- include: '#type-primitive'
725744
- include: '#type-builtin-literals'
726-
- include: '#typeof-operator'
727745
- include: '#type-parameters'
728746
- include: '#type-tuple'
729747
- include: '#type-object'
730-
- include: '#type-operator'
748+
- include: '#type-operators'
731749
- include: '#type-fn-type-parameters'
732750
- include: '#type-paren-or-function-parameters'
733751
- include: '#type-function-return-type'
@@ -814,9 +832,11 @@ repository:
814832
patterns:
815833
- include: '#function-parameters'
816834

817-
type-operator:
818-
name: keyword.operator.type.ts
819-
match: '[&|]'
835+
type-operators:
836+
patterns:
837+
- include: '#typeof-operator'
838+
- name: keyword.operator.type.ts
839+
match: '[&|]'
820840

821841
type-function-return-type:
822842
name: meta.type.function.return.ts
@@ -1335,13 +1355,20 @@ repository:
13351355
end: (?=,|\})
13361356
patterns:
13371357
- include: '#expression'
1358+
- name: meta.object.member.ts
1359+
begin: \.\.\.
1360+
beginCaptures:
1361+
'0': { name: keyword.operator.spread.ts }
1362+
end: (?=,|\})
1363+
patterns:
1364+
- include: '#expression'
13381365
- name: meta.object.member.ts
13391366
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\})
13401367
captures:
13411368
'1': { name: variable.other.readwrite.ts }
13421369
- include: '#punctuation-comma'
13431370

1344-
expression-operator:
1371+
expression-operators:
13451372
patterns:
13461373
- name: keyword.control.flow.ts
13471374
match: (?<!\.|\$)\b(await)\b(?!\$)
@@ -1364,13 +1391,8 @@ repository:
13641391
end: (?=$|[;,})\]])
13651392
patterns:
13661393
- include: '#type'
1367-
1368-
typeof-operator:
1369-
name: keyword.operator.typeof.ts
1370-
match: (?<!\.|\$)\btypeof\b(?!\$)
1371-
1372-
operators:
1373-
patterns:
1394+
- name: keyword.operator.spread.ts
1395+
match: \.\.\.
13741396
- name: keyword.operator.assignment.compound.ts
13751397
match: \*=|(?<!\()/=|%=|\+=|\-=
13761398
- name: keyword.operator.assignment.compound.bitwise.ts
@@ -1392,6 +1414,10 @@ repository:
13921414
- name: keyword.operator.arithmetic.ts
13931415
match: '%|\*|/|-|\+'
13941416

1417+
typeof-operator:
1418+
name: keyword.operator.typeof.ts
1419+
match: (?<!\.|\$)\btypeof\b(?!\$)
1420+
13951421
arrow-function:
13961422
patterns:
13971423
- name: meta.arrow.ts

0 commit comments

Comments
 (0)