From 92fc1f1f747688ef35604cced5ab55170d6152b9 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 5 Nov 2018 16:08:44 -0800 Subject: [PATCH] Enable file icons for js/ts path intellisense Fixes #61625 Requires TS 3.2+. Uses the kind modifier to determine the type of the file being imported --- .../src/features/completions.ts | 26 +++++++++++++------ .../src/protocol.const.ts | 23 ++++++++++++++++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/extensions/typescript-language-features/src/features/completions.ts b/extensions/typescript-language-features/src/features/completions.ts index 410980aa405..29edd0d4f40 100644 --- a/extensions/typescript-language-features/src/features/completions.ts +++ b/extensions/typescript-language-features/src/features/completions.ts @@ -86,6 +86,19 @@ class MyCompletionItem extends vscode.CompletionItem { } this.label += '?'; } + + if (tsEntry.kind === PConst.Kind.script && tsEntry.kindModifiers) { + for (const extModifier of PConst.KindModifiers.fileExtensionKindModifiers) { + if (tsEntry.kindModifiers.match(extModifier.pattern)) { + if (tsEntry.name.toLowerCase().endsWith(extModifier.value)) { + this.detail = tsEntry.name; + } else { + this.detail = tsEntry.name + extModifier.value; + } + break; + } + } + } this.resolveRange(line); } @@ -400,19 +413,16 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider ] }; - let details: Proto.CompletionEntryDetails[] | undefined; const response = await this.client.execute('completionEntryDetails', args, token); - if (response.type !== 'response') { + if (response.type !== 'response' || !response.body) { return item; } - const { body } = response; - details = body; - if (!details || !details.length || !details[0]) { - return item; + const detail = response.body[0]; + + if (!item.detail && detail.displayParts.length) { + item.detail = Previewer.plain(detail.displayParts); } - const detail = details[0]; - item.detail = detail.displayParts.length ? Previewer.plain(detail.displayParts) : undefined; item.documentation = this.getDocumentation(detail, item); const codeAction = this.getCodeActions(detail, filepath); diff --git a/extensions/typescript-language-features/src/protocol.const.ts b/extensions/typescript-language-features/src/protocol.const.ts index 241bffd24d5..d54ee0fd2cf 100644 --- a/extensions/typescript-language-features/src/protocol.const.ts +++ b/extensions/typescript-language-features/src/protocol.const.ts @@ -39,4 +39,27 @@ export class DiagnosticCategory { public static readonly error = 'error'; public static readonly warning = 'warning'; public static readonly suggestion = 'suggestion'; +} + +interface KindModifier { + readonly pattern: RegExp; + readonly value: string; +} + +export class KindModifiers { + public static readonly dtsModifier: KindModifier = { pattern: /(^|\s)\.d\.ts($|\s)/i, value: '.d.ts' }; + public static readonly tsModifier: KindModifier = { pattern: /(^|\s)\.ts($|\s)/i, value: '.ts' }; + public static readonly tsxModifier: KindModifier = { pattern: /(^|\s)\.tsx($|\s)/i, value: '.tsx' }; + public static readonly jsModifier: KindModifier = { pattern: /(^|\s)\.js($|\s)/i, value: '.js' }; + public static readonly jsxModifier: KindModifier = { pattern: /(^|\s)\.jsx($|\s)/i, value: '.jsx' }; + public static readonly jsonModifier: KindModifier = { pattern: /(^|\s)\.json($|\s)/i, value: '.json' }; + + public static readonly fileExtensionKindModifiers = [ + KindModifiers.dtsModifier, + KindModifiers.tsModifier, + KindModifiers.tsxModifier, + KindModifiers.jsModifier, + KindModifiers.jsxModifier, + KindModifiers.jsonModifier, + ]; } \ No newline at end of file -- GitLab