From 93910201b0d716c2624d9697e75763ba2142a43c Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Sun, 21 Apr 2013 18:28:58 -0600 Subject: [PATCH] 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. --- spec/app/tokenized-buffer-spec.coffee | 20 ++++++++++++++++++++ src/app/language-mode.coffee | 1 + src/app/null-grammar.coffee | 4 ++++ src/app/tokenized-buffer.coffee | 1 + 4 files changed, 26 insertions(+) diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee index 4f7ad41ce..cedf537e3 100644 --- a/spec/app/tokenized-buffer-spec.coffee +++ b/spec/app/tokenized-buffer-spec.coffee @@ -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("
<%= User.find(2).full_name %>
") + tokenizedBuffer = editSession.displayBuffer.tokenizedBuffer + fullyTokenize(tokenizedBuffer) + + {tokens} = tokenizedBuffer.lineForScreenRow(0) + expect(tokens[0]).toEqual value: "
", 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) diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 2ad48459d..95b461fce 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -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: -> diff --git a/src/app/null-grammar.coffee b/src/app/null-grammar.coffee index af9cd3ae8..6dadc599a 100644 --- a/src/app/null-grammar.coffee +++ b/src/app/null-grammar.coffee @@ -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 diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 35d38bff4..70e90b7ac 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -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())