From 8db49fc08dcddaabaa804d5e7a839e0927c2828e Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Tue, 15 Dec 2015 17:20:01 +0100 Subject: [PATCH 1/6] :white_check_mark: Document existing behavior --- spec/tokenized-buffer-spec.coffee | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index 76314681c..e617c7956 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -38,6 +38,21 @@ describe "TokenizedBuffer", -> expect(tokenizedBufferB.buffer).toBe(tokenizedBufferA.buffer) + it "does not serialize / deserialize the current grammar", -> + buffer = atom.project.bufferForPathSync('sample.js') + tokenizedBufferA = new TokenizedBuffer({ + buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert + }) + autoSelectedGrammar = tokenizedBufferA.grammar + + tokenizedBufferA.setGrammar(atom.grammars.grammarForScopeName('source.coffee')) + tokenizedBufferB = TokenizedBuffer.deserialize( + JSON.parse(JSON.stringify(tokenizedBufferA.serialize())), + atom + ) + + expect(tokenizedBufferB.grammar).toBe(autoSelectedGrammar) + describe "when the underlying buffer has no path", -> it "deserializes it searching among the buffers in the current project", -> buffer = atom.project.bufferForPathSync(null) From 19ff676c7bbcf2bf65ce4209340ece0c2ae3b943 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Wed, 16 Dec 2015 10:35:23 +0100 Subject: [PATCH 2/6] Serialize grammar for untitled buffers --- spec/tokenized-buffer-spec.coffee | 45 ++++++++++++++++++++++++++++--- src/tokenized-buffer.coffee | 30 ++++++++++++++------- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/spec/tokenized-buffer-spec.coffee b/spec/tokenized-buffer-spec.coffee index e617c7956..9c53b3c07 100644 --- a/spec/tokenized-buffer-spec.coffee +++ b/spec/tokenized-buffer-spec.coffee @@ -26,8 +26,13 @@ describe "TokenizedBuffer", -> describe "serialization", -> describe "when the underlying buffer has a path", -> - it "deserializes it searching among the buffers in the current project", -> + beforeEach -> buffer = atom.project.bufferForPathSync('sample.js') + + waitsForPromise -> + atom.packages.activatePackage('language-coffee-script') + + it "deserializes it searching among the buffers in the current project", -> tokenizedBufferA = new TokenizedBuffer({ buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert }) @@ -39,7 +44,6 @@ describe "TokenizedBuffer", -> expect(tokenizedBufferB.buffer).toBe(tokenizedBufferA.buffer) it "does not serialize / deserialize the current grammar", -> - buffer = atom.project.bufferForPathSync('sample.js') tokenizedBufferA = new TokenizedBuffer({ buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert }) @@ -51,12 +55,13 @@ describe "TokenizedBuffer", -> atom ) - expect(tokenizedBufferB.grammar).toBe(autoSelectedGrammar) + expect(tokenizedBufferB.grammar).toBe(atom.grammars.grammarForScopeName('source.js')) describe "when the underlying buffer has no path", -> - it "deserializes it searching among the buffers in the current project", -> + beforeEach -> buffer = atom.project.bufferForPathSync(null) + it "deserializes it searching among the buffers in the current project", -> tokenizedBufferA = new TokenizedBuffer({ buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert }) @@ -67,6 +72,38 @@ describe "TokenizedBuffer", -> expect(tokenizedBufferB.buffer).toBe(tokenizedBufferA.buffer) + it "deserializes the previously selected grammar as soon as it's added when not available in the grammar registry", -> + tokenizedBufferA = new TokenizedBuffer({ + buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert + }) + + tokenizedBufferA.setGrammar(atom.grammars.grammarForScopeName("source.js")) + atom.grammars.removeGrammarForScopeName(tokenizedBufferA.grammar.scopeName) + tokenizedBufferB = TokenizedBuffer.deserialize( + JSON.parse(JSON.stringify(tokenizedBufferA.serialize())), + atom + ) + + expect(tokenizedBufferB.grammar).not.toBeFalsy() + expect(tokenizedBufferB.grammar).not.toBe(tokenizedBufferA.grammar) + + atom.grammars.addGrammar(tokenizedBufferA.grammar) + + expect(tokenizedBufferB.grammar).toBe(tokenizedBufferA.grammar) + + it "deserializes the previously selected grammar on construction when available in the grammar registry", -> + tokenizedBufferA = new TokenizedBuffer({ + buffer, config: atom.config, grammarRegistry: atom.grammars, packageManager: atom.packages, assert: atom.assert + }) + + tokenizedBufferA.setGrammar(atom.grammars.grammarForScopeName("source.js")) + tokenizedBufferB = TokenizedBuffer.deserialize( + JSON.parse(JSON.stringify(tokenizedBufferA.serialize())), + atom + ) + + expect(tokenizedBufferB.grammar).toBe(tokenizedBufferA.grammar) + describe "when the buffer is destroyed", -> beforeEach -> buffer = atom.project.bufferForPathSync('sample.js') diff --git a/src/tokenized-buffer.coffee b/src/tokenized-buffer.coffee index cdafc2869..0fdf4eea8 100644 --- a/src/tokenized-buffer.coffee +++ b/src/tokenized-buffer.coffee @@ -36,7 +36,7 @@ class TokenizedBuffer extends Model constructor: (params) -> { @buffer, @tabLength, @ignoreInvisibles, @largeFileMode, @config, - @grammarRegistry, @packageManager, @assert + @grammarRegistry, @packageManager, @assert, grammarScopeName } = params @emitter = new Emitter @@ -49,18 +49,26 @@ class TokenizedBuffer extends Model @disposables.add @buffer.preemptDidChange (e) => @handleBufferChange(e) @disposables.add @buffer.onDidChangePath (@bufferPath) => @reloadGrammar() - @reloadGrammar() + if grammar = @grammarRegistry.grammarForScopeName(grammarScopeName) + @setGrammar(grammar) + else + @reloadGrammar() + @grammarToRestoreScopeName = grammarScopeName destroyed: -> @disposables.dispose() serialize: -> - deserializer: 'TokenizedBuffer' - bufferPath: @buffer.getPath() - bufferId: @buffer.getId() - tabLength: @tabLength - ignoreInvisibles: @ignoreInvisibles - largeFileMode: @largeFileMode + state = { + deserializer: 'TokenizedBuffer' + bufferPath: @buffer.getPath() + bufferId: @buffer.getId() + tabLength: @tabLength + ignoreInvisibles: @ignoreInvisibles + largeFileMode: @largeFileMode + } + state.grammarScopeName = @grammar?.scopeName unless @buffer.getPath() + state observeGrammar: (callback) -> callback(@grammar) @@ -76,7 +84,9 @@ class TokenizedBuffer extends Model @emitter.on 'did-tokenize', callback grammarAddedOrUpdated: (grammar) => - if grammar.injectionSelector? + if @grammarToRestoreScopeName is grammar.scopeName + @setGrammar(grammar) + else if grammar.injectionSelector? @retokenizeLines() if @hasTokenForSelector(grammar.injectionSelector) else newScore = @grammarRegistry.getGrammarScore(grammar, @buffer.getPath(), @getGrammarSelectionContent()) @@ -89,6 +99,8 @@ class TokenizedBuffer extends Model @rootScopeDescriptor = new ScopeDescriptor(scopes: [@grammar.scopeName]) @currentGrammarScore = score ? @grammarRegistry.getGrammarScore(grammar, @buffer.getPath(), @getGrammarSelectionContent()) + @grammarToRestoreScopeName = null + @grammarUpdateDisposable?.dispose() @grammarUpdateDisposable = @grammar.onDidUpdate => @retokenizeLines() @disposables.add(@grammarUpdateDisposable) From 78fc3863ef4f81c1c6545525e1c324d84094e077 Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 18 Dec 2015 15:08:48 -0700 Subject: [PATCH 3/6] 1.4.0-beta3 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6e1a1390a..2fe3417fd 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "atom", "productName": "Atom", - "version": "1.4.0-beta2", + "version": "1.4.0-beta3", "description": "A hackable text editor for the 21st Century.", "main": "./src/browser/main.js", "repository": { From 385721af60d898854d15bcad37e1b587a3145cac Mon Sep 17 00:00:00 2001 From: Nathan Sobo Date: Fri, 18 Dec 2015 15:09:25 -0700 Subject: [PATCH 4/6] :arrow_up: autocomplete-plus to default to fuzzaldrin-plus --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2fe3417fd..2ca0fc751 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "autocomplete-atom-api": "0.9.2", "autocomplete-css": "0.11.0", "autocomplete-html": "0.7.2", - "autocomplete-plus": "2.24.0", + "autocomplete-plus": "2.25.0", "autocomplete-snippets": "1.9.0", "autoflow": "0.26.0", "autosave": "0.23.0", From 6a1f311f394070acfdd35d1e932981973c9de949 Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Fri, 18 Dec 2015 17:18:19 -0500 Subject: [PATCH 5/6] :arrow_up: markdown-preview@0.157.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42e21a673..f06588f68 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "keybinding-resolver": "0.33.0", "line-ending-selector": "0.3.0", "link": "0.31.0", - "markdown-preview": "0.157.0", + "markdown-preview": "0.157.1", "metrics": "0.53.1", "notifications": "0.62.1", "open-on-github": "0.40.0", From 86d5ca6f9b6b6db3ffe4a255ede13fa1e5c14cb2 Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Sat, 19 Dec 2015 12:28:02 -0500 Subject: [PATCH 6/6] :arrow_up: language-clojure@0.19.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f06588f68..8e058ae67 100644 --- a/package.json +++ b/package.json @@ -117,7 +117,7 @@ "whitespace": "0.32.1", "wrap-guide": "0.38.1", "language-c": "0.51.1", - "language-clojure": "0.19.0", + "language-clojure": "0.19.1", "language-coffee-script": "0.46.0", "language-csharp": "0.11.0", "language-css": "0.36.0",