提交 aa2b7158 编写于 作者: A Alex Dima

Make the languages extension point dynamic

上级 c1be67d1
......@@ -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);
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册