Move all version dep providers to use generic helper class

This commit is contained in:
Matt Bierner
2018-06-04 14:30:05 -07:00
parent 95f3194922
commit 38e6baa2f1
4 changed files with 67 additions and 37 deletions

View File

@@ -3,12 +3,29 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { ImplementationProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode';
import * as vscode from 'vscode';
import { ITypeScriptServiceClient } from '../typescriptService';
import API from '../utils/api';
import { VersionDependentRegistration } from '../utils/versionDependentRegistration';
import DefinitionProviderBase from './definitionProviderBase';
export default class TypeScriptImplementationProvider extends DefinitionProviderBase implements ImplementationProvider {
public provideImplementation(document: TextDocument, position: Position, token: CancellationToken | boolean): Promise<Definition | undefined> {
class TypeScriptImplementationProvider extends DefinitionProviderBase implements vscode.ImplementationProvider {
public provideImplementation(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken | boolean): Promise<vscode.Definition | undefined> {
return this.getSymbolLocations('implementation', document, position, token);
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
) {
return new VersionDependentRegistration(client, {
isSupportedVersion(api: API) {
return api.has220Features();
},
register() {
return vscode.languages.registerImplementationProvider(selector,
new TypeScriptImplementationProvider(client));
}
});
}

View File

@@ -10,6 +10,7 @@ import { ITypeScriptServiceClient } from '../typescriptService';
import { Command, CommandManager } from '../utils/commandManager';
import * as typeconverts from '../utils/typeConverters';
import FileConfigurationManager from './fileConfigurationManager';
import { VersionDependentRegistration } from '../utils/versionDependentRegistration';
const localize = nls.loadMessageBundle();
@@ -82,4 +83,23 @@ export class OrganizeImportsCodeActionProvider implements vscode.CodeActionProvi
action.command = { title: '', command: OrganizeImportsCommand.Id, arguments: [file] };
return [action];
}
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
commandManager: CommandManager,
fileConfigurationManager: FileConfigurationManager
) {
return new VersionDependentRegistration(client, {
isSupportedVersion(api) {
return api.has280Features();
},
register() {
const organizeImportsProvider = new OrganizeImportsCodeActionProvider(client, commandManager, fileConfigurationManager);
return vscode.languages.registerCodeActionsProvider(selector,
organizeImportsProvider,
organizeImportsProvider.metadata);
}
});
}

View File

@@ -3,12 +3,29 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { TypeDefinitionProvider, TextDocument, Position, CancellationToken, Definition } from 'vscode';
import * as vscode from 'vscode';
import { ITypeScriptServiceClient } from '../typescriptService';
import { VersionDependentRegistration } from '../utils/versionDependentRegistration';
import DefinitionProviderBase from './definitionProviderBase';
import API from '../utils/api';
export default class TypeScriptTypeDefinitionProvider extends DefinitionProviderBase implements TypeDefinitionProvider {
public provideTypeDefinition(document: TextDocument, position: Position, token: CancellationToken | boolean): Promise<Definition | undefined> {
export default class TypeScriptTypeDefinitionProvider extends DefinitionProviderBase implements vscode.TypeDefinitionProvider {
public provideTypeDefinition(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken | boolean): Promise<vscode.Definition | undefined> {
return this.getSymbolLocations('typeDefinition', document, position, token);
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
) {
return new VersionDependentRegistration(client, {
isSupportedVersion(api: API) {
return api.has213Features();
},
register() {
return vscode.languages.registerTypeDefinitionProvider(selector,
new TypeScriptTypeDefinitionProvider(client));
}
});
}

View File

@@ -36,7 +36,6 @@ export default class LanguageProvider {
private _enableSuggestionDiagnostics: boolean = true;
private readonly disposables: vscode.Disposable[] = [];
private readonly versionDependentDisposables: vscode.Disposable[] = [];
private readonly renameHandler: UpdateImportsOnFileRenameHandler;
@@ -75,7 +74,6 @@ export default class LanguageProvider {
public dispose(): void {
disposeAll(this.disposables);
disposeAll(this.versionDependentDisposables);
this.diagnosticsManager.dispose();
this.bufferSyncSupport.dispose();
@@ -109,17 +107,18 @@ export default class LanguageProvider {
this.disposables.push((await import('./features/directiveCommentCompletionProvider')).register(selector, client));
this.disposables.push((await import('./features/documentHighlightProvider')).register(selector, client));
this.disposables.push((await import('./features/documentSymbolProvider')).register(selector, client));
this.disposables.push((await import('./features/foldingProvider')).register(selector, client));
this.disposables.push((await import('./features/formattingProvider')).register(selector, this.description.id, config, client, this.fileConfigurationManager));
this.disposables.push((await import('./features/hoverProvider')).register(selector, client));
this.disposables.push((await import('./features/implementationProvider')).register(selector, this.client));
this.disposables.push((await import('./features/jsDocCompletionProvider')).register(selector, client, commandManager));
this.disposables.push((await import('./features/organizeImports')).register(selector, this.client, this.commandManager, this.fileConfigurationManager));
this.disposables.push((await import('./features/quickFixProvider')).register(selector, client, this.fileConfigurationManager, commandManager, this.diagnosticsManager, this.bufferSyncSupport, this.telemetryReporter));
this.disposables.push((await import('./features/refactorProvider')).register(selector, client, this.fileConfigurationManager, commandManager));
this.disposables.push((await import('./features/referenceProvider')).register(selector, client));
this.disposables.push((await import('./features/renameProvider')).register(selector, client));
this.disposables.push((await import('./features/signatureHelpProvider')).register(selector, client));
this.disposables.push((await import('./features/foldingProvider')).register(selector, client));
this.registerVersionDependentProviders();
this.disposables.push((await import('./features/typeDefinitionProvider')).register(selector, this.client));
const referenceCodeLensProvider = new (await import('./features/referencesCodeLensProvider')).default(client, this.description.id, cachedResponse);
referenceCodeLensProvider.updateConfiguration();
@@ -194,35 +193,12 @@ export default class LanguageProvider {
this.bufferSyncSupport.reOpenDocuments();
this.bufferSyncSupport.requestAllDiagnostics();
this.fileConfigurationManager.reset();
this.registerVersionDependentProviders();
}
public getErr(resources: vscode.Uri[]) {
this.bufferSyncSupport.getErr(resources);
}
private async registerVersionDependentProviders(): Promise<void> {
disposeAll(this.versionDependentDisposables);
if (!this.client) {
return;
}
const selector = this.documentSelector;
if (this.client.apiVersion.has220Features()) {
this.versionDependentDisposables.push(vscode.languages.registerImplementationProvider(selector, new (await import('./features/implementationProvider')).default(this.client)));
}
if (this.client.apiVersion.has213Features()) {
this.versionDependentDisposables.push(vscode.languages.registerTypeDefinitionProvider(selector, new (await import('./features/typeDefinitionProvider')).default(this.client)));
}
if (this.client.apiVersion.has280Features()) {
const organizeImportsProvider = new (await import('./features/organizeImports')).OrganizeImportsCodeActionProvider(this.client, this.commandManager, this.fileConfigurationManager);
this.versionDependentDisposables.push(vscode.languages.registerCodeActionsProvider(selector, organizeImportsProvider, organizeImportsProvider.metadata));
}
}
public triggerAllDiagnostics(): void {
this.bufferSyncSupport.requestAllDiagnostics();
}