diff --git a/src/jsonMode.ts b/src/jsonMode.ts index 671c492f..5fe3a980 100644 --- a/src/jsonMode.ts +++ b/src/jsonMode.ts @@ -15,7 +15,8 @@ import IDisposable = monaco.IDisposable; export function setupMode(defaults: LanguageServiceDefaultsImpl): void { - let disposables: IDisposable[] = []; + const disposables: IDisposable[] = []; + let formattingDisposables: IDisposable[] = [] const client = new WorkerManager(defaults); disposables.push(client); @@ -24,20 +25,38 @@ export function setupMode(defaults: LanguageServiceDefaultsImpl): void { return client.getLanguageServiceWorker(...uris); }; - const {disableDefaultFormatter, languageId} = defaults; + const {languageId, capabilities} = defaults; + + function registerFormattingDisposables() { + formattingDisposables.push(monaco.languages.registerDocumentFormattingEditProvider(languageId, new languageFeatures.DocumentFormattingEditProvider(worker))); + formattingDisposables.push(monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, new languageFeatures.DocumentRangeFormattingEditProvider(worker))); + } + + if (!capabilities.disableDefaultFormatter) { + registerFormattingDisposables() + } disposables.push(monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker))); disposables.push(monaco.languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))); disposables.push(monaco.languages.registerDocumentSymbolProvider(languageId, new languageFeatures.DocumentSymbolAdapter(worker))); - if (!disableDefaultFormatter) { - disposables.push(monaco.languages.registerDocumentFormattingEditProvider(languageId, new languageFeatures.DocumentFormattingEditProvider(worker))); - disposables.push(monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, new languageFeatures.DocumentRangeFormattingEditProvider(worker))); - } disposables.push(new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults)); disposables.push(monaco.languages.setTokensProvider(languageId, createTokenizationSupport(true))); disposables.push(monaco.languages.setLanguageConfiguration(languageId, richEditConfiguration)); disposables.push(monaco.languages.registerColorProvider(languageId, new languageFeatures.DocumentColorAdapter(worker))); disposables.push(monaco.languages.registerFoldingRangeProvider(languageId, new languageFeatures.FoldingRangeAdapter(worker))); + + defaults.onDidChange((newDefaults) => { + const {capabilities} = newDefaults; + const formattingDisabled = formattingDisposables.length === 0; + if (formattingDisabled != capabilities.disableDefaultFormatter) { + if (capabilities.disableDefaultFormatter) { + formattingDisposables.forEach(d => d.dispose()) + formattingDisposables = []; + } else { + registerFormattingDisposables(); + } + } + }) } diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index fcb81fdc..9ef8a830 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -16,13 +16,13 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.json.Langua private _onDidChange = new Emitter(); private _diagnosticsOptions: monaco.languages.json.DiagnosticsOptions; - private _disableDefaultFormatter: boolean; + private _capabilities: monaco.languages.json.Capabilities; private _languageId: string; - constructor(languageId: string, diagnosticsOptions: monaco.languages.json.DiagnosticsOptions, disableDefaultFormatter: boolean) { + constructor(languageId: string, diagnosticsOptions: monaco.languages.json.DiagnosticsOptions, capabilities: monaco.languages.json.Capabilities) { this._languageId = languageId; this.setDiagnosticsOptions(diagnosticsOptions); - this.setDisableDefaultFormatter(disableDefaultFormatter) + this.setCapabilities(capabilities) } get onDidChange(): IEvent { @@ -33,8 +33,8 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.json.Langua return this._languageId; } - get disableDefaultFormatter(): boolean { - return this._disableDefaultFormatter; + get capabilities(): monaco.languages.json.Capabilities { + return this._capabilities; } get diagnosticsOptions(): monaco.languages.json.DiagnosticsOptions { @@ -45,8 +45,8 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.json.Langua this._diagnosticsOptions = options || Object.create(null); this._onDidChange.fire(this); } - setDisableDefaultFormatter(disable: boolean): void { - this._disableDefaultFormatter = disable; + setCapabilities(capabilities: monaco.languages.json.Capabilities): void { + this._capabilities = capabilities || Object.create(null); this._onDidChange.fire(this); }; } @@ -58,13 +58,16 @@ const diagnosticDefault: monaco.languages.json.DiagnosticsOptions = { enableSchemaRequest: false }; -const jsonDefaults = new LanguageServiceDefaultsImpl('json', diagnosticDefault, false); +const capabilitiesDefault: monaco.languages.json.Capabilities = { + disableDefaultFormatter: false +} +const jsonDefaults = new LanguageServiceDefaultsImpl('json', diagnosticDefault, capabilitiesDefault); // Export API function createAPI(): typeof monaco.languages.json { return { - jsonDefaults: jsonDefaults, + jsonDefaults: jsonDefaults } } monaco.languages.json = createAPI(); diff --git a/src/monaco.d.ts b/src/monaco.d.ts index 25e04d49..4a81873a 100644 --- a/src/monaco.d.ts +++ b/src/monaco.d.ts @@ -36,15 +36,19 @@ declare module monaco.languages.json { readonly enableSchemaRequest? : boolean; } - export interface LanguageServiceDefaults { - readonly onDidChange: IEvent; - readonly diagnosticsOptions: DiagnosticsOptions; - setDiagnosticsOptions(options: DiagnosticsOptions): void; + export interface Capabilities { /** * Disable the default JSON formatter. */ readonly disableDefaultFormatter?: boolean; - setDisableDefaultFormatter(disable: boolean): void; + } + + export interface LanguageServiceDefaults { + readonly onDidChange: IEvent; + readonly diagnosticsOptions: DiagnosticsOptions; + readonly capabilities: Capabilities; + setDiagnosticsOptions(options: DiagnosticsOptions): void; + setCapabilities(capabilities: Capabilities): void; } export var jsonDefaults: LanguageServiceDefaults;