From aa2b71583226aebb1813ad6087ff4256000204c5 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Thu, 13 Dec 2018 13:21:42 +0100 Subject: [PATCH] Make the languages extension point dynamic --- src/vs/editor/common/modes/modesRegistry.ts | 16 +++--- .../common/services/languagesRegistry.ts | 55 +++++++++++++------ .../mode/common/workbenchModeService.ts | 2 +- 3 files changed, 49 insertions(+), 24 deletions(-) diff --git a/src/vs/editor/common/modes/modesRegistry.ts b/src/vs/editor/common/modes/modesRegistry.ts index 7755048e858..a91dfa7887a 100644 --- a/src/vs/editor/common/modes/modesRegistry.ts +++ b/src/vs/editor/common/modes/modesRegistry.ts @@ -18,26 +18,28 @@ export const Extensions = { export class EditorModesRegistry { private _languages: ILanguageExtensionPoint[]; + private _dynamicLanguages: ILanguageExtensionPoint[]; - private readonly _onDidAddLanguages: Emitter = new Emitter(); - public readonly onDidAddLanguages: Event = this._onDidAddLanguages.event; + private readonly _onDidChangeLanguages: Emitter = new Emitter(); + public readonly onDidChangeLanguages: Event = this._onDidChangeLanguages.event; constructor() { this._languages = []; + this._dynamicLanguages = []; } // --- languages public registerLanguage(def: ILanguageExtensionPoint): void { this._languages.push(def); - this._onDidAddLanguages.fire([def]); + this._onDidChangeLanguages.fire(void 0); } - public registerLanguages(def: ILanguageExtensionPoint[]): void { - this._languages = this._languages.concat(def); - this._onDidAddLanguages.fire(def); + public setDynamicLanguages(def: ILanguageExtensionPoint[]): void { + this._dynamicLanguages = def; + this._onDidChangeLanguages.fire(void 0); } public getLanguages(): ILanguageExtensionPoint[] { - return this._languages.slice(0); + return ([]).concat(this._languages).concat(this._dynamicLanguages); } } diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index 436c59f6a01..98da2d0bbfa 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -33,36 +33,48 @@ export class LanguagesRegistry extends Disposable { private readonly _onDidChange: Emitter = this._register(new Emitter()); public readonly onDidChange: Event = this._onDidChange.event; - private _nextLanguageId: number; - private _languages: { [id: string]: IResolvedLanguage; }; - private _languageIds: string[]; + private readonly _warnOnOverwrite: boolean; + + private _nextLanguageId2: number; + private _languageIdToLanguage: string[]; + private _languageToLanguageId: { [id: string]: number; }; + private _languages: { [id: string]: IResolvedLanguage; }; private _mimeTypesMap: { [mimeType: string]: LanguageIdentifier; }; private _nameMap: { [name: string]: LanguageIdentifier; }; private _lowercaseNameMap: { [name: string]: LanguageIdentifier; }; - private _warnOnOverwrite: boolean; - constructor(useModesRegistry = true, warnOnOverwrite = false) { super(); - this._nextLanguageId = 1; + + this._warnOnOverwrite = warnOnOverwrite; + + this._nextLanguageId2 = 1; + this._languageIdToLanguage = []; + this._languageToLanguageId = Object.create(null); + this._languages = {}; this._mimeTypesMap = {}; this._nameMap = {}; this._lowercaseNameMap = {}; - this._languageIds = []; - this._warnOnOverwrite = warnOnOverwrite; if (useModesRegistry) { - this._registerLanguages(ModesRegistry.getLanguages()); - this._register(ModesRegistry.onDidAddLanguages((m) => this._registerLanguages(m))); + this._initializeFromRegistry(); + this._register(ModesRegistry.onDidChangeLanguages((m) => this._initializeFromRegistry())); } } + private _initializeFromRegistry(): void { + this._languages = {}; + this._mimeTypesMap = {}; + this._nameMap = {}; + this._lowercaseNameMap = {}; + + const desc = ModesRegistry.getLanguages(); + this._registerLanguages(desc); + } + _registerLanguages(desc: ILanguageExtensionPoint[]): void { - if (desc.length === 0) { - return; - } for (let i = 0; i < desc.length; i++) { this._registerLanguage(desc[i]); @@ -90,6 +102,18 @@ export class LanguagesRegistry extends Disposable { this._onDidChange.fire(); } + private _getLanguageId(language: string): number { + if (this._languageToLanguageId[language]) { + return this._languageToLanguageId[language]; + } + + const languageId = this._nextLanguageId2++; + this._languageIdToLanguage[languageId] = language; + this._languageToLanguageId[language] = languageId; + + return languageId; + } + private _registerLanguage(lang: ILanguageExtensionPoint): void { const langId = lang.id; @@ -97,7 +121,7 @@ export class LanguagesRegistry extends Disposable { if (hasOwnProperty.call(this._languages, langId)) { resolvedLanguage = this._languages[langId]; } else { - let languageId = this._nextLanguageId++; + const languageId = this._getLanguageId(langId); resolvedLanguage = { identifier: new LanguageIdentifier(langId, languageId), name: null, @@ -107,7 +131,6 @@ export class LanguagesRegistry extends Disposable { filenames: [], configurationFiles: [] }; - this._languageIds[languageId] = langId; this._languages[langId] = resolvedLanguage; } @@ -278,7 +301,7 @@ export class LanguagesRegistry extends Disposable { if (typeof _modeId === 'string') { modeId = _modeId; } else { - modeId = this._languageIds[_modeId]; + modeId = this._languageIdToLanguage[_modeId]; if (!modeId) { return null; } diff --git a/src/vs/workbench/services/mode/common/workbenchModeService.ts b/src/vs/workbench/services/mode/common/workbenchModeService.ts index 7e9140e69c9..14e01bb84e6 100644 --- a/src/vs/workbench/services/mode/common/workbenchModeService.ts +++ b/src/vs/workbench/services/mode/common/workbenchModeService.ts @@ -133,7 +133,7 @@ export class WorkbenchModeServiceImpl extends ModeServiceImpl { } } - ModesRegistry.registerLanguages(allValidLanguages); + ModesRegistry.setDynamicLanguages(allValidLanguages); }); -- GitLab