提交 df7425c8 编写于 作者: M Matt Bierner

Use manager for registering and unregistering folding provider

上级 604beac1
......@@ -416,11 +416,6 @@
"description": "%typescript.locale%",
"scope": "window"
},
"typescript.experimental.syntaxFolding": {
"type": "boolean",
"default": true,
"description": "%typescript.experimental.syntaxFolding%"
},
"javascript.suggestionActions.enabled": {
"type": "boolean",
"default": true,
......
......@@ -49,7 +49,6 @@
"typescript.locale": "Sets the locale used to report JavaScript and TypeScript errors. Requires TypeScript >= 2.6.0. Default of 'null' uses VS Code's locale.",
"javascript.implicitProjectConfig.experimentalDecorators": "Enable/disable 'experimentalDecorators' for JavaScript files that are not part of a project. Existing jsconfig.json or tsconfig.json files override this setting. Requires TypeScript >= 2.3.1.",
"typescript.autoImportSuggestions.enabled": "Enable/disable auto import suggestions. Requires TypeScript >= 2.6.1",
"typescript.experimental.syntaxFolding": "Enables/disables syntax aware folding markers.",
"taskDefinition.tsconfig.description": "The tsconfig file that defines the TS build.",
"javascript.suggestionActions.enabled": "Enable/disable suggestion diagnostics for JavaScript files in the editor. Requires TypeScript >= 2.8",
"typescript.suggestionActions.enabled": "Enable/disable suggestion diagnostics for TypeScript files in the editor. Requires TypeScript >= 2.8",
......
......@@ -4,12 +4,14 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import * as Proto from '../protocol';
import * as typeConverters from '../utils/typeConverters';
import { ITypeScriptServiceClient } from '../typescriptService';
import API from '../utils/api';
import { disposeAll } from '../utils/dispose';
import * as typeConverters from '../utils/typeConverters';
export default class TypeScriptFoldingProvider implements vscode.FoldingRangeProvider {
class TypeScriptFoldingProvider implements vscode.FoldingRangeProvider {
public constructor(
private readonly client: ITypeScriptServiceClient
) { }
......@@ -73,3 +75,47 @@ export default class TypeScriptFoldingProvider implements vscode.FoldingRangePro
}
}
}
class FoldingProviderManager {
private registration: vscode.Disposable | undefined = undefined;
private readonly _disposables: vscode.Disposable[] = [];
constructor(
private readonly selector: vscode.DocumentSelector,
private readonly client: ITypeScriptServiceClient
) {
this.update(client.apiVersion);
this.client.onTsServerStarted(() => {
this.update(this.client.apiVersion);
}, null, this._disposables);
}
public dispose() {
disposeAll(this._disposables);
if (this.registration) {
this.registration.dispose();
this.registration = undefined;
}
}
private update(api: API) {
if (api.has280Features()) {
if (!this.registration) {
this.registration = vscode.languages.registerFoldingRangeProvider(this.selector, new TypeScriptFoldingProvider(this.client));
}
} else {
if (this.registration) {
this.registration.dispose();
this.registration = undefined;
}
}
}
}
export function register(
selector: vscode.DocumentSelector,
client: ITypeScriptServiceClient,
): vscode.Disposable {
return new FoldingProviderManager(selector, client);
}
\ No newline at end of file
......@@ -24,7 +24,6 @@ import { UpdateImportsOnFileRenameHandler } from './features/updatePathsOnRename
const validateSetting = 'validate.enable';
const suggestionSetting = 'suggestionActions.enabled';
const foldingSetting = 'typescript.experimental.syntaxFolding';
export default class LanguageProvider {
private readonly diagnosticsManager: DiagnosticsManager;
......@@ -39,7 +38,6 @@ export default class LanguageProvider {
private readonly disposables: vscode.Disposable[] = [];
private readonly versionDependentDisposables: vscode.Disposable[] = [];
private foldingProviderRegistration: vscode.Disposable | undefined = void 0;
private readonly renameHandler: UpdateImportsOnFileRenameHandler;
constructor(
......@@ -119,14 +117,7 @@ export default class LanguageProvider {
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));
await this.initFoldingProvider();
this.disposables.push(vscode.workspace.onDidChangeConfiguration(c => {
if (c.affectsConfiguration(foldingSetting)) {
this.initFoldingProvider();
}
}));
this.disposables.push({ dispose: () => this.foldingProviderRegistration && this.foldingProviderRegistration.dispose() });
this.disposables.push((await import('./features/foldingProvider')).register(selector, client));
this.registerVersionDependentProviders();
......@@ -143,20 +134,6 @@ export default class LanguageProvider {
this.disposables.push(vscode.languages.registerWorkspaceSymbolProvider(new (await import('./features/workspaceSymbolProvider')).default(client, this.description.modeIds)));
}
private async initFoldingProvider(): Promise<void> {
let enable = vscode.workspace.getConfiguration().get(foldingSetting, false);
if (enable && this.client.apiVersion.has280Features()) {
if (!this.foldingProviderRegistration) {
this.foldingProviderRegistration = vscode.languages.registerFoldingRangeProvider(this.documentSelector, new (await import('./features/foldingProvider')).default(this.client));
}
} else {
if (this.foldingProviderRegistration) {
this.foldingProviderRegistration.dispose();
this.foldingProviderRegistration = void 0;
}
}
}
private configurationChanged(): void {
const config = vscode.workspace.getConfiguration(this.id, null);
this.updateValidate(config.get(validateSetting, true));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册