Browse Source

API to register additional HTML services

Martin Aeschlimann 4 năm trước cách đây
mục cha
commit
3e32a8c020
2 tập tin đã thay đổi với 61 bổ sung14 xóa
  1. 19 0
      monaco.d.ts
  2. 42 14
      src/monaco.contribution.ts

+ 19 - 0
monaco.d.ts

@@ -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;
 }
 }

+ 42 - 14
src/monaco.contribution.ts

@@ -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, () => {
-	getMode().then((mode) => mode.setupMode(htmlDefaults));
-});
-languages.onLanguage(handlebarsLanguageId, () => {
-	getMode().then((mode) => mode.setupMode(handlebarDefaults));
-});
-languages.onLanguage(razorLanguageId, () => {
-	getMode().then((mode) => mode.setupMode(razorDefaults));
-});
+export interface LanguageServiceRegistration extends IDisposable {
+	readonly defaults: LanguageServiceDefaults;
+}
+
+/**
+ * Registers a new HTML language service for the languageId.
+ * Note: 'html', 'handlebar' and 'razor' are registered by default.
+ *
+ * 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;
+		}
+	};
+}