diff --git a/TypeScript.YAML-tmLanguage b/TypeScript.YAML-tmLanguage
index 9dbd3037..8c6ea552 100644
--- a/TypeScript.YAML-tmLanguage
+++ b/TypeScript.YAML-tmLanguage
@@ -1205,21 +1205,25 @@ repository:
patterns:
- include: '#comment'
#(default|*|name) as alias
- - match: '{{startOfIdentifier}}(?:(\bdefault)|(\*)|(\b{{identifier}}))\s+(as)\s+(?:(default{{endOfIdentifier}})|({{identifier}}))'
- captures:
- '1': { name: keyword.control.default.ts }
- '2': { name: constant.language.import-export-all.ts }
- '3': { name: variable.other.readwrite.ts }
- '4': { name: keyword.control.as.ts }
- '5': { name: keyword.control.default.ts }
- '6': { name: variable.other.readwrite.alias.ts }
+ - match: '{{startOfIdentifier}}(?:(?:(\btype)\s+)?(?:(\bdefault)|(\*)|(\b{{identifier}})))\s+(as)\s+(?:(default{{endOfIdentifier}})|({{identifier}}))'
+ captures:
+ '1': { name: keyword.control.type.ts }
+ '2': { name: keyword.control.default.ts }
+ '3': { name: constant.language.import-export-all.ts }
+ '4': { name: variable.other.readwrite.ts }
+ '5': { name: keyword.control.as.ts }
+ '6': { name: keyword.control.default.ts }
+ '7': { name: variable.other.readwrite.alias.ts }
- include: '#punctuation-comma'
- name: constant.language.import-export-all.ts
match: \*
- name: keyword.control.default.ts
match: \b(default)\b
- - name: variable.other.readwrite.alias.ts
- match: ({{identifier}})
+ - match: '(?:(\btype)\s+)?({{identifier}})'
+ captures:
+ '1': { name: keyword.control.type.ts }
+ '2': { name: variable.other.readwrite.alias.ts }
+
#control statements and loops
switch-statement:
diff --git a/TypeScript.tmLanguage b/TypeScript.tmLanguage
index 705501c0..bec7dfda 100644
--- a/TypeScript.tmLanguage
+++ b/TypeScript.tmLanguage
@@ -3852,35 +3852,40 @@
match
- (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))
+ (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(?:(\btype)\s+)?(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*)))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))
captures
1
name
- keyword.control.default.ts
+ keyword.control.type.ts
2
name
- constant.language.import-export-all.ts
+ keyword.control.default.ts
3
name
- variable.other.readwrite.ts
+ constant.language.import-export-all.ts
4
name
- keyword.control.as.ts
+ variable.other.readwrite.ts
5
name
- keyword.control.default.ts
+ keyword.control.as.ts
6
+
+ name
+ keyword.control.default.ts
+
+ 7
name
variable.other.readwrite.alias.ts
@@ -3904,10 +3909,21 @@
\b(default)\b
- name
- variable.other.readwrite.alias.ts
match
- ([_$[:alpha:]][_$[:alnum:]]*)
+ (?:(\btype)\s+)?([_$[:alpha:]][_$[:alnum:]]*)
+ captures
+
+ 1
+
+ name
+ keyword.control.type.ts
+
+ 2
+
+ name
+ variable.other.readwrite.alias.ts
+
+
diff --git a/TypeScriptReact.tmLanguage b/TypeScriptReact.tmLanguage
index 6e9369a7..77a345e7 100644
--- a/TypeScriptReact.tmLanguage
+++ b/TypeScriptReact.tmLanguage
@@ -3874,35 +3874,40 @@
match
- (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))
+ (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(?:(\btype)\s+)?(?:(\bdefault)|(\*)|(\b[_$[:alpha:]][_$[:alnum:]]*)))\s+(as)\s+(?:(default(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)))|([_$[:alpha:]][_$[:alnum:]]*))
captures
1
name
- keyword.control.default.tsx
+ keyword.control.type.tsx
2
name
- constant.language.import-export-all.tsx
+ keyword.control.default.tsx
3
name
- variable.other.readwrite.tsx
+ constant.language.import-export-all.tsx
4
name
- keyword.control.as.tsx
+ variable.other.readwrite.tsx
5
name
- keyword.control.default.tsx
+ keyword.control.as.tsx
6
+
+ name
+ keyword.control.default.tsx
+
+ 7
name
variable.other.readwrite.alias.tsx
@@ -3926,10 +3931,21 @@
\b(default)\b
- name
- variable.other.readwrite.alias.tsx
match
- ([_$[:alpha:]][_$[:alnum:]]*)
+ (?:(\btype)\s+)?([_$[:alpha:]][_$[:alnum:]]*)
+ captures
+
+ 1
+
+ name
+ keyword.control.type.tsx
+
+ 2
+
+ name
+ variable.other.readwrite.alias.tsx
+
+
diff --git a/tests/baselines/importTypeOnly.baseline.txt b/tests/baselines/importTypeOnly.baseline.txt
index abafaa73..9d863582 100644
--- a/tests/baselines/importTypeOnly.baseline.txt
+++ b/tests/baselines/importTypeOnly.baseline.txt
@@ -6,6 +6,14 @@ import type * as types from "mod";
import type from "mod";
import type = require("mod");
import type T = require("mod");
+import { type X } from "mod";
+import { X, type Y} from "mod";
+import type { type X } from "mod"; // grammar error
+import { type as foo } from "mod"; // not type-only
+import { type type } from "mod";
+import { type as as as } from "mod";
+import { type type as as } from "mod";
+import { type type as type } from "mod";
-----------------------------------
@@ -114,11 +122,11 @@ Grammar: TypeScript.tmLanguage
^
source.ts meta.import.ts
^^^^
- source.ts meta.import.ts variable.other.readwrite.alias.ts
+ source.ts meta.import.ts keyword.control.type.ts
^
source.ts meta.import.ts
^^^^
- source.ts meta.import.ts keyword.control.from.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
^
source.ts meta.import.ts
^
@@ -127,66 +135,366 @@ Grammar: TypeScript.tmLanguage
source.ts meta.import.ts string.quoted.double.ts
^
source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
- ^
- source.ts punctuation.terminator.statement.ts
+ ^^
+ source.ts meta.import.ts
>import type = require("mod");
^^^^^^
- source.ts meta.import-equals.external.ts keyword.control.import.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
^
- source.ts meta.import-equals.external.ts
+ source.ts meta.import.ts
^^^^
- source.ts meta.import-equals.external.ts variable.other.readwrite.alias.ts
- ^
- source.ts meta.import-equals.external.ts
- ^
- source.ts meta.import-equals.external.ts keyword.operator.assignment.ts
- ^
- source.ts meta.import-equals.external.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
+ ^^^
+ source.ts meta.import.ts
^^^^^^^
- source.ts meta.import-equals.external.ts keyword.control.require.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
^
- source.ts meta.import-equals.external.ts meta.brace.round.ts
+ source.ts meta.import.ts
^
- source.ts meta.import-equals.external.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
^^^
- source.ts meta.import-equals.external.ts string.quoted.double.ts
+ source.ts meta.import.ts string.quoted.double.ts
^
- source.ts meta.import-equals.external.ts string.quoted.double.ts punctuation.definition.string.end.ts
- ^
- source.ts meta.import-equals.external.ts meta.brace.round.ts
- ^
- source.ts punctuation.terminator.statement.ts
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^^^
+ source.ts meta.import.ts
>import type T = require("mod");
^^^^^^
- source.ts meta.import-equals.external.ts keyword.control.import.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
^
- source.ts meta.import-equals.external.ts
+ source.ts meta.import.ts
^^^^
- source.ts meta.import-equals.external.ts keyword.control.type.ts
+ source.ts meta.import.ts keyword.control.type.ts
^
- source.ts meta.import-equals.external.ts
+ source.ts meta.import.ts
^
- source.ts meta.import-equals.external.ts variable.other.readwrite.alias.ts
- ^
- source.ts meta.import-equals.external.ts
- ^
- source.ts meta.import-equals.external.ts keyword.operator.assignment.ts
- ^
- source.ts meta.import-equals.external.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
+ ^^^
+ source.ts meta.import.ts
^^^^^^^
- source.ts meta.import-equals.external.ts keyword.control.require.ts
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
^
- source.ts meta.import-equals.external.ts meta.brace.round.ts
+ source.ts meta.import.ts
^
- source.ts meta.import-equals.external.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
^^^
- source.ts meta.import-equals.external.ts string.quoted.double.ts
+ source.ts meta.import.ts string.quoted.double.ts
^
- source.ts meta.import-equals.external.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^^^
+ source.ts meta.import.ts
+>import { type X } from "mod";
+ ^^^^^^
+ source.ts meta.import.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+>import { X, type Y} from "mod";
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.separator.comma.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
^
- source.ts meta.import-equals.external.ts meta.brace.round.ts
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
^
source.ts punctuation.terminator.statement.ts
+>import type { type X } from "mod"; // grammar error
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+ ^
+ source.ts
+ ^^
+ source.ts comment.line.double-slash.ts punctuation.definition.comment.ts
+ ^^^^^^^^^^^^^^
+ source.ts comment.line.double-slash.ts
+>import { type as foo } from "mod"; // not type-only
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts keyword.control.as.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+ ^
+ source.ts
+ ^^
+ source.ts comment.line.double-slash.ts punctuation.definition.comment.ts
+ ^^^^^^^^^^^^^^
+ source.ts comment.line.double-slash.ts
+>import { type type } from "mod";
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+>import { type as as as } from "mod";
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts keyword.control.as.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+>import { type type as as } from "mod";
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts keyword.control.as.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
+>import { type type as type } from "mod";
+ ^^^^^^
+ source.ts meta.import.ts keyword.control.import.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts keyword.control.type.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^
+ source.ts meta.import.ts meta.block.ts keyword.control.as.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^^^^
+ source.ts meta.import.ts meta.block.ts variable.other.readwrite.alias.ts
+ ^
+ source.ts meta.import.ts meta.block.ts
+ ^
+ source.ts meta.import.ts meta.block.ts punctuation.definition.block.ts
+ ^
+ source.ts meta.import.ts
+ ^^^^
+ source.ts meta.import.ts keyword.control.from.ts
+ ^
+ source.ts meta.import.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.begin.ts
+ ^^^
+ source.ts meta.import.ts string.quoted.double.ts
+ ^
+ source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts
+ ^
+ source.ts punctuation.terminator.statement.ts
>
^
source.ts
\ No newline at end of file
diff --git a/tests/cases/importTypeOnly.ts b/tests/cases/importTypeOnly.ts
index 9ae6b1d8..070ed705 100644
--- a/tests/cases/importTypeOnly.ts
+++ b/tests/cases/importTypeOnly.ts
@@ -4,3 +4,11 @@ import type * as types from "mod";
import type from "mod";
import type = require("mod");
import type T = require("mod");
+import { type X } from "mod";
+import { X, type Y} from "mod";
+import type { type X } from "mod"; // grammar error
+import { type as foo } from "mod"; // not type-only
+import { type type } from "mod";
+import { type as as as } from "mod";
+import { type type as as } from "mod";
+import { type type as type } from "mod";