mirror of
https://github.com/Microsoft/vscode
synced 2024-09-19 10:40:41 +00:00
Make the languages extension point dynamic
This commit is contained in:
parent
c1be67d1b8
commit
aa2b715832
|
@ -18,26 +18,28 @@ export const Extensions = {
|
|||
export class EditorModesRegistry {
|
||||
|
||||
private _languages: ILanguageExtensionPoint[];
|
||||
private _dynamicLanguages: ILanguageExtensionPoint[];
|
||||
|
||||
private readonly _onDidAddLanguages: Emitter<ILanguageExtensionPoint[]> = new Emitter<ILanguageExtensionPoint[]>();
|
||||
public readonly onDidAddLanguages: Event<ILanguageExtensionPoint[]> = this._onDidAddLanguages.event;
|
||||
private readonly _onDidChangeLanguages: Emitter<void> = new Emitter<void>();
|
||||
public readonly onDidChangeLanguages: Event<void> = 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 (<ILanguageExtensionPoint[]>[]).concat(this._languages).concat(this._dynamicLanguages);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -33,36 +33,48 @@ export class LanguagesRegistry extends Disposable {
|
|||
private readonly _onDidChange: Emitter<void> = this._register(new Emitter<void>());
|
||||
public readonly onDidChange: Event<void> = 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;
|
||||
}
|
||||
|
|
|
@ -133,7 +133,7 @@ export class WorkbenchModeServiceImpl extends ModeServiceImpl {
|
|||
}
|
||||
}
|
||||
|
||||
ModesRegistry.registerLanguages(allValidLanguages);
|
||||
ModesRegistry.setDynamicLanguages(allValidLanguages);
|
||||
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in a new issue