From bd4cc42daf95e3a0dfc8829eae111560eddad29a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 22 Nov 2017 09:35:39 -0800 Subject: [PATCH] Set the visible state on newly-assigned language modes --- spec/text-editor-spec.js | 32 +++++++++++++++++++++----------- src/text-editor.js | 2 ++ 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/spec/text-editor-spec.js b/spec/text-editor-spec.js index 2f7e25f76..c0bd53f16 100644 --- a/spec/text-editor-spec.js +++ b/spec/text-editor-spec.js @@ -7,6 +7,7 @@ const dedent = require('dedent') const clipboard = require('../src/safe-clipboard') const TextEditor = require('../src/text-editor') const TextBuffer = require('text-buffer') +const TokenizedBuffer = require('../src/tokenized-buffer') describe('TextEditor', () => { let buffer, editor, lineLengths @@ -5605,21 +5606,30 @@ describe('TextEditor', () => { }) }) - describe('when a better-matched grammar is added to syntax', () => { - it('switches to the better-matched grammar and re-tokenizes the buffer', async () => { - editor.destroy() + describe('when the buffer\'s language mode changes', () => { + it('notifies onDidTokenize observers when retokenization is finished', async () => { + // Exercise the full `tokenizeInBackground` code path, which bails out early if + // `.setVisible` has not been called with `true`. + jasmine.unspy(TokenizedBuffer.prototype, 'tokenizeInBackground') + jasmine.attachToDOM(editor.getElement()) - const jsGrammar = atom.grammars.selectGrammar('a.js') - atom.grammars.removeGrammar(jsGrammar) + const events = [] + editor.onDidTokenize(event => events.push(event)) - editor = await atom.workspace.open('sample.js', {autoIndent: false}) + await atom.packages.activatePackage('language-c') + expect(atom.grammars.assignLanguageMode(editor.getBuffer(), 'c')).toBe(true) + advanceClock(1) + expect(events.length).toBe(1) + }) - expect(editor.getGrammar()).toBe(atom.grammars.nullGrammar) - expect(editor.tokensForScreenRow(0).length).toBe(1) + it('notifies onDidChangeGrammar observers', async () => { + const events = [] + editor.onDidChangeGrammar(grammar => events.push(grammar)) - atom.grammars.addGrammar(jsGrammar) - expect(editor.getGrammar()).toBe(jsGrammar) - expect(editor.tokensForScreenRow(0).length).toBeGreaterThan(1) + await atom.packages.activatePackage('language-c') + expect(atom.grammars.assignLanguageMode(editor.getBuffer(), 'c')).toBe(true) + expect(events.length).toBe(1) + expect(events[0].name).toBe('C') }) }) diff --git a/src/text-editor.js b/src/text-editor.js index 8905cf5fc..bbd75d749 100644 --- a/src/text-editor.js +++ b/src/text-editor.js @@ -4129,6 +4129,8 @@ class TextEditor { this.disposables.remove(this.languageModeSubscription) } const languageMode = this.buffer.getLanguageMode() + + if (languageMode.setVisible) languageMode.setVisible(this.component && this.component.visible) this.languageModeSubscription = languageMode.onDidTokenize && languageMode.onDidTokenize(() => { this.emitter.emit('did-tokenize') })