diff --git a/src/htmlMode.ts b/src/htmlMode.ts index c1dd9795..d7328f4a 100644 --- a/src/htmlMode.ts +++ b/src/htmlMode.ts @@ -10,8 +10,9 @@ import { LanguageServiceDefaultsImpl } from './monaco.contribution'; import * as languageFeatures from './languageFeatures'; import Uri = monaco.Uri; +import IDisposable = monaco.IDisposable; -export function setupMode(defaults: LanguageServiceDefaultsImpl): void { +export function setupMode1(defaults: LanguageServiceDefaultsImpl): void { const client = new WorkerManager(defaults); @@ -40,3 +41,74 @@ export function setupMode(defaults: LanguageServiceDefaultsImpl): void { } } + +export function setupMode(defaults: LanguageServiceDefaultsImpl): IDisposable { + + const disposables: IDisposable[] = []; + const providers: IDisposable[] = []; + + const client = new WorkerManager(defaults); + disposables.push(client); + + const worker: languageFeatures.WorkerAccessor = (...uris: Uri[]): Promise => { + return client.getLanguageServiceWorker(...uris); + }; + + + function registerProviders(): void { + const { languageId, modeConfiguration } = defaults; + + disposeAll(providers); + + if (modeConfiguration.completionItems) { + providers.push(monaco.languages.registerCompletionItemProvider(languageId, new languageFeatures.CompletionAdapter(worker))); + } + if (modeConfiguration.hovers) { + providers.push(monaco.languages.registerHoverProvider(languageId, new languageFeatures.HoverAdapter(worker))); + } + if (modeConfiguration.documentHighlights) { + providers.push(monaco.languages.registerDocumentHighlightProvider(languageId, new languageFeatures.DocumentHighlightAdapter(worker))); + } + if (modeConfiguration.links) { + providers.push(monaco.languages.registerLinkProvider(languageId, new languageFeatures.DocumentLinkAdapter(worker))); + } + if (modeConfiguration.documentSymbols) { + providers.push(monaco.languages.registerDocumentSymbolProvider(languageId, new languageFeatures.DocumentSymbolAdapter(worker))); + } + if (modeConfiguration.rename) { + providers.push(monaco.languages.registerRenameProvider(languageId, new languageFeatures.RenameAdapter(worker))); + } + if (modeConfiguration.foldingRanges) { + providers.push(monaco.languages.registerFoldingRangeProvider(languageId, new languageFeatures.FoldingRangeAdapter(worker))); + } + if (modeConfiguration.selectionRanges) { + providers.push(monaco.languages.registerSelectionRangeProvider(languageId, new languageFeatures.SelectionRangeAdapter(worker))); + } + if (modeConfiguration.documentFormattingEdits) { + providers.push(monaco.languages.registerDocumentFormattingEditProvider(languageId, new languageFeatures.DocumentFormattingEditProvider(worker))); + } + if (modeConfiguration.documentRangeFormattingEdits) { + providers.push(monaco.languages.registerDocumentRangeFormattingEditProvider(languageId, new languageFeatures.DocumentRangeFormattingEditProvider(worker))); + } + if (modeConfiguration.diagnostics) { + providers.push(new languageFeatures.DiagnosticsAdapter(languageId, worker, defaults)); + } + } + + registerProviders(); + + + disposables.push(asDisposable(providers)); + + return asDisposable(disposables); +} + +function asDisposable(disposables: IDisposable[]): IDisposable { + return { dispose: () => disposeAll(disposables) }; +} + +function disposeAll(disposables: IDisposable[]) { + while (disposables.length) { + disposables.pop().dispose(); + } +} diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index ca8f43d1..26cc097e 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -15,11 +15,13 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.html.Langua private _onDidChange = new Emitter(); private _options: monaco.languages.html.Options; + private _modeConfiguration: monaco.languages.html.ModeConfiguration; private _languageId: string; - constructor(languageId: string, options: monaco.languages.html.Options) { + constructor(languageId: string, options: monaco.languages.html.Options, modeConfiguration: monaco.languages.html.ModeConfiguration) { this._languageId = languageId; this.setOptions(options); + this.setModeConfiguration(modeConfiguration); } get onDidChange(): IEvent { @@ -34,13 +36,22 @@ export class LanguageServiceDefaultsImpl implements monaco.languages.html.Langua return this._options; } + get modeConfiguration(): monaco.languages.html.ModeConfiguration { + return this._modeConfiguration; + } + setOptions(options: monaco.languages.html.Options): void { this._options = options || Object.create(null); this._onDidChange.fire(this); } + + setModeConfiguration(modeConfiguration: monaco.languages.html.ModeConfiguration): void { + this._modeConfiguration = modeConfiguration || Object.create(null); + this._onDidChange.fire(this); + }; } -const formatDefaults: monaco.languages.html.HTMLFormatConfiguration = { +const formatDefaults: Required = { tabSize: 4, insertSpaces: false, wrapLineLength: 120, @@ -55,28 +66,58 @@ const formatDefaults: monaco.languages.html.HTMLFormatConfiguration = { wrapAttributes: 'auto' }; -const htmlOptionsDefault: monaco.languages.html.Options = { +const htmlOptionsDefault: Required = { format: formatDefaults, suggest: { html5: true, angular1: true, ionic: true } } -const handlebarOptionsDefault: monaco.languages.html.Options = { +const handlebarOptionsDefault: Required = { format: formatDefaults, suggest: { html5: true } } -const razorOptionsDefault: monaco.languages.html.Options = { +const razorOptionsDefault: Required = { format: formatDefaults, suggest: { html5: true, razor: true } } +const htmlModeConfigurationDefault: Required = { + completionItems: true, + hovers: true, + documentSymbols: true, + links: true, + documentHighlights: true, + rename: true, + colors: true, + foldingRanges: true, + diagnostics: true, + selectionRanges: true, + documentFormattingEdits: true, + documentRangeFormattingEdits: true +} + +const othersModeConfigurationDefault: Required = { + completionItems: true, + hovers: true, + documentSymbols: true, + links: true, + documentHighlights: true, + rename: true, + colors: true, + foldingRanges: true, + selectionRanges: true, + diagnostics: false, // turned off for Razor and Handlebar + documentFormattingEdits: false, // turned off for Razor and Handlebar + documentRangeFormattingEdits: false // turned off for Razor and Handlebar +} + const htmlLanguageId = 'html'; const handlebarsLanguageId = 'handlebars'; const razorLanguageId = 'razor'; -const htmlDefaults = new LanguageServiceDefaultsImpl(htmlLanguageId, htmlOptionsDefault); -const handlebarDefaults = new LanguageServiceDefaultsImpl(handlebarsLanguageId, handlebarOptionsDefault); -const razorDefaults = new LanguageServiceDefaultsImpl(razorLanguageId, razorOptionsDefault); +const htmlDefaults = new LanguageServiceDefaultsImpl(htmlLanguageId, htmlOptionsDefault, htmlModeConfigurationDefault); +const handlebarDefaults = new LanguageServiceDefaultsImpl(handlebarsLanguageId, handlebarOptionsDefault, othersModeConfigurationDefault); +const razorDefaults = new LanguageServiceDefaultsImpl(razorLanguageId, razorOptionsDefault, othersModeConfigurationDefault); // Export API function createAPI(): typeof monaco.languages.html { diff --git a/src/monaco.d.ts b/src/monaco.d.ts index 7c94f90a..5ddd3520 100644 --- a/src/monaco.d.ts +++ b/src/monaco.d.ts @@ -4,43 +4,106 @@ *--------------------------------------------------------------------------------------------*/ declare module monaco.languages.html { - export interface HTMLFormatConfiguration { - readonly tabSize: number; - readonly insertSpaces: boolean; - readonly wrapLineLength: number; - readonly unformatted: string; - readonly contentUnformatted: string; - readonly indentInnerHtml: boolean; - readonly preserveNewLines: boolean; - readonly maxPreserveNewLines: number; - readonly indentHandlebars: boolean; - readonly endWithNewline: boolean; - readonly extraLiners: string; - readonly wrapAttributes: 'auto' | 'force' | 'force-aligned' | 'force-expand-multiline'; - } - - export interface CompletionConfiguration { - [provider: string]: boolean; - } - - export interface Options { - /** - * If set, comments are tolerated. If set to false, syntax errors will be emitted for comments. - */ - readonly format?: HTMLFormatConfiguration; - /** - * A list of known schemas and/or associations of schemas to file names. - */ - readonly suggest?: CompletionConfiguration; - } - - export interface LanguageServiceDefaults { - readonly onDidChange: IEvent; - readonly options: Options; - setOptions(options: Options): void; - } - - export var htmlDefaults: LanguageServiceDefaults; - export var handlebarDefaults: LanguageServiceDefaults; - export var razorDefaults: LanguageServiceDefaults; + export interface HTMLFormatConfiguration { + readonly tabSize: number; + readonly insertSpaces: boolean; + readonly wrapLineLength: number; + readonly unformatted: string; + readonly contentUnformatted: string; + readonly indentInnerHtml: boolean; + readonly preserveNewLines: boolean; + readonly maxPreserveNewLines: number; + readonly indentHandlebars: boolean; + readonly endWithNewline: boolean; + readonly extraLiners: string; + readonly wrapAttributes: 'auto' | 'force' | 'force-aligned' | 'force-expand-multiline'; + } + + export interface CompletionConfiguration { + [provider: string]: boolean; + } + + export interface Options { + /** + * If set, comments are tolerated. If set to false, syntax errors will be emitted for comments. + */ + readonly format?: HTMLFormatConfiguration; + /** + * A list of known schemas and/or associations of schemas to file names. + */ + readonly suggest?: CompletionConfiguration; + } + + export interface ModeConfiguration { + /** + * Defines whether the built-in completionItemProvider is enabled. + */ + readonly completionItems?: boolean; + + /** + * Defines whether the built-in hoverProvider is enabled. + */ + readonly hovers?: boolean; + + /** + * Defines whether the built-in documentSymbolProvider is enabled. + */ + readonly documentSymbols?: boolean; + + /** + * Defines whether the built-in definitions provider is enabled. + */ + readonly links?: boolean; + + /** + * Defines whether the built-in references provider is enabled. + */ + readonly documentHighlights?: boolean; + + /** + * Defines whether the built-in rename provider is enabled. + */ + readonly rename?: boolean; + + /** + * Defines whether the built-in color provider is enabled. + */ + readonly colors?: boolean; + + /** + * Defines whether the built-in foldingRange provider is enabled. + */ + readonly foldingRanges?: boolean; + + /** + * Defines whether the built-in diagnostic provider is enabled. + */ + readonly diagnostics?: boolean; + + /** + * Defines whether the built-in selection range provider is enabled. + */ + readonly selectionRanges?: boolean; + + /** + * Defines whether the built-in documentFormattingEdit provider is enabled. + */ + readonly documentFormattingEdits?: boolean; + + /** + * Defines whether the built-in documentRangeFormattingEdit provider is enabled. + */ + readonly documentRangeFormattingEdits?: boolean; + + } + + export interface LanguageServiceDefaults { + readonly onDidChange: IEvent; + readonly options: Options; + setOptions(options: Options): void; + } + + export var htmlDefaults: LanguageServiceDefaults; + export var handlebarDefaults: LanguageServiceDefaults; + export var razorDefaults: LanguageServiceDefaults; } \ No newline at end of file