diff --git a/src/vs/editor/common/services/languagesRegistry.ts b/src/vs/editor/common/services/languagesRegistry.ts index 3275621b978..c734735a733 100644 --- a/src/vs/editor/common/services/languagesRegistry.ts +++ b/src/vs/editor/common/services/languagesRegistry.ts @@ -153,9 +153,14 @@ export class LanguagesRegistry extends Disposable { } if (Array.isArray(lang.extensions)) { + if (lang.configuration) { + // insert first as this appears to be the 'primary' language definition + resolvedLanguage.extensions = lang.extensions.concat(resolvedLanguage.extensions); + } else { + resolvedLanguage.extensions = resolvedLanguage.extensions.concat(lang.extensions); + } for (let extension of lang.extensions) { mime.registerTextMime({ id: langId, mime: primaryMime, extension: extension }, this._warnOnOverwrite); - resolvedLanguage.extensions.push(extension); } } diff --git a/src/vs/editor/test/common/services/languagesRegistry.test.ts b/src/vs/editor/test/common/services/languagesRegistry.test.ts index 45c3ba17966..09ef74cd000 100644 --- a/src/vs/editor/test/common/services/languagesRegistry.test.ts +++ b/src/vs/editor/test/common/services/languagesRegistry.test.ts @@ -221,6 +221,32 @@ suite('LanguagesRegistry', () => { assert.deepEqual(registry.getExtensions('aName'), ['aExt', 'aExt2']); }); + test('extensions of primary language registration come first', () => { + let registry = new LanguagesRegistry(false); + + registry._registerLanguages([{ + id: 'a', + extensions: ['aExt3'] + }]); + + assert.deepEqual(registry.getExtensions('a')[0], 'aExt3'); + + registry._registerLanguages([{ + id: 'a', + configuration: URI.file('conf.json'), + extensions: ['aExt'] + }]); + + assert.deepEqual(registry.getExtensions('a')[0], 'aExt'); + + registry._registerLanguages([{ + id: 'a', + extensions: ['aExt2'] + }]); + + assert.deepEqual(registry.getExtensions('a')[0], 'aExt'); + }); + test('filenames', () => { let registry = new LanguagesRegistry(false);