From 1b882bcbaa016b93d4f268f7a29cf56bb8bd5695 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 7 Nov 2017 16:23:01 -0800 Subject: [PATCH] Move remaining command to use command classes --- extensions/typescript/package.json | 4 +- .../src/features/jsDocCompletionProvider.ts | 21 +-- extensions/typescript/src/typescriptMain.ts | 121 +++++++++++++----- .../typescript/src/utils/commandManager.ts | 2 +- 4 files changed, 102 insertions(+), 46 deletions(-) diff --git a/extensions/typescript/package.json b/extensions/typescript/package.json index 6d2e4f19230..db4ea5b647a 100644 --- a/extensions/typescript/package.json +++ b/extensions/typescript/package.json @@ -506,11 +506,11 @@ "when": "editorLangId == typescriptreact" }, { - "command": "javascript.goToProjectConfig", + "command": "typescript.goToProjectConfig", "when": "editorLangId == 'javascript'" }, { - "command": "javascript.goToProjectConfig", + "command": "typescript.goToProjectConfig", "when": "editorLangId == javascriptreact" } ] diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index 656ba554831..267acadb93f 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -10,6 +10,7 @@ import { DocCommandTemplateResponse } from '../protocol'; import * as nls from 'vscode-nls'; import { vsPositionToTsFileLocation } from '../utils/convert'; +import { Command, CommandManager } from '../utils/commandManager'; const localize = nls.loadMessageBundle(); const configurationNamespace = 'jsDocCompletion'; @@ -45,11 +46,14 @@ class JsDocCompletionItem extends CompletionItem { } } -export class JsDocCompletionProvider implements CompletionItemProvider { +export default class JsDocCompletionProvider implements CompletionItemProvider { constructor( private client: ITypeScriptServiceClient, - ) { } + commandManager: CommandManager + ) { + commandManager.register(new TryCompleteJsDocCommand(client)); + } public provideCompletionItems( document: TextDocument, @@ -77,19 +81,20 @@ export class JsDocCompletionProvider implements CompletionItemProvider { } } -export class TryCompleteJsDocCommand { - static COMMAND_NAME = '_typeScript.tryCompleteJsDoc'; +class TryCompleteJsDocCommand implements Command { + public static readonly COMMAND_NAME = '_typeScript.tryCompleteJsDoc'; + public readonly id = TryCompleteJsDocCommand.COMMAND_NAME; constructor( - private lazyClient: () => ITypeScriptServiceClient + private readonly client: ITypeScriptServiceClient ) { } /** * Try to insert a jsdoc comment, using a template provide by typescript * if possible, otherwise falling back to a default comment format. */ - public async tryCompleteJsDoc(resource: Uri, start: Position, shouldGetJSDocFromTSServer: boolean): Promise { - const file = this.lazyClient().normalizePath(resource); + public async execute(resource: Uri, start: Position, shouldGetJSDocFromTSServer: boolean): Promise { + const file = this.client.normalizePath(resource); if (!file) { return false; } @@ -113,7 +118,7 @@ export class TryCompleteJsDocCommand { private tryInsertJsDocFromTemplate(editor: TextEditor, file: string, position: Position): Promise { const args = vsPositionToTsFileLocation(file, position); return Promise.race([ - this.lazyClient().execute('docCommentTemplate', args), + this.client.execute('docCommentTemplate', args), new Promise((_, reject) => setTimeout(reject, 250)) ]).then((res: DocCommandTemplateResponse) => { if (!res || !res.body) { diff --git a/extensions/typescript/src/typescriptMain.ts b/extensions/typescript/src/typescriptMain.ts index a787134a234..96e832423bb 100644 --- a/extensions/typescript/src/typescriptMain.ts +++ b/extensions/typescript/src/typescriptMain.ts @@ -25,7 +25,6 @@ import TypeScriptServiceClient from './typescriptServiceClient'; import { ITypeScriptServiceClientHost } from './typescriptService'; import BufferSyncSupport from './features/bufferSyncSupport'; -import { JsDocCompletionProvider, TryCompleteJsDocCommand } from './features/jsDocCompletionProvider'; import TypeScriptTaskProviderManager from './features/taskProvider'; import * as ProjectStatus from './utils/projectStatus'; @@ -36,7 +35,7 @@ import { openOrCreateConfigFile, isImplicitProjectConfigFile } from './utils/tsc import { tsLocationToVsPosition } from './utils/convert'; import FormattingConfigurationManager from './features/formattingConfigurationManager'; import * as languageModeIds from './utils/languageModeIds'; -import { CommandManager } from './utils/commandManager'; +import { CommandManager, Command } from './utils/commandManager'; interface LanguageDescription { id: string; @@ -60,6 +59,84 @@ const standardLanguageDescriptions: LanguageDescription[] = [ } ]; +class ReloadTypeScriptProjectsCommand implements Command { + public readonly id = 'typescript.reloadProjects'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost + ) { } + + public execute() { + this.lazyClientHost().reloadProjects(); + } +} + +class ReloadJavaScriptProjectsCommand implements Command { + public readonly id = 'javascript.reloadProjects'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost + ) { } + + public execute() { + this.lazyClientHost().reloadProjects(); + } +} + +class SelectTypeScriptVersionCommand implements Command { + public readonly id = 'typescript.selectTypeScriptVersion'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost + ) { } + + public execute() { + this.lazyClientHost().serviceClient.onVersionStatusClicked(); + } +} + +class OpenTsServerLogCommand implements Command { + public readonly id = 'typescript.openTsServerLog'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost + ) { } + + public execute() { + this.lazyClientHost().serviceClient.openTsServerLogFile(); + } +} + +class RestartTsServerCommand implements Command { + public readonly id = 'typescript.restartTsServer'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost + ) { } + + public execute() { + this.lazyClientHost().serviceClient.restartTsServer(); + } +} + +class GoToProjectConfigCommand implements Command { + public readonly id = 'typescript.goToProjectConfig'; + + public constructor( + private readonly lazyClientHost: () => TypeScriptServiceClientHost, + ) { } + + public execute() { + const editor = window.activeTextEditor; + if (editor) { + const isTsProject = languages.match([languageModeIds.typescript, languageModeIds.typescriptreact], editor.document) > 0; + this.lazyClientHost().goToProjectConfig(isTsProject, editor.document.uri); + } + } +} + + + export function activate(context: ExtensionContext): void { const plugins = getContributedTypeScriptServerPlugins(); @@ -87,41 +164,15 @@ export function activate(context: ExtensionContext): void { })(); - commandManager.registerCommand('typescript.reloadProjects', () => { - lazyClientHost().reloadProjects(); - }); - - commandManager.registerCommand('javascript.reloadProjects', () => { - lazyClientHost().reloadProjects(); - }); - - commandManager.registerCommand('typescript.selectTypeScriptVersion', () => { - lazyClientHost().serviceClient.onVersionStatusClicked(); - }); - - commandManager.registerCommand('typescript.openTsServerLog', () => { - lazyClientHost().serviceClient.openTsServerLogFile(); - }); - - commandManager.registerCommand('typescript.restartTsServer', () => { - lazyClientHost().serviceClient.restartTsServer(); - }); + commandManager.register(new ReloadTypeScriptProjectsCommand(lazyClientHost)); + commandManager.register(new ReloadJavaScriptProjectsCommand(lazyClientHost)); + commandManager.register(new SelectTypeScriptVersionCommand(lazyClientHost)); + commandManager.register(new OpenTsServerLogCommand(lazyClientHost)); + commandManager.register(new RestartTsServerCommand(lazyClientHost)); + commandManager.register(new GoToProjectConfigCommand(lazyClientHost)); context.subscriptions.push(new TypeScriptTaskProviderManager(() => lazyClientHost().serviceClient)); - const goToProjectConfig = (isTypeScript: boolean) => { - const editor = window.activeTextEditor; - if (editor) { - lazyClientHost().goToProjectConfig(isTypeScript, editor.document.uri); - } - }; - commandManager.registerCommand('typescript.goToProjectConfig', goToProjectConfig.bind(null, true)); - commandManager.registerCommand('javascript.goToProjectConfig', goToProjectConfig.bind(null, false)); - - const jsDocCompletionCommand = new TryCompleteJsDocCommand(() => lazyClientHost().serviceClient); - commandManager.registerCommand(TryCompleteJsDocCommand.COMMAND_NAME, jsDocCompletionCommand.tryCompleteJsDoc, jsDocCompletionCommand); - - const EMPTY_ELEMENTS: string[] = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'menuitem', 'meta', 'param', 'source', 'track', 'wbr']; context.subscriptions.push(languages.setLanguageConfiguration('jsx-tags', { @@ -248,7 +299,7 @@ class LanguageProvider { this.disposables.push(formattingProviderManager); this.toUpdateOnConfigurationChanged.push(formattingProviderManager); - this.disposables.push(languages.registerCompletionItemProvider(selector, new JsDocCompletionProvider(client), '*')); + this.disposables.push(languages.registerCompletionItemProvider(selector, new (await import('./features/jsDocCompletionProvider')).default(client, this.commandManager), '*')); this.disposables.push(languages.registerHoverProvider(selector, new (await import('./features/hoverProvider')).default(client))); this.disposables.push(languages.registerDefinitionProvider(selector, new (await import('./features/definitionProvider')).default(client))); this.disposables.push(languages.registerDocumentHighlightProvider(selector, new (await import('./features/documentHighlightProvider')).default(client))); diff --git a/extensions/typescript/src/utils/commandManager.ts b/extensions/typescript/src/utils/commandManager.ts index 32e58c8f867..4f3e6a8f3d3 100644 --- a/extensions/typescript/src/utils/commandManager.ts +++ b/extensions/typescript/src/utils/commandManager.ts @@ -21,7 +21,7 @@ export class CommandManager { this.commands.clear(); } - public registerCommand(id: string, impl: (...args: any[]) => void, thisArg?: any) { + private registerCommand(id: string, impl: (...args: any[]) => void, thisArg?: any) { if (this.commands.has(id)) { return; }