Merge pull request #14 from microsoft/aeschli/languageservice

API to register additional HTML services
pull/2748/head
Martin Aeschlimann 4 years ago committed by GitHub
commit e3f8dd8f34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

19
monaco.d.ts vendored

@ -89,8 +89,27 @@ declare namespace monaco.languages.html {
readonly onDidChange: IEvent<LanguageServiceDefaults>; readonly onDidChange: IEvent<LanguageServiceDefaults>;
readonly options: Options; readonly options: Options;
setOptions(options: Options): void; setOptions(options: Options): void;
setModeConfiguration(modeConfiguration: ModeConfiguration): void;
} }
export const htmlLanguageService: LanguageServiceRegistration;
export const htmlDefaults: LanguageServiceDefaults; export const htmlDefaults: LanguageServiceDefaults;
export const handlebarLanguageService: LanguageServiceRegistration;
export const handlebarDefaults: LanguageServiceDefaults; export const handlebarDefaults: LanguageServiceDefaults;
export const razorLanguageService: LanguageServiceRegistration;
export const razorDefaults: LanguageServiceDefaults; export const razorDefaults: LanguageServiceDefaults;
export interface LanguageServiceRegistration extends IDisposable {
readonly defaults: LanguageServiceDefaults;
}
/**
* Registers a new HTML language service for the languageId.
* Note: 'html', 'handlebar' and 'razor' registered by default.
*
* Use this method only to register additional language ids with a HTML service.
* The language server has to be registered before an editor model is opened.
*/
export function registerHTMLLanguageService(
languageId: string,
options: Options,
modeConfiguration: ModeConfiguration
): LanguageServiceRegistration;
} }

@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import * as mode from './htmlMode'; import * as mode from './htmlMode';
import { languages, Emitter, IEvent } from './fillers/monaco-editor-core'; import { languages, Emitter, IEvent, IDisposable } from './fillers/monaco-editor-core';
export interface HTMLFormatConfiguration { export interface HTMLFormatConfiguration {
readonly tabSize: number; readonly tabSize: number;
@ -104,8 +104,8 @@ export interface LanguageServiceDefaults {
readonly onDidChange: IEvent<LanguageServiceDefaults>; readonly onDidChange: IEvent<LanguageServiceDefaults>;
readonly options: Options; readonly options: Options;
setOptions(options: Options): void; setOptions(options: Options): void;
setModeConfiguration(modeConfiguration: ModeConfiguration): void;
} }
// --- HTML configuration and defaults --------- // --- HTML configuration and defaults ---------
class LanguageServiceDefaultsImpl implements LanguageServiceDefaults { class LanguageServiceDefaultsImpl implements LanguageServiceDefaults {
@ -199,21 +199,26 @@ const htmlLanguageId = 'html';
const handlebarsLanguageId = 'handlebars'; const handlebarsLanguageId = 'handlebars';
const razorLanguageId = 'razor'; const razorLanguageId = 'razor';
export const htmlDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsImpl( export const htmlLanguageService = registerHTMLLanguageService(
htmlLanguageId, htmlLanguageId,
htmlOptionsDefault, htmlOptionsDefault,
getConfigurationDefault(htmlLanguageId) getConfigurationDefault(htmlLanguageId)
); );
export const handlebarDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsImpl( export const htmlDefaults = htmlLanguageService.defaults;
export const handlebarLanguageService = registerHTMLLanguageService(
handlebarsLanguageId, handlebarsLanguageId,
handlebarOptionsDefault, handlebarOptionsDefault,
getConfigurationDefault(handlebarsLanguageId) getConfigurationDefault(handlebarsLanguageId)
); );
export const razorDefaults: LanguageServiceDefaults = new LanguageServiceDefaultsImpl( export const handlebarDefaults = handlebarLanguageService.defaults;
export const razorLanguageService = registerHTMLLanguageService(
razorLanguageId, razorLanguageId,
razorOptionsDefault, razorOptionsDefault,
getConfigurationDefault(razorLanguageId) getConfigurationDefault(razorLanguageId)
); );
export const razorDefaults = razorLanguageService.defaults;
// export to the global based API // export to the global based API
(<any>languages).html = { htmlDefaults, razorDefaults, handlebarDefaults }; (<any>languages).html = { htmlDefaults, razorDefaults, handlebarDefaults };
@ -224,12 +229,35 @@ function getMode(): Promise<typeof mode> {
return import('./htmlMode'); return import('./htmlMode');
} }
languages.onLanguage(htmlLanguageId, () => { export interface LanguageServiceRegistration extends IDisposable {
getMode().then((mode) => mode.setupMode(htmlDefaults)); readonly defaults: LanguageServiceDefaults;
}); }
languages.onLanguage(handlebarsLanguageId, () => {
getMode().then((mode) => mode.setupMode(handlebarDefaults)); /**
}); * Registers a new HTML language service for the languageId.
languages.onLanguage(razorLanguageId, () => { * Note: 'html', 'handlebar' and 'razor' are registered by default.
getMode().then((mode) => mode.setupMode(razorDefaults)); *
}); * Use this method to register additional language ids with a HTML service.
* The language server has to be registered before an editor model is opened.
*/
export function registerHTMLLanguageService(
languageId: string,
options: Options,
modeConfiguration: ModeConfiguration
): LanguageServiceRegistration {
const defaults = new LanguageServiceDefaultsImpl(languageId, options, modeConfiguration);
let mode: IDisposable | undefined;
// delay the initalization of the mode until the language is accessed the first time
const onLanguageListener = languages.onLanguage(languageId, async () => {
mode = (await getMode()).setupMode(defaults);
});
return {
defaults,
dispose() {
onLanguageListener.dispose();
mode?.dispose();
mode = undefined;
}
};
}

Loading…
Cancel
Save