Skip to content

Commit 56e921e

Browse files
authored
Merge pull request #295 from Microsoft/restAndSpreadOperator
Rest and spread operator support
2 parents 3376784 + 7ce774f commit 56e921e

14 files changed

+1157
-231
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 63 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -106,35 +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:]]*)
111-
- name: meta.delimiter.object.comma.ts
112-
match: ','
109+
- include: '#object-binding-pattern'
110+
- include: '#destructuring-variable-rest'
111+
- include: '#punctuation-comma'
113112

114113
array-binding-element:
115114
patterns:
116115
- include: '#comment'
117116
- include: '#object-binding-pattern'
118117
- include: '#array-binding-pattern'
119-
- name: variable.other.readwrite.ts
120-
match: ([_$[:alpha:]][_$[:alnum:]]*)
121-
- name: meta.delimiter.object.comma.ts
122-
match: ','
118+
- include: '#destructuring-variable-rest'
119+
- include: '#punctuation-comma'
120+
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 }
123126

124127
object-binding-pattern:
125-
begin: \{
128+
begin: (?:(\.\.\.)\s*)?(\{)
126129
beginCaptures:
127-
'0': { name: punctuation.definition.binding-pattern.object.ts }
130+
'1': { name: keyword.operator.rest.ts }
131+
'2': { name: punctuation.definition.binding-pattern.object.ts }
128132
end: \}
129133
endCaptures:
130134
'0': { name: punctuation.definition.binding-pattern.object.ts }
131135
patterns:
132136
- include: '#object-binding-element'
133137

134138
array-binding-pattern:
135-
begin: \[
139+
begin: (?:(\.\.\.)\s*)?(\[)
136140
beginCaptures:
137-
'0': { name: punctuation.definition.binding-pattern.array.ts }
141+
'1': { name: keyword.operator.rest.ts }
142+
'2': { name: punctuation.definition.binding-pattern.array.ts }
138143
end: \]
139144
endCaptures:
140145
'0': { name: punctuation.definition.binding-pattern.array.ts }
@@ -173,8 +178,7 @@ repository:
173178
- include: '#ternary-expression'
174179
- include: '#new-expr'
175180
- include: '#object-literal'
176-
- include: '#expression-operator'
177-
- include: '#operators'
181+
- include: '#expression-operators'
178182
- include: '#support-objects'
179183
- include: '#function-call'
180184
- include: '#identifiers'
@@ -371,8 +375,7 @@ repository:
371375
'4': { name: keyword.control.as.ts }
372376
'5': { name: invalid.illegal.ts }
373377
'6': { name: variable.other.readwrite.alias.ts }
374-
- name: meta.delimiter.object.comma.ts
375-
match: ','
378+
- include: '#punctuation-comma'
376379
- name: constant.language.import-export-all.ts
377380
match: \*
378381
- name: keyword.control.default.ts
@@ -460,6 +463,12 @@ repository:
460463
- include: '#method-declaration'
461464
- include: '#indexer-declaration'
462465
- include: '#type-annotation'
466+
- begin: \.\.\.
467+
beginCaptures:
468+
'0': { name: keyword.operator.spread.ts }
469+
end: '(?=\}|;|,|$)|(?<=\})'
470+
patterns:
471+
- include: '#type'
463472
- include: '#punctuation-comma'
464473
- include: '#punctuation-semicolon'
465474

@@ -612,7 +621,7 @@ repository:
612621
match: '(?:\s*\b(public|private|protected)\b\s+)?(\.\.\.)?\s*(?<!=|:)([_$[:alpha:]][_$[:alnum:]]*)\s*(\??)'
613622
captures:
614623
'1': { name: storage.modifier.ts }
615-
'2': { name: keyword.operator.spread.ts }
624+
'2': { name: keyword.operator.rest.ts }
616625
'3': { name: variable.parameter.ts }
617626
'4': { name: keyword.operator.optional.ts }
618627

@@ -650,35 +659,40 @@ repository:
650659
- include: '#parameter-array-binding-pattern'
651660
- name: variable.parameter.ts
652661
match: ([_$[:alpha:]][_$[:alnum:]]*)
653-
- name: variable.parameter.ts
654-
match: ([_$[:alpha:]][_$[:alnum:]]*)
655-
- name: meta.delimiter.object.comma.ts
656-
match: ','
662+
- include: '#parameter-object-binding-pattern'
663+
- include: '#destructuring-parameter-rest'
664+
- include: '#punctuation-comma'
657665

658666
parameter-array-binding-element:
659667
patterns:
660668
- include: '#comment'
661669
- include: '#parameter-object-binding-pattern'
662670
- include: '#parameter-array-binding-pattern'
663-
- name: variable.parameter.ts
664-
match: ([_$[:alpha:]][_$[:alnum:]]*)
665-
- name: meta.delimiter.object.comma.ts
666-
match: ','
671+
- include: '#destructuring-parameter-rest'
672+
- include: '#punctuation-comma'
673+
674+
destructuring-parameter-rest:
675+
match: (?:(\.\.\.)\s*)?([_$[:alpha:]][_$[:alnum:]]*)
676+
captures:
677+
'1': { name: keyword.operator.rest.ts }
678+
'2': { name: variable.parameter.ts }
667679

668680
parameter-object-binding-pattern:
669-
begin: \{
681+
begin: (?:(\.\.\.)\s*)?(\{)
670682
beginCaptures:
671-
'0': { name: punctuation.definition.binding-pattern.object.ts }
683+
'1': { name: keyword.operator.rest.ts }
684+
'2': { name: punctuation.definition.binding-pattern.object.ts }
672685
end: \}
673686
endCaptures:
674687
'0': { name: punctuation.definition.binding-pattern.object.ts }
675688
patterns:
676689
- include: '#parameter-object-binding-element'
677690

678691
parameter-array-binding-pattern:
679-
begin: \[
692+
begin: (?:(\.\.\.)\s*)?(\[)
680693
beginCaptures:
681-
'0': { name: punctuation.definition.binding-pattern.array.ts }
694+
'1': { name: keyword.operator.rest.ts }
695+
'2': { name: punctuation.definition.binding-pattern.array.ts }
682696
end: \]
683697
endCaptures:
684698
'0': { name: punctuation.definition.binding-pattern.array.ts }
@@ -728,11 +742,10 @@ repository:
728742
- include: '#numeric-literal'
729743
- include: '#type-primitive'
730744
- include: '#type-builtin-literals'
731-
- include: '#typeof-operator'
732745
- include: '#type-parameters'
733746
- include: '#type-tuple'
734747
- include: '#type-object'
735-
- include: '#type-operator'
748+
- include: '#type-operators'
736749
- include: '#type-fn-type-parameters'
737750
- include: '#type-paren-or-function-parameters'
738751
- include: '#type-function-return-type'
@@ -819,9 +832,11 @@ repository:
819832
patterns:
820833
- include: '#function-parameters'
821834

822-
type-operator:
823-
name: keyword.operator.type.ts
824-
match: '[&|]'
835+
type-operators:
836+
patterns:
837+
- include: '#typeof-operator'
838+
- name: keyword.operator.type.ts
839+
match: '[&|]'
825840

826841
type-function-return-type:
827842
name: meta.type.function.return.ts
@@ -1342,13 +1357,20 @@ repository:
13421357
end: (?=,|\})
13431358
patterns:
13441359
- include: '#expression'
1360+
- name: meta.object.member.ts
1361+
begin: \.\.\.
1362+
beginCaptures:
1363+
'0': { name: keyword.operator.spread.ts }
1364+
end: (?=,|\})
1365+
patterns:
1366+
- include: '#expression'
13451367
- name: meta.object.member.ts
13461368
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?=,|\}|$)
13471369
captures:
13481370
'1': { name: variable.other.readwrite.ts }
13491371
- include: '#punctuation-comma'
13501372

1351-
expression-operator:
1373+
expression-operators:
13521374
patterns:
13531375
- name: keyword.control.flow.ts
13541376
match: (?<!\.|\$)\b(await)\b(?!\$)
@@ -1371,13 +1393,8 @@ repository:
13711393
end: (?=$|[;,})\]])
13721394
patterns:
13731395
- include: '#type'
1374-
1375-
typeof-operator:
1376-
name: keyword.operator.typeof.ts
1377-
match: (?<!\.|\$)\btypeof\b(?!\$)
1378-
1379-
operators:
1380-
patterns:
1396+
- name: keyword.operator.spread.ts
1397+
match: \.\.\.
13811398
- name: keyword.operator.assignment.compound.ts
13821399
match: \*=|(?<!\()/=|%=|\+=|\-=
13831400
- name: keyword.operator.assignment.compound.bitwise.ts
@@ -1399,6 +1416,10 @@ repository:
13991416
- name: keyword.operator.arithmetic.ts
14001417
match: '%|\*|/|-|\+'
14011418

1419+
typeof-operator:
1420+
name: keyword.operator.typeof.ts
1421+
match: (?<!\.|\$)\btypeof\b(?!\$)
1422+
14021423
arrow-function:
14031424
patterns:
14041425
- name: meta.arrow.ts

0 commit comments

Comments
 (0)