From 5f964815a984070f2efcd18304f8cc722e4cfbcd Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 26 Nov 2019 15:57:11 -0800 Subject: [PATCH 1/4] Support type-only imports and exports --- TypeScript.YAML-tmLanguage | 6 +- TypeScript.tmLanguage | 14 +- TypeScriptReact.tmLanguage | 14 +- package.json | 2 +- .../baselines/exportDeclarations.baseline.txt | 62 +++++- tests/baselines/importTypeOnly.baseline.txt | 186 ++++++++++++++++++ tests/cases/exportDeclarations.ts | 4 +- tests/cases/importTypeOnly.ts | 6 + 8 files changed, 288 insertions(+), 6 deletions(-) create mode 100644 tests/baselines/importTypeOnly.baseline.txt create mode 100644 tests/cases/importTypeOnly.ts diff --git a/TypeScript.YAML-tmLanguage b/TypeScript.YAML-tmLanguage index 2b305a9a..bf97e337 100644 --- a/TypeScript.YAML-tmLanguage +++ b/TypeScript.YAML-tmLanguage @@ -51,6 +51,7 @@ variables: lookBehindTypeof: '^typeof|{{nonPropertyLookBehind}}typeof' lookBehindCase: '^case|{{nonPropertyLookBehind}}case' lookBehindImport: '^import|{{nonPropertyLookBehind}}import' + lookBehindExport: '^export|{{nonPropertyLookBehind}}export' matchingParenthesis: (\(([^\(\)]|(\([^\(\)]*\)))*\)) matchingBraces: (\{([^\{\}]|(\{[^\{\}]*\}))*\}) matchingBrackets: (\[([^\[\]]|(\[[^\[\]]*\]))*\]) @@ -1140,7 +1141,7 @@ repository: - include: '#interface-declaration' - include: '#expression' - name: meta.export.ts - begin: '{{startOfIdentifier}}(export)\b(?!(\$)|(\s*:))((?=\s*[\{*])|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))' + begin: '{{startOfIdentifier}}(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))' beginCaptures: '0': { name: keyword.control.export.ts } end: (?=$|{{endOfStatement}}) @@ -1155,6 +1156,9 @@ repository: - name: keyword.control.from.ts match: \bfrom\b - include: '#import-export-clause' + - match: '(?<={{lookBehindImport}}|{{lookBehindExport}})\s+(type)(?!\s*from)' + captures: + '1': { name: keyword.control.type.ts } import-export-block: name: meta.block.ts diff --git a/TypeScript.tmLanguage b/TypeScript.tmLanguage index 4f205c41..f575711c 100644 --- a/TypeScript.tmLanguage +++ b/TypeScript.tmLanguage @@ -3659,7 +3659,7 @@ name meta.export.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(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))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) beginCaptures 0 @@ -3706,6 +3706,18 @@ include #import-export-clause + + match + (?<=^import|[^\._$[:alnum:]]import|^export|[^\._$[:alnum:]]export)\s+(type)(?!\s*from) + captures + + 1 + + name + keyword.control.type.ts + + + import-export-block diff --git a/TypeScriptReact.tmLanguage b/TypeScriptReact.tmLanguage index 3571c30a..1ed10c64 100644 --- a/TypeScriptReact.tmLanguage +++ b/TypeScriptReact.tmLanguage @@ -3681,7 +3681,7 @@ name meta.export.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(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))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) beginCaptures 0 @@ -3728,6 +3728,18 @@ include #import-export-clause + + match + (?<=^import|[^\._$[:alnum:]]import|^export|[^\._$[:alnum:]]export)\s+(type)(?!\s*from) + captures + + 1 + + name + keyword.control.type.tsx + + + import-export-block diff --git a/package.json b/package.json index 6985e846..f2721413 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "pretest": "npm run build", "test": "mocha --full-trace tests/test.js --reporter mocha-multi-reporters", "diff": "cross-env-shell $DIFF tests/baselines tests/generated", - "accept": "copyfiles \"tests/generated/*\" tests/baselines" + "accept": "copyfiles -u 2 \"tests/generated/*\" tests/baselines" }, "dependencies": { "@types/chai": "latest", diff --git a/tests/baselines/exportDeclarations.baseline.txt b/tests/baselines/exportDeclarations.baseline.txt index 589356f2..a6be2bf2 100644 --- a/tests/baselines/exportDeclarations.baseline.txt +++ b/tests/baselines/exportDeclarations.baseline.txt @@ -3,6 +3,9 @@ original file export { a as b, x }; export * from "AnotherModule"; export { k as m, l } from "AnotherModule"; +export type { T }; +export type { U } from "AnotherModule"; + ----------------------------------- Grammar: TypeScript.tmLanguage @@ -101,4 +104,61 @@ Grammar: TypeScript.tmLanguage ^ source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.end.ts ^ - source.ts punctuation.terminator.statement.ts \ No newline at end of file + source.ts punctuation.terminator.statement.ts +>export type { T }; + ^^^^^^ + source.ts meta.export.ts keyword.control.export.ts + ^ + source.ts meta.export.ts + ^^^^ + source.ts meta.export.ts keyword.control.type.ts + ^ + source.ts meta.export.ts + ^ + source.ts meta.export.ts meta.block.ts punctuation.definition.block.ts + ^ + source.ts meta.export.ts meta.block.ts + ^ + source.ts meta.export.ts meta.block.ts variable.other.readwrite.alias.ts + ^ + source.ts meta.export.ts meta.block.ts + ^ + source.ts meta.export.ts meta.block.ts punctuation.definition.block.ts + ^ + source.ts punctuation.terminator.statement.ts +>export type { U } from "AnotherModule"; + ^^^^^^ + source.ts meta.export.ts keyword.control.export.ts + ^ + source.ts meta.export.ts + ^^^^ + source.ts meta.export.ts keyword.control.type.ts + ^ + source.ts meta.export.ts + ^ + source.ts meta.export.ts meta.block.ts punctuation.definition.block.ts + ^ + source.ts meta.export.ts meta.block.ts + ^ + source.ts meta.export.ts meta.block.ts variable.other.readwrite.alias.ts + ^ + source.ts meta.export.ts meta.block.ts + ^ + source.ts meta.export.ts meta.block.ts punctuation.definition.block.ts + ^ + source.ts meta.export.ts + ^^^^ + source.ts meta.export.ts keyword.control.from.ts + ^ + source.ts meta.export.ts + ^ + source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.begin.ts + ^^^^^^^^^^^^^ + source.ts meta.export.ts string.quoted.double.ts + ^ + source.ts meta.export.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/baselines/importTypeOnly.baseline.txt b/tests/baselines/importTypeOnly.baseline.txt new file mode 100644 index 00000000..82340c77 --- /dev/null +++ b/tests/baselines/importTypeOnly.baseline.txt @@ -0,0 +1,186 @@ +original file +----------------------------------- +import type T from "mod"; +import type { U, V } from "mod"; +import type * as types from "mod"; +import type from "mod"; +import type = require("mod"); +import type T = require("mod"); + +----------------------------------- + +Grammar: TypeScript.tmLanguage +----------------------------------- +>import type T from "mod"; + ^^^^^^ + 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 variable.other.readwrite.alias.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 { U, V } from "mod"; + ^^^^^^ + 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 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 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 types from "mod"; + ^^^^^^ + 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 constant.language.import-export-all.ts + ^ + source.ts meta.import.ts + ^^ + source.ts meta.import.ts keyword.control.as.ts + ^ + source.ts meta.import.ts + ^^^^^ + source.ts meta.import.ts variable.other.readwrite.alias.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 from "mod"; + ^^^^^^ + source.ts meta.import.ts keyword.control.import.ts + ^ + source.ts meta.import.ts + ^^^^ + source.ts meta.import.ts variable.other.readwrite.alias.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 = require("mod"); + ^^^^^^ + source.ts meta.import-equals.external.ts keyword.control.import.ts + ^ + source.ts meta.import-equals.external.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-equals.external.ts keyword.control.require.ts + ^ + source.ts meta.import-equals.external.ts meta.brace.round.ts + ^ + source.ts meta.import-equals.external.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-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 +>import type T = require("mod"); + ^^^^^^ + 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 variable.other.readwrite.alias.ts + ^^^ + source.ts meta.import.ts + ^^^^^^^ + source.ts meta.import.ts variable.other.readwrite.alias.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 meta.import.ts +> + ^ + source.ts meta.import.ts \ No newline at end of file diff --git a/tests/cases/exportDeclarations.ts b/tests/cases/exportDeclarations.ts index c46c807b..392ab621 100644 --- a/tests/cases/exportDeclarations.ts +++ b/tests/cases/exportDeclarations.ts @@ -1,3 +1,5 @@ export { a as b, x }; export * from "AnotherModule"; -export { k as m, l } from "AnotherModule"; \ No newline at end of file +export { k as m, l } from "AnotherModule"; +export type { T }; +export type { U } from "AnotherModule"; diff --git a/tests/cases/importTypeOnly.ts b/tests/cases/importTypeOnly.ts new file mode 100644 index 00000000..9ae6b1d8 --- /dev/null +++ b/tests/cases/importTypeOnly.ts @@ -0,0 +1,6 @@ +import type T from "mod"; +import type { U, V } from "mod"; +import type * as types from "mod"; +import type from "mod"; +import type = require("mod"); +import type T = require("mod"); From 5d8d213dc6977f3ed6043ec4758e9021f19309da Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Tue, 26 Nov 2019 16:02:01 -0800 Subject: [PATCH 2/4] Fix copy/paste error --- TypeScript.YAML-tmLanguage | 2 +- TypeScript.tmLanguage | 2 +- TypeScriptReact.tmLanguage | 2 +- .../baselines/exportDeclarations.baseline.txt | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/TypeScript.YAML-tmLanguage b/TypeScript.YAML-tmLanguage index bf97e337..6eb8247a 100644 --- a/TypeScript.YAML-tmLanguage +++ b/TypeScript.YAML-tmLanguage @@ -1141,7 +1141,7 @@ repository: - include: '#interface-declaration' - include: '#expression' - name: meta.export.ts - begin: '{{startOfIdentifier}}(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))' + begin: '{{startOfIdentifier}}(export)\b(?!(\$)|(\s*:))((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*{{identifier}}(\s|,))(?!\s*{{constructsAndModifiers}})))' beginCaptures: '0': { name: keyword.control.export.ts } end: (?=$|{{endOfStatement}}) diff --git a/TypeScript.tmLanguage b/TypeScript.tmLanguage index f575711c..21363078 100644 --- a/TypeScript.tmLanguage +++ b/TypeScript.tmLanguage @@ -3659,7 +3659,7 @@ name meta.export.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) beginCaptures 0 diff --git a/TypeScriptReact.tmLanguage b/TypeScriptReact.tmLanguage index 1ed10c64..2baf7f37 100644 --- a/TypeScriptReact.tmLanguage +++ b/TypeScriptReact.tmLanguage @@ -3681,7 +3681,7 @@ name meta.export.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))(?=(?:\s*type)??)((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) beginCaptures 0 diff --git a/tests/baselines/exportDeclarations.baseline.txt b/tests/baselines/exportDeclarations.baseline.txt index a6be2bf2..5501f122 100644 --- a/tests/baselines/exportDeclarations.baseline.txt +++ b/tests/baselines/exportDeclarations.baseline.txt @@ -43,23 +43,23 @@ Grammar: TypeScript.tmLanguage source.ts punctuation.terminator.statement.ts >export * from "AnotherModule"; ^^^^^^ - source.ts meta.export.ts keyword.control.export.ts + source.ts storage.modifier.ts ^ - source.ts meta.export.ts + source.ts ^ - source.ts meta.export.ts constant.language.import-export-all.ts + source.ts keyword.operator.arithmetic.ts ^ - source.ts meta.export.ts + source.ts ^^^^ - source.ts meta.export.ts keyword.control.from.ts + source.ts variable.other.readwrite.ts ^ - source.ts meta.export.ts + source.ts ^ - source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.begin.ts + source.ts string.quoted.double.ts punctuation.definition.string.begin.ts ^^^^^^^^^^^^^ - source.ts meta.export.ts string.quoted.double.ts + source.ts string.quoted.double.ts ^ - source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.end.ts + source.ts string.quoted.double.ts punctuation.definition.string.end.ts ^ source.ts punctuation.terminator.statement.ts >export { k as m, l } from "AnotherModule"; From e40258bde25dda4ea68b5df90d724bbed8938ede Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Mon, 2 Dec 2019 07:19:53 -0800 Subject: [PATCH 3/4] Update baseline --- .../baselines/exportDeclarations.baseline.txt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/baselines/exportDeclarations.baseline.txt b/tests/baselines/exportDeclarations.baseline.txt index 5501f122..a6be2bf2 100644 --- a/tests/baselines/exportDeclarations.baseline.txt +++ b/tests/baselines/exportDeclarations.baseline.txt @@ -43,23 +43,23 @@ Grammar: TypeScript.tmLanguage source.ts punctuation.terminator.statement.ts >export * from "AnotherModule"; ^^^^^^ - source.ts storage.modifier.ts + source.ts meta.export.ts keyword.control.export.ts ^ - source.ts + source.ts meta.export.ts ^ - source.ts keyword.operator.arithmetic.ts + source.ts meta.export.ts constant.language.import-export-all.ts ^ - source.ts + source.ts meta.export.ts ^^^^ - source.ts variable.other.readwrite.ts + source.ts meta.export.ts keyword.control.from.ts ^ - source.ts + source.ts meta.export.ts ^ - source.ts string.quoted.double.ts punctuation.definition.string.begin.ts + source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.begin.ts ^^^^^^^^^^^^^ - source.ts string.quoted.double.ts + source.ts meta.export.ts string.quoted.double.ts ^ - source.ts string.quoted.double.ts punctuation.definition.string.end.ts + source.ts meta.export.ts string.quoted.double.ts punctuation.definition.string.end.ts ^ source.ts punctuation.terminator.statement.ts >export { k as m, l } from "AnotherModule"; From 84988bf966aa61f046ec20457e28f04b6fb6f6d1 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 5 Dec 2019 10:59:48 -0800 Subject: [PATCH 4/4] Handle import export type at local matching rules --- TypeScript.YAML-tmLanguage | 37 ++++++------- TypeScript.tmLanguage | 59 +++++++++++++-------- TypeScriptReact.tmLanguage | 59 +++++++++++++-------- tests/baselines/importTypeOnly.baseline.txt | 36 +++++++------ 4 files changed, 112 insertions(+), 79 deletions(-) diff --git a/TypeScript.YAML-tmLanguage b/TypeScript.YAML-tmLanguage index 6eb8247a..2989fcf9 100644 --- a/TypeScript.YAML-tmLanguage +++ b/TypeScript.YAML-tmLanguage @@ -51,7 +51,6 @@ variables: lookBehindTypeof: '^typeof|{{nonPropertyLookBehind}}typeof' lookBehindCase: '^case|{{nonPropertyLookBehind}}case' lookBehindImport: '^import|{{nonPropertyLookBehind}}import' - lookBehindExport: '^export|{{nonPropertyLookBehind}}export' matchingParenthesis: (\(([^\(\)]|(\([^\(\)]*\)))*\)) matchingBraces: (\{([^\{\}]|(\{[^\{\}]*\}))*\}) matchingBrackets: (\[([^\[\]]|(\[[^\[\]]*\]))*\]) @@ -1067,15 +1066,16 @@ repository: import-equals-declaration: patterns: - name: meta.import-equals.external.ts - begin: '{{startOfDeclaration}}\b(import)\s+({{identifier}})\s*(=)\s*(require)\s*(\()' + begin: '{{startOfDeclaration}}\b(import)(?:\s+(type))?\s+({{identifier}})\s*(=)\s*(require)\s*(\()' beginCaptures: '1': { name: keyword.control.export.ts } '2': { name: storage.modifier.ts } '3': { name: keyword.control.import.ts } - '4': { name: variable.other.readwrite.alias.ts } - '5': { name: keyword.operator.assignment.ts } - '6': { name: keyword.control.require.ts } - '7': { name: meta.brace.round.ts } + '4': { name: keyword.control.type.ts } + '5': { name: variable.other.readwrite.alias.ts } + '6': { name: keyword.operator.assignment.ts } + '7': { name: keyword.control.require.ts } + '8': { name: meta.brace.round.ts } end: \) endCaptures: '0': { name: meta.brace.round.ts } @@ -1083,13 +1083,14 @@ repository: - include: '#comment' - include: '#string' - name: meta.import-equals.internal.ts - begin: '{{startOfDeclaration}}\b(import)\s+({{identifier}})\s*(=)\s*(?!require\b)' + begin: '{{startOfDeclaration}}\b(import)(?:\s+(type))?\s+({{identifier}})\s*(=)\s*(?!require\b)' beginCaptures: '1': { name: keyword.control.export.ts } '2': { name: storage.modifier.ts } '3': { name: keyword.control.import.ts } - '4': { name: variable.other.readwrite.alias.ts } - '5': { name: keyword.operator.assignment.ts } + '4': { name: keyword.control.type.ts } + '5': { name: variable.other.readwrite.alias.ts } + '6': { name: keyword.operator.assignment.ts } end: (?=;|$|^) patterns: - include: '#single-line-comment-consuming-line-ending' @@ -1104,11 +1105,12 @@ repository: import-declaration: name: meta.import.ts - begin: '{{startOfDeclaration}}\b(import)(?!\s*[:\(]){{endOfIdentifier}}' + begin: '{{startOfDeclaration}}\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(]){{endOfIdentifier}}' beginCaptures: '1': { name: keyword.control.export.ts } '2': { name: storage.modifier.ts } '3': { name: keyword.control.import.ts } + '4': { name: keyword.control.type.ts } end: (?name meta.import-equals.external.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\() + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\() beginCaptures 1 @@ -3403,19 +3403,24 @@ 4 name - variable.other.readwrite.alias.ts + keyword.control.type.ts 5 name - keyword.operator.assignment.ts + variable.other.readwrite.alias.ts 6 name - keyword.control.require.ts + keyword.operator.assignment.ts 7 + + name + keyword.control.require.ts + + 8 name meta.brace.round.ts @@ -3447,7 +3452,7 @@ name meta.import-equals.internal.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b) beginCaptures 1 @@ -3468,9 +3473,14 @@ 4 name - variable.other.readwrite.alias.ts + keyword.control.type.ts 5 + + name + variable.other.readwrite.alias.ts + + 6 name keyword.operator.assignment.ts @@ -3525,7 +3535,7 @@ name meta.import.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)) beginCaptures 1 @@ -3543,6 +3553,11 @@ name keyword.control.import.ts + 4 + + name + keyword.control.type.ts + end (?<!^import|[^\._$[:alnum:]]import)(?=;|$|^) @@ -3622,7 +3637,7 @@ name meta.export.default.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+))) beginCaptures 1 @@ -3633,9 +3648,14 @@ 2 name - keyword.operator.assignment.ts + keyword.control.type.ts 3 + + name + keyword.operator.assignment.ts + + 4 name keyword.control.default.ts @@ -3659,14 +3679,19 @@ name meta.export.ts begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(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))) beginCaptures - 0 + 1 name keyword.control.export.ts + 2 + + name + keyword.control.type.ts + end (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)) @@ -3706,18 +3731,6 @@ include #import-export-clause - - match - (?<=^import|[^\._$[:alnum:]]import|^export|[^\._$[:alnum:]]export)\s+(type)(?!\s*from) - captures - - 1 - - name - keyword.control.type.ts - - - import-export-block diff --git a/TypeScriptReact.tmLanguage b/TypeScriptReact.tmLanguage index 2baf7f37..d94fc778 100644 --- a/TypeScriptReact.tmLanguage +++ b/TypeScriptReact.tmLanguage @@ -3404,7 +3404,7 @@ name meta.import-equals.external.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\() + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(require)\s*(\() beginCaptures 1 @@ -3425,19 +3425,24 @@ 4 name - variable.other.readwrite.alias.tsx + keyword.control.type.tsx 5 name - keyword.operator.assignment.tsx + variable.other.readwrite.alias.tsx 6 name - keyword.control.require.tsx + keyword.operator.assignment.tsx 7 + + name + keyword.control.require.tsx + + 8 name meta.brace.round.tsx @@ -3469,7 +3474,7 @@ name meta.import-equals.internal.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type))?\s+([_$[:alpha:]][_$[:alnum:]]*)\s*(=)\s*(?!require\b) beginCaptures 1 @@ -3490,9 +3495,14 @@ 4 name - variable.other.readwrite.alias.tsx + keyword.control.type.tsx 5 + + name + variable.other.readwrite.alias.tsx + + 6 name keyword.operator.assignment.tsx @@ -3547,7 +3557,7 @@ name meta.import.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(?:(\bexport)\s+)?(?:(\bdeclare)\s+)?\b(import)(?:\s+(type)(?!\s+from))?(?!\s*[:\(])(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.)) beginCaptures 1 @@ -3565,6 +3575,11 @@ name keyword.control.import.tsx + 4 + + name + keyword.control.type.tsx + end (?<!^import|[^\._$[:alnum:]]import)(?=;|$|^) @@ -3644,7 +3659,7 @@ name meta.export.default.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:(?:\s*(=))|(?:\s+(default)(?=\s+))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)(?:\s+(type))?(?:(?:\s*(=))|(?:\s+(default)(?=\s+))) beginCaptures 1 @@ -3655,9 +3670,14 @@ 2 name - keyword.operator.assignment.tsx + keyword.control.type.tsx 3 + + name + keyword.operator.assignment.tsx + + 4 name keyword.control.default.tsx @@ -3681,14 +3701,19 @@ name meta.export.tsx begin - (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(export)\b(?!(\$)|(\s*:))((?=\s*(?:(?:type\s*)??\{|\*))|((?=\s*[_$[:alpha:]][_$[:alnum:]]*(\s|,))(?!\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))) + (?<![_$[:alnum:]])(?:(?<=\.\.\.)|(?<!\.))(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))) beginCaptures - 0 + 1 name keyword.control.export.tsx + 2 + + name + keyword.control.type.tsx + end (?=$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b)) @@ -3728,18 +3753,6 @@ include #import-export-clause - - match - (?<=^import|[^\._$[:alnum:]]import|^export|[^\._$[:alnum:]]export)\s+(type)(?!\s*from) - captures - - 1 - - name - keyword.control.type.tsx - - - import-export-block diff --git a/tests/baselines/importTypeOnly.baseline.txt b/tests/baselines/importTypeOnly.baseline.txt index 82340c77..abafaa73 100644 --- a/tests/baselines/importTypeOnly.baseline.txt +++ b/tests/baselines/importTypeOnly.baseline.txt @@ -158,29 +158,35 @@ Grammar: TypeScript.tmLanguage source.ts punctuation.terminator.statement.ts >import type T = require("mod"); ^^^^^^ - source.ts meta.import.ts keyword.control.import.ts + source.ts meta.import-equals.external.ts keyword.control.import.ts ^ - source.ts meta.import.ts + source.ts meta.import-equals.external.ts ^^^^ - source.ts meta.import.ts keyword.control.type.ts + source.ts meta.import-equals.external.ts keyword.control.type.ts ^ - source.ts meta.import.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 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-equals.external.ts keyword.control.require.ts ^ - source.ts meta.import.ts + source.ts meta.import-equals.external.ts meta.brace.round.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 punctuation.definition.string.begin.ts ^^^ - source.ts meta.import.ts string.quoted.double.ts + source.ts meta.import-equals.external.ts string.quoted.double.ts ^ - source.ts meta.import.ts string.quoted.double.ts punctuation.definition.string.end.ts - ^^^ - source.ts meta.import.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 \ No newline at end of file + source.ts \ No newline at end of file