提交 1744078c 编写于 作者: A Alex Dima

Some cleanup in LanguagesRegistry

上级 e57e0669
...@@ -30,12 +30,21 @@ export const enum LanguageId { ...@@ -30,12 +30,21 @@ export const enum LanguageId {
* @internal * @internal
*/ */
export class LanguageIdentifier { export class LanguageIdentifier {
/**
* A string identifier. Unique across languages. e.g. 'javascript'.
*/
public readonly language: string; public readonly language: string;
/**
* A numeric identifier. Unique across languages. e.g. 5
* Will vary at runtime based on registration order, etc.
*/
public readonly id: LanguageId; public readonly id: LanguageId;
constructor(sid: string, iid: LanguageId) { constructor(language: string, id: LanguageId) {
this.language = sid; this.language = language;
this.id = iid; this.id = id;
} }
} }
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
'use strict'; 'use strict';
import { onUnexpectedError } from 'vs/base/common/errors'; import { onUnexpectedError } from 'vs/base/common/errors';
import Event, { Emitter } from 'vs/base/common/event';
import * as mime from 'vs/base/common/mime'; import * as mime from 'vs/base/common/mime';
import * as strings from 'vs/base/common/strings'; import * as strings from 'vs/base/common/strings';
import { Registry } from 'vs/platform/platform'; import { Registry } from 'vs/platform/platform';
...@@ -18,7 +17,7 @@ import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/co ...@@ -18,7 +17,7 @@ import { IConfigurationRegistry, Extensions } from 'vs/platform/configuration/co
var hasOwnProperty = Object.prototype.hasOwnProperty; var hasOwnProperty = Object.prototype.hasOwnProperty;
export interface IResolvedLanguage { export interface IResolvedLanguage {
id: LanguageId; identifier: LanguageIdentifier;
name: string; name: string;
mimetypes: string[]; mimetypes: string[];
aliases: string[]; aliases: string[];
...@@ -31,22 +30,19 @@ export class LanguagesRegistry { ...@@ -31,22 +30,19 @@ export class LanguagesRegistry {
private _nextLanguageId: number; private _nextLanguageId: number;
private _languages: { [id: string]: IResolvedLanguage; }; private _languages: { [id: string]: IResolvedLanguage; };
private _languageIds: string[];
private mime2LanguageId: { [mimeType: string]: string; }; private _mimeTypesMap: { [mimeType: string]: LanguageIdentifier; };
private name2LanguageId: { [name: string]: string; }; private _nameMap: { [name: string]: LanguageIdentifier; };
private lowerName2Id: { [name: string]: string; }; private _lowercaseNameMap: { [name: string]: LanguageIdentifier; };
private languageIds: string[];
private _onDidAddModes: Emitter<string[]> = new Emitter<string[]>();
public onDidAddModes: Event<string[]> = this._onDidAddModes.event;
constructor(useModesRegistry = true) { constructor(useModesRegistry = true) {
this._nextLanguageId = 1; this._nextLanguageId = 1;
this._languages = {}; this._languages = {};
this.mime2LanguageId = {}; this._mimeTypesMap = {};
this.name2LanguageId = {}; this._nameMap = {};
this.lowerName2Id = {}; this._lowercaseNameMap = {};
this.languageIds = []; this._languageIds = [];
if (useModesRegistry) { if (useModesRegistry) {
this._registerLanguages(ModesRegistry.getLanguages()); this._registerLanguages(ModesRegistry.getLanguages());
...@@ -59,31 +55,28 @@ export class LanguagesRegistry { ...@@ -59,31 +55,28 @@ export class LanguagesRegistry {
return; return;
} }
let addedModes: string[] = [];
for (let i = 0; i < desc.length; i++) { for (let i = 0; i < desc.length; i++) {
this._registerLanguage(desc[i]); this._registerLanguage(desc[i]);
addedModes.push(desc[i].id);
} }
// Rebuild fast path maps // Rebuild fast path maps
this.mime2LanguageId = {}; this._mimeTypesMap = {};
this.name2LanguageId = {}; this._nameMap = {};
this.lowerName2Id = {}; this._lowercaseNameMap = {};
Object.keys(this._languages).forEach((langId) => { Object.keys(this._languages).forEach((langId) => {
let language = this._languages[langId]; let language = this._languages[langId];
if (language.name) { if (language.name) {
this.name2LanguageId[language.name] = langId; this._nameMap[language.name] = language.identifier;
} }
language.aliases.forEach((alias) => { language.aliases.forEach((alias) => {
this.lowerName2Id[alias.toLowerCase()] = langId; this._lowercaseNameMap[alias.toLowerCase()] = language.identifier;
}); });
language.mimetypes.forEach((mimetype) => { language.mimetypes.forEach((mimetype) => {
this.mime2LanguageId[mimetype] = langId; this._mimeTypesMap[mimetype] = language.identifier;
}); });
}); });
Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerOverrideIdentifiers(ModesRegistry.getLanguages().map(language => language.id)); Registry.as<IConfigurationRegistry>(Extensions.Configuration).registerOverrideIdentifiers(ModesRegistry.getLanguages().map(language => language.id));
this._onDidAddModes.fire(addedModes);
} }
private _registerLanguage(lang: ILanguageExtensionPoint): void { private _registerLanguage(lang: ILanguageExtensionPoint): void {
...@@ -95,7 +88,7 @@ export class LanguagesRegistry { ...@@ -95,7 +88,7 @@ export class LanguagesRegistry {
} else { } else {
let languageId = this._nextLanguageId++; let languageId = this._nextLanguageId++;
resolvedLanguage = { resolvedLanguage = {
id: languageId, identifier: new LanguageIdentifier(langId, languageId),
name: null, name: null,
mimetypes: [], mimetypes: [],
aliases: [], aliases: [],
...@@ -103,7 +96,7 @@ export class LanguagesRegistry { ...@@ -103,7 +96,7 @@ export class LanguagesRegistry {
filenames: [], filenames: [],
configurationFiles: [] configurationFiles: []
}; };
this.languageIds[languageId] = langId; this._languageIds[languageId] = langId;
this._languages[langId] = resolvedLanguage; this._languages[langId] = resolvedLanguage;
} }
...@@ -203,7 +196,7 @@ export class LanguagesRegistry { ...@@ -203,7 +196,7 @@ export class LanguagesRegistry {
public isRegisteredMode(mimetypeOrModeId: string): boolean { public isRegisteredMode(mimetypeOrModeId: string): boolean {
// Is this a known mime type ? // Is this a known mime type ?
if (hasOwnProperty.call(this.mime2LanguageId, mimetypeOrModeId)) { if (hasOwnProperty.call(this._mimeTypesMap, mimetypeOrModeId)) {
return true; return true;
} }
// Is this a known mode id ? // Is this a known mode id ?
...@@ -215,7 +208,7 @@ export class LanguagesRegistry { ...@@ -215,7 +208,7 @@ export class LanguagesRegistry {
} }
public getRegisteredLanguageNames(): string[] { public getRegisteredLanguageNames(): string[] {
return Object.keys(this.name2LanguageId); return Object.keys(this._nameMap);
} }
public getLanguageName(modeId: string): string { public getLanguageName(modeId: string): string {
...@@ -226,7 +219,10 @@ export class LanguagesRegistry { ...@@ -226,7 +219,10 @@ export class LanguagesRegistry {
} }
public getModeIdForLanguageNameLowercase(languageNameLower: string): string { public getModeIdForLanguageNameLowercase(languageNameLower: string): string {
return this.lowerName2Id[languageNameLower] || null; if (!hasOwnProperty.call(this._lowercaseNameMap, languageNameLower)) {
return null;
}
return this._lowercaseNameMap[languageNameLower].language;
} }
public getConfigurationFiles(modeId: string): string[] { public getConfigurationFiles(modeId: string): string[] {
...@@ -236,30 +232,28 @@ export class LanguagesRegistry { ...@@ -236,30 +232,28 @@ export class LanguagesRegistry {
return this._languages[modeId].configurationFiles || []; return this._languages[modeId].configurationFiles || [];
} }
public getMimeForMode(theModeId: string): string { public getMimeForMode(modeId: string): string {
let keys = Object.keys(this.mime2LanguageId); if (!hasOwnProperty.call(this._languages, modeId)) {
for (let i = 0, len = keys.length; i < len; i++) { return null;
let _mime = keys[i];
let modeId = this.mime2LanguageId[_mime];
if (modeId === theModeId) {
return _mime;
}
} }
const language = this._languages[modeId];
return null; return (language.mimetypes[0] || null);
} }
public extractModeIds(commaSeparatedMimetypesOrCommaSeparatedIdsOrName: string): string[] { public extractModeIds(commaSeparatedMimetypesOrCommaSeparatedIds: string): string[] {
if (!commaSeparatedMimetypesOrCommaSeparatedIdsOrName) { if (!commaSeparatedMimetypesOrCommaSeparatedIds) {
return []; return [];
} }
return ( return (
commaSeparatedMimetypesOrCommaSeparatedIdsOrName. commaSeparatedMimetypesOrCommaSeparatedIds.
split(','). split(',').
map((mimeTypeOrIdOrName) => mimeTypeOrIdOrName.trim()). map((mimeTypeOrId) => mimeTypeOrId.trim()).
map((mimeTypeOrIdOrName) => { map((mimeTypeOrId) => {
return this.mime2LanguageId[mimeTypeOrIdOrName] || mimeTypeOrIdOrName; if (hasOwnProperty.call(this._mimeTypesMap, mimeTypeOrId)) {
return this._mimeTypesMap[mimeTypeOrId].language;
}
return mimeTypeOrId;
}). }).
filter((modeId) => { filter((modeId) => {
return hasOwnProperty.call(this._languages, modeId); return hasOwnProperty.call(this._languages, modeId);
...@@ -276,7 +270,7 @@ export class LanguagesRegistry { ...@@ -276,7 +270,7 @@ export class LanguagesRegistry {
if (typeof _modeId === 'string') { if (typeof _modeId === 'string') {
modeId = _modeId; modeId = _modeId;
} else { } else {
modeId = this.languageIds[_modeId]; modeId = this._languageIds[_modeId];
if (!modeId) { if (!modeId) {
return null; return null;
} }
...@@ -285,15 +279,15 @@ export class LanguagesRegistry { ...@@ -285,15 +279,15 @@ export class LanguagesRegistry {
if (!hasOwnProperty.call(this._languages, modeId)) { if (!hasOwnProperty.call(this._languages, modeId)) {
return null; return null;
} }
return new LanguageIdentifier(modeId, this._languages[modeId].id); return this._languages[modeId].identifier;
} }
public getModeIdsFromLanguageName(languageName: string): string[] { public getModeIdsFromLanguageName(languageName: string): string[] {
if (!languageName) { if (!languageName) {
return []; return [];
} }
if (hasOwnProperty.call(this.name2LanguageId, languageName)) { if (hasOwnProperty.call(this._nameMap, languageName)) {
return [this.name2LanguageId[languageName]]; return [this._nameMap[languageName].language];
} }
return []; return [];
} }
...@@ -307,24 +301,18 @@ export class LanguagesRegistry { ...@@ -307,24 +301,18 @@ export class LanguagesRegistry {
} }
public getExtensions(languageName: string): string[] { public getExtensions(languageName: string): string[] {
let languageId = this.name2LanguageId[languageName]; if (!hasOwnProperty.call(this._nameMap, languageName)) {
if (!languageId) {
return [];
}
if (!hasOwnProperty.call(this._languages, languageId)) {
return []; return [];
} }
return this._languages[languageId].extensions; const languageId = this._nameMap[languageName];
return this._languages[languageId.language].extensions;
} }
public getFilenames(languageName: string): string[] { public getFilenames(languageName: string): string[] {
let languageId = this.name2LanguageId[languageName]; if (!hasOwnProperty.call(this._nameMap, languageName)) {
if (!languageId) {
return [];
}
if (!hasOwnProperty.call(this._languages, languageId)) {
return []; return [];
} }
return this._languages[languageId].filenames; const languageId = this._nameMap[languageName];
return this._languages[languageId.language].filenames;
} }
} }
...@@ -41,7 +41,6 @@ export interface IValidLanguageExtensionPoint { ...@@ -41,7 +41,6 @@ export interface IValidLanguageExtensionPoint {
export interface IModeService { export interface IModeService {
_serviceBrand: any; _serviceBrand: any;
onDidAddModes: Event<string[]>;
onDidCreateMode: Event<IMode>; onDidCreateMode: Event<IMode>;
// --- reading // --- reading
......
...@@ -77,21 +77,16 @@ export const languagesExtPoint: IExtensionPoint<ILanguageExtensionPoint[]> = Ext ...@@ -77,21 +77,16 @@ export const languagesExtPoint: IExtensionPoint<ILanguageExtensionPoint[]> = Ext
export class ModeServiceImpl implements IModeService { export class ModeServiceImpl implements IModeService {
public _serviceBrand: any; public _serviceBrand: any;
private _instantiatedModes: { [modeId: string]: IMode; }; private readonly _instantiatedModes: { [modeId: string]: IMode; };
private readonly _registry: LanguagesRegistry;
private _registry: LanguagesRegistry; private readonly _onDidCreateMode: Emitter<IMode> = new Emitter<IMode>();
public readonly onDidCreateMode: Event<IMode> = this._onDidCreateMode.event;
private _onDidAddModes: Emitter<string[]> = new Emitter<string[]>();
public onDidAddModes: Event<string[]> = this._onDidAddModes.event;
private _onDidCreateMode: Emitter<IMode> = new Emitter<IMode>();
public onDidCreateMode: Event<IMode> = this._onDidCreateMode.event;
constructor() { constructor() {
this._instantiatedModes = {}; this._instantiatedModes = {};
this._registry = new LanguagesRegistry(); this._registry = new LanguagesRegistry();
this._registry.onDidAddModes((modes) => this._onDidAddModes.fire(modes));
} }
protected _onReady(): TPromise<boolean> { protected _onReady(): TPromise<boolean> {
...@@ -195,7 +190,7 @@ export class ModeServiceImpl implements IModeService { ...@@ -195,7 +190,7 @@ export class ModeServiceImpl implements IModeService {
}).done(null, onUnexpectedError); }).done(null, onUnexpectedError);
return r; return r;
} }
return undefined; return null;
} }
public getOrCreateMode(commaSeparatedMimetypesOrCommaSeparatedIds: string): TPromise<IMode> { public getOrCreateMode(commaSeparatedMimetypesOrCommaSeparatedIds: string): TPromise<IMode> {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册