Re-tokenize buffer when its grammar is updated

This can happen if a grammar that the grammar includes is added or
removed from the syntax global.
This commit is contained in:
Nathan Sobo
2013-04-21 18:28:58 -06:00
parent 9204836d70
commit 93910201b0
4 changed files with 26 additions and 0 deletions

View File

@@ -328,6 +328,26 @@ describe "TokenizedBuffer", ->
expect(tokenizedBuffer.lineForScreenRow(2).text).toBe "#{tabAsSpaces} buy()#{tabAsSpaces}while supply > demand"
describe "when the language mode emits a 'grammar-updated' event based on an included grammar being activated", ->
it "retokenizes the buffer", ->
atom.activatePackage('ruby.tmbundle', sync: true)
atom.activatePackage('ruby-on-rails-tmbundle', sync: true)
editSession = project.buildEditSession()
editSession.setVisible(true)
editSession.setGrammar(syntax.selectGrammar('test.erb'))
editSession.buffer.setText("<div class='name'><%= User.find(2).full_name %></div>")
tokenizedBuffer = editSession.displayBuffer.tokenizedBuffer
fullyTokenize(tokenizedBuffer)
{tokens} = tokenizedBuffer.lineForScreenRow(0)
expect(tokens[0]).toEqual value: "<div class='name'>", scopes: ["text.html.ruby"]
atom.activatePackage('html.tmbundle', sync: true)
fullyTokenize(tokenizedBuffer)
{tokens} = tokenizedBuffer.lineForScreenRow(0)
expect(tokens[0]).toEqual value: '<', scopes: ["text.html.ruby","meta.tag.block.any.html","punctuation.definition.tag.begin.html"]
describe "when a Git commit message file is tokenized", ->
beforeEach ->
atom.activatePackage('git.tmbundle', sync: true)

View File

@@ -34,6 +34,7 @@ class LanguageMode
return if grammar is @grammar
@grammar = grammar
@currentGrammarScore = score ? grammar.getScore(@buffer.getPath(), @buffer.getText())
@subscribe @grammar, 'grammar-updated', => @trigger 'grammar-updated'
@trigger 'grammar-changed', grammar
reloadGrammar: ->

View File

@@ -1,4 +1,6 @@
Token = require 'token'
EventEmitter = require 'event-emitter'
_ = require 'underscore'
###
# Internal #
@@ -14,3 +16,5 @@ class NullGrammar
{ tokens: [new Token(value: line, scopes: ['null-grammar.text.plain'])] }
grammarAddedOrRemoved: -> # no op
_.extend NullGrammar.prototype, EventEmitter

View File

@@ -28,6 +28,7 @@ class TokenizedBuffer
@resetScreenLines()
@buffer.on "changed.tokenized-buffer#{@id}", (e) => @handleBufferChange(e)
@languageMode.on 'grammar-changed', => @resetScreenLines()
@languageMode.on 'grammar-updated', => @resetScreenLines()
resetScreenLines: ->
@screenLines = @buildPlaceholderScreenLinesForRows(0, @buffer.getLastRow())