Ensure grammar activation hooks are called after emitting new editors

This commit is contained in:
hansonw
2018-05-10 18:30:08 -07:00
parent c950a3e89f
commit 1f685768d5
2 changed files with 24 additions and 11 deletions

View File

@@ -1273,21 +1273,29 @@ describe('Workspace', () => {
describe('the grammar-used hook', () => {
it('fires when opening a file or changing the grammar of an open file', async () => {
let resolveJavascriptGrammarUsed, resolveCoffeeScriptGrammarUsed
const javascriptGrammarUsed = new Promise(resolve => { resolveJavascriptGrammarUsed = resolve })
const coffeescriptGrammarUsed = new Promise(resolve => { resolveCoffeeScriptGrammarUsed = resolve })
await atom.packages.activatePackage('language-javascript')
await atom.packages.activatePackage('language-coffee-script')
const observeTextEditorsSpy = jasmine.createSpy('observeTextEditors')
const javascriptGrammarUsed = jasmine.createSpy('javascript')
const coffeeScriptGrammarUsed = jasmine.createSpy('coffeescript')
atom.packages.triggerDeferredActivationHooks()
atom.packages.onDidTriggerActivationHook('language-javascript:grammar-used', resolveJavascriptGrammarUsed)
atom.packages.onDidTriggerActivationHook('language-coffee-script:grammar-used', resolveCoffeeScriptGrammarUsed)
atom.packages.onDidTriggerActivationHook('language-javascript:grammar-used', () => {
atom.workspace.observeTextEditors(observeTextEditorsSpy)
javascriptGrammarUsed()
})
atom.packages.onDidTriggerActivationHook('language-coffee-script:grammar-used', coffeeScriptGrammarUsed)
expect(javascriptGrammarUsed).not.toHaveBeenCalled()
expect(observeTextEditorsSpy).not.toHaveBeenCalled()
const editor = await atom.workspace.open('sample.js', {autoIndent: false})
await atom.packages.activatePackage('language-javascript')
await javascriptGrammarUsed
expect(javascriptGrammarUsed).toHaveBeenCalled()
expect(observeTextEditorsSpy.callCount).toBe(1)
await atom.packages.activatePackage('language-coffee-script')
expect(coffeeScriptGrammarUsed).not.toHaveBeenCalled()
atom.grammars.assignLanguageMode(editor, 'source.coffee')
await coffeescriptGrammarUsed
expect(coffeeScriptGrammarUsed).toHaveBeenCalled()
})
})

View File

@@ -497,14 +497,19 @@ module.exports = class Workspace extends Model {
if (item instanceof TextEditor) {
const subscriptions = new CompositeDisposable(
this.textEditorRegistry.add(item),
this.textEditorRegistry.maintainConfig(item),
item.observeGrammar(this.handleGrammarUsed.bind(this))
this.textEditorRegistry.maintainConfig(item)
)
if (!this.project.findBufferForId(item.buffer.id)) {
this.project.addBuffer(item.buffer)
}
item.onDidDestroy(() => { subscriptions.dispose() })
this.emitter.emit('did-add-text-editor', {textEditor: item, pane, index})
// It's important to call handleGrammarUsed after emitting the did-add event:
// if we activate a package between adding the editor to the registry and emitting
// the package may receive the editor twice from `observeTextEditors`.
subscriptions.add(
item.observeGrammar(this.handleGrammarUsed.bind(this))
)
}
})
}