Skip to content

Commit 1632051

Browse files
Type-only imports and exports (#792)
* Support type-only imports and exports * Fix copy/paste error * Update baseline * Handle import export type at local matching rules Co-authored-by: Sheetal Nandi <[email protected]>
1 parent b7ef094 commit 1632051

8 files changed

+354
-39
lines changed

Diff for: TypeScript.YAML-tmLanguage

+19-14
Original file line numberDiff line numberDiff line change
@@ -1066,29 +1066,31 @@ repository:
10661066
import-equals-declaration:
10671067
patterns:
10681068
- name: meta.import-equals.external.ts
1069-
begin: '{{startOfDeclaration}}\b(import)\s+({{identifier}})\s*(=)\s*(require)\s*(\()'
1069+
begin: '{{startOfDeclaration}}\b(import)(?:\s+(type))?\s+({{identifier}})\s*(=)\s*(require)\s*(\()'
10701070
beginCaptures:
10711071
'1': { name: keyword.control.export.ts }
10721072
'2': { name: storage.modifier.ts }
10731073
'3': { name: keyword.control.import.ts }
1074-
'4': { name: variable.other.readwrite.alias.ts }
1075-
'5': { name: keyword.operator.assignment.ts }
1076-
'6': { name: keyword.control.require.ts }
1077-
'7': { name: meta.brace.round.ts }
1074+
'4': { name: keyword.control.type.ts }
1075+
'5': { name: variable.other.readwrite.alias.ts }
1076+
'6': { name: keyword.operator.assignment.ts }
1077+
'7': { name: keyword.control.require.ts }
1078+
'8': { name: meta.brace.round.ts }
10781079
end: \)
10791080
endCaptures:
10801081
'0': { name: meta.brace.round.ts }
10811082
patterns:
10821083
- include: '#comment'
10831084
- include: '#string'
10841085
- name: meta.import-equals.internal.ts
1085-
begin: '{{startOfDeclaration}}\b(import)\s+({{identifier}})\s*(=)\s*(?!require\b)'
1086+
begin: '{{startOfDeclaration}}\b(import)(?:\s+(type))?\s+({{identifier}})\s*(=)\s*(?!require\b)'
10861087
beginCaptures:
10871088
'1': { name: keyword.control.export.ts }
10881089
'2': { name: storage.modifier.ts }
10891090
'3': { name: keyword.control.import.ts }
1090-
'4': { name: variable.other.readwrite.alias.ts }
1091-
'5': { name: keyword.operator.assignment.ts }
1091+
'4': { name: keyword.control.type.ts }
1092+
'5': { name: variable.other.readwrite.alias.ts }
1093+
'6': { name: keyword.operator.assignment.ts }
10921094
end: (?=;|$|^)
10931095
patterns:
10941096
- include: '#single-line-comment-consuming-line-ending'
@@ -1103,11 +1105,12 @@ repository:
11031105

11041106
import-declaration:
11051107
name: meta.import.ts
1106-
begin: '{{startOfDeclaration}}\b(import)(?!\s*[:\(]){{endOfIdentifier}}'
1108+
begin: '{{startOfDeclaration}}\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(]){{endOfIdentifier}}'
11071109
beginCaptures:
11081110
'1': { name: keyword.control.export.ts }
11091111
'2': { name: storage.modifier.ts }
11101112
'3': { name: keyword.control.import.ts }
1113+
'4': { name: keyword.control.type.ts }
11111114
end: (?<!{{lookBehindImport}})(?=;|$|^)
11121115
patterns:
11131116
- include: '#single-line-comment-consuming-line-ending'
@@ -1130,19 +1133,21 @@ repository:
11301133
'3': { name: storage.type.namespace.ts }
11311134
'4': { name: entity.name.type.module.ts }
11321135
- name: meta.export.default.ts
1133-
begin: '{{startOfIdentifier}}(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
1136+
begin: '{{startOfIdentifier}}(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))'
11341137
beginCaptures:
11351138
'1': { name: keyword.control.export.ts }
1136-
'2': { name: keyword.operator.assignment.ts }
1137-
'3': { name: keyword.control.default.ts }
1139+
'2': { name: keyword.control.type.ts }
1140+
'3': { name: keyword.operator.assignment.ts }
1141+
'4': { name: keyword.control.default.ts }
11381142
end: (?=$|{{endOfStatement}})
11391143
patterns:
11401144
- include: '#interface-declaration'
11411145
- include: '#expression'
11421146
- name: meta.export.ts
1143-
begin: '{{startOfIdentifier}}(export)\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))'
1147+
begin: '{{startOfIdentifier}}(export)(?:\s+(type))?\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))'
11441148
beginCaptures:
1145-
'0': { name: keyword.control.export.ts }
1149+
'1': { name: keyword.control.export.ts }
1150+
'2': { name: keyword.control.type.ts }
11461151
end: (?=$|{{endOfStatement}})
11471152
patterns:
11481153
- include: '#import-export-declaration'

Diff for: TypeScript.tmLanguage

+36-11
Original file line numberDiff line numberDiff line change
@@ -3382,7 +3382,7 @@
33823382
<key>name</key>
33833383
<string>meta.import-equals.external.ts</string>
33843384
<key>begin</key>
3385-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()</string>
3385+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()</string>
33863386
<key>beginCaptures</key>
33873387
<dict>
33883388
<key>1</key>
@@ -3403,19 +3403,24 @@
34033403
<key>4</key>
34043404
<dict>
34053405
<key>name</key>
3406-
<string>variable.other.readwrite.alias.ts</string>
3406+
<string>keyword.control.type.ts</string>
34073407
</dict>
34083408
<key>5</key>
34093409
<dict>
34103410
<key>name</key>
3411-
<string>keyword.operator.assignment.ts</string>
3411+
<string>variable.other.readwrite.alias.ts</string>
34123412
</dict>
34133413
<key>6</key>
34143414
<dict>
34153415
<key>name</key>
3416-
<string>keyword.control.require.ts</string>
3416+
<string>keyword.operator.assignment.ts</string>
34173417
</dict>
34183418
<key>7</key>
3419+
<dict>
3420+
<key>name</key>
3421+
<string>keyword.control.require.ts</string>
3422+
</dict>
3423+
<key>8</key>
34193424
<dict>
34203425
<key>name</key>
34213426
<string>meta.brace.round.ts</string>
@@ -3447,7 +3452,7 @@
34473452
<key>name</key>
34483453
<string>meta.import-equals.internal.ts</string>
34493454
<key>begin</key>
3450-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)</string>
3455+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)</string>
34513456
<key>beginCaptures</key>
34523457
<dict>
34533458
<key>1</key>
@@ -3468,9 +3473,14 @@
34683473
<key>4</key>
34693474
<dict>
34703475
<key>name</key>
3471-
<string>variable.other.readwrite.alias.ts</string>
3476+
<string>keyword.control.type.ts</string>
34723477
</dict>
34733478
<key>5</key>
3479+
<dict>
3480+
<key>name</key>
3481+
<string>variable.other.readwrite.alias.ts</string>
3482+
</dict>
3483+
<key>6</key>
34743484
<dict>
34753485
<key>name</key>
34763486
<string>keyword.operator.assignment.ts</string>
@@ -3525,7 +3535,7 @@
35253535
<key>name</key>
35263536
<string>meta.import.ts</string>
35273537
<key>begin</key>
3528-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
3538+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
35293539
<key>beginCaptures</key>
35303540
<dict>
35313541
<key>1</key>
@@ -3543,6 +3553,11 @@
35433553
<key>name</key>
35443554
<string>keyword.control.import.ts</string>
35453555
</dict>
3556+
<key>4</key>
3557+
<dict>
3558+
<key>name</key>
3559+
<string>keyword.control.type.ts</string>
3560+
</dict>
35463561
</dict>
35473562
<key>end</key>
35483563
<string>(?&lt;!^import|[^\._$[:alnum:]]import)(?=;|$|^)</string>
@@ -3622,7 +3637,7 @@
36223637
<key>name</key>
36233638
<string>meta.export.default.ts</string>
36243639
<key>begin</key>
3625-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))</string>
3640+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))</string>
36263641
<key>beginCaptures</key>
36273642
<dict>
36283643
<key>1</key>
@@ -3633,9 +3648,14 @@
36333648
<key>2</key>
36343649
<dict>
36353650
<key>name</key>
3636-
<string>keyword.operator.assignment.ts</string>
3651+
<string>keyword.control.type.ts</string>
36373652
</dict>
36383653
<key>3</key>
3654+
<dict>
3655+
<key>name</key>
3656+
<string>keyword.operator.assignment.ts</string>
3657+
</dict>
3658+
<key>4</key>
36393659
<dict>
36403660
<key>name</key>
36413661
<string>keyword.control.default.ts</string>
@@ -3659,14 +3679,19 @@
36593679
<key>name</key>
36603680
<string>meta.export.ts</string>
36613681
<key>begin</key>
3662-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))</string>
3682+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:\s+(type))?\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))</string>
36633683
<key>beginCaptures</key>
36643684
<dict>
3665-
<key>0</key>
3685+
<key>1</key>
36663686
<dict>
36673687
<key>name</key>
36683688
<string>keyword.control.export.ts</string>
36693689
</dict>
3690+
<key>2</key>
3691+
<dict>
3692+
<key>name</key>
3693+
<string>keyword.control.type.ts</string>
3694+
</dict>
36703695
</dict>
36713696
<key>end</key>
36723697
<string>(?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))</string>

Diff for: TypeScriptReact.tmLanguage

+36-11
Original file line numberDiff line numberDiff line change
@@ -3404,7 +3404,7 @@
34043404
<key>name</key>
34053405
<string>meta.import-equals.external.tsx</string>
34063406
<key>begin</key>
3407-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()</string>
3407+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\()</string>
34083408
<key>beginCaptures</key>
34093409
<dict>
34103410
<key>1</key>
@@ -3425,19 +3425,24 @@
34253425
<key>4</key>
34263426
<dict>
34273427
<key>name</key>
3428-
<string>variable.other.readwrite.alias.tsx</string>
3428+
<string>keyword.control.type.tsx</string>
34293429
</dict>
34303430
<key>5</key>
34313431
<dict>
34323432
<key>name</key>
3433-
<string>keyword.operator.assignment.tsx</string>
3433+
<string>variable.other.readwrite.alias.tsx</string>
34343434
</dict>
34353435
<key>6</key>
34363436
<dict>
34373437
<key>name</key>
3438-
<string>keyword.control.require.tsx</string>
3438+
<string>keyword.operator.assignment.tsx</string>
34393439
</dict>
34403440
<key>7</key>
3441+
<dict>
3442+
<key>name</key>
3443+
<string>keyword.control.require.tsx</string>
3444+
</dict>
3445+
<key>8</key>
34413446
<dict>
34423447
<key>name</key>
34433448
<string>meta.brace.round.tsx</string>
@@ -3469,7 +3474,7 @@
34693474
<key>name</key>
34703475
<string>meta.import-equals.internal.tsx</string>
34713476
<key>begin</key>
3472-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)</string>
3477+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b)</string>
34733478
<key>beginCaptures</key>
34743479
<dict>
34753480
<key>1</key>
@@ -3490,9 +3495,14 @@
34903495
<key>4</key>
34913496
<dict>
34923497
<key>name</key>
3493-
<string>variable.other.readwrite.alias.tsx</string>
3498+
<string>keyword.control.type.tsx</string>
34943499
</dict>
34953500
<key>5</key>
3501+
<dict>
3502+
<key>name</key>
3503+
<string>variable.other.readwrite.alias.tsx</string>
3504+
</dict>
3505+
<key>6</key>
34963506
<dict>
34973507
<key>name</key>
34983508
<string>keyword.operator.assignment.tsx</string>
@@ -3547,7 +3557,7 @@
35473557
<key>name</key>
35483558
<string>meta.import.tsx</string>
35493559
<key>begin</key>
3550-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
3560+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
35513561
<key>beginCaptures</key>
35523562
<dict>
35533563
<key>1</key>
@@ -3565,6 +3575,11 @@
35653575
<key>name</key>
35663576
<string>keyword.control.import.tsx</string>
35673577
</dict>
3578+
<key>4</key>
3579+
<dict>
3580+
<key>name</key>
3581+
<string>keyword.control.type.tsx</string>
3582+
</dict>
35683583
</dict>
35693584
<key>end</key>
35703585
<string>(?&lt;!^import|[^\._$[:alnum:]]import)(?=;|$|^)</string>
@@ -3644,7 +3659,7 @@
36443659
<key>name</key>
36453660
<string>meta.export.default.tsx</string>
36463661
<key>begin</key>
3647-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))</string>
3662+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+)))</string>
36483663
<key>beginCaptures</key>
36493664
<dict>
36503665
<key>1</key>
@@ -3655,9 +3670,14 @@
36553670
<key>2</key>
36563671
<dict>
36573672
<key>name</key>
3658-
<string>keyword.operator.assignment.tsx</string>
3673+
<string>keyword.control.type.tsx</string>
36593674
</dict>
36603675
<key>3</key>
3676+
<dict>
3677+
<key>name</key>
3678+
<string>keyword.operator.assignment.tsx</string>
3679+
</dict>
3680+
<key>4</key>
36613681
<dict>
36623682
<key>name</key>
36633683
<string>keyword.control.default.tsx</string>
@@ -3681,14 +3701,19 @@
36813701
<key>name</key>
36823702
<string>meta.export.tsx</string>
36833703
<key>begin</key>
3684-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))</string>
3704+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(export)(?:\s+(type))?\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)))</string>
36853705
<key>beginCaptures</key>
36863706
<dict>
3687-
<key>0</key>
3707+
<key>1</key>
36883708
<dict>
36893709
<key>name</key>
36903710
<string>keyword.control.export.tsx</string>
36913711
</dict>
3712+
<key>2</key>
3713+
<dict>
3714+
<key>name</key>
3715+
<string>keyword.control.type.tsx</string>
3716+
</dict>
36923717
</dict>
36933718
<key>end</key>
36943719
<string>(?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))</string>

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"pretest": "npm run build",
1212
"test": "mocha --full-trace tests/test.js --reporter mocha-multi-reporters",
1313
"diff": "cross-env-shell $DIFF tests/baselines tests/generated",
14-
"accept": "copyfiles \"tests/generated/*\" tests/baselines"
14+
"accept": "copyfiles -u 2 \"tests/generated/*\" tests/baselines"
1515
},
1616
"dependencies": {
1717
"@types/chai": "latest",

0 commit comments

Comments
 (0)