From e2e245aca1e0933d6e73139c2f73caab471d4ddd Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 29 Jul 2016 13:40:29 -0700 Subject: [PATCH] Make TextEditorRegistry.setGrammarOverride take a scope name Also, clear the stored grammar score for that editor when setting an override. --- spec/text-editor-registry-spec.js | 46 ++++++++++++++++++++++++------- src/text-editor-registry.js | 11 ++++++-- 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/spec/text-editor-registry-spec.js b/spec/text-editor-registry-spec.js index b4c64db10..a6a648ac0 100644 --- a/spec/text-editor-registry-spec.js +++ b/spec/text-editor-registry-spec.js @@ -84,24 +84,47 @@ describe('TextEditorRegistry', function () { }) }) - describe('.setGrammarOverride and .clearGrammarOverride', function () { - it('sets the editor\'s grammar and does not update it based on other criteria until the override is cleared', async function () { - registry.maintainGrammar(editor) + describe('.setGrammarOverride', function () { + it('sets the editor\'s grammar and does not update it based on other criteria', async function () { await atom.packages.activatePackage('language-c') - expect(editor.getGrammar().name).toBe('Null Grammar') + await atom.packages.activatePackage('language-javascript') - registry.setGrammarOverride(editor, atom.grammars.grammarForScopeName('source.c')) + registry.maintainGrammar(editor) + editor.getBuffer().setPath('file-1.js') + expect(editor.getGrammar().name).toBe('JavaScript') + + registry.setGrammarOverride(editor, 'source.c') + expect(editor.getGrammar().name).toBe('C') + + editor.getBuffer().setPath('file-3.rb') + await atom.packages.activatePackage('language-ruby') expect(editor.getGrammar().name).toBe('C') editor.getBuffer().setPath('file-1.js') - await atom.packages.activatePackage('language-javascript') expect(editor.getGrammar().name).toBe('C') + }) + }) - editor.getBuffer().setPath('file-2.js') + describe('.clearGrammarOverride', function () { + it('resumes setting the grammar based on its path and content', async function () { + await atom.packages.activatePackage('language-c') + await atom.packages.activatePackage('language-javascript') + + registry.maintainGrammar(editor) + editor.getBuffer().setPath('file-1.js') + expect(editor.getGrammar().name).toBe('JavaScript') + + registry.setGrammarOverride(editor, 'source.c') + expect(registry.getGrammarOverride(editor)).toBe('source.c') expect(editor.getGrammar().name).toBe('C') registry.clearGrammarOverride(editor) expect(editor.getGrammar().name).toBe('JavaScript') + + editor.getBuffer().setPath('file-3.rb') + await atom.packages.activatePackage('language-ruby') + expect(editor.getGrammar().name).toBe('Ruby') + expect(registry.getGrammarOverride(editor)).toBe(undefined) }) }) @@ -464,14 +487,17 @@ describe('TextEditorRegistry', function () { registry.maintainGrammar(editor) registry.maintainGrammar(editor2) - registry.setGrammarOverride(editor, atom.grammars.grammarForScopeName('source.c')) - registry.setGrammarOverride(editor2, atom.grammars.grammarForScopeName('source.js')) + registry.setGrammarOverride(editor, 'source.c') + registry.setGrammarOverride(editor2, 'source.js') atom.packages.deactivatePackage('language-javascript') const editorCopy = TextEditor.deserialize(editor.serialize(), atom) const editor2Copy = TextEditor.deserialize(editor2.serialize(), atom) - const registryCopy = TextEditorRegistry.deserialize(registry.serialize(), atom) + const registryCopy = TextEditorRegistry.deserialize( + JSON.parse(JSON.stringify(registry.serialize())), + atom + ) expect(editorCopy.getGrammar().name).toBe('Null Grammar') expect(editor2Copy.getGrammar().name).toBe('Null Grammar') diff --git a/src/text-editor-registry.js b/src/text-editor-registry.js index 825c4c58e..1fb9fccde 100644 --- a/src/text-editor-registry.js +++ b/src/text-editor-registry.js @@ -132,9 +132,14 @@ export default class TextEditorRegistry { })) } - setGrammarOverride (editor, grammar) { - this.editorGrammarOverrides[editor.id] = grammar.scopeName - editor.setGrammar(grammar) + setGrammarOverride (editor, scopeName) { + this.editorGrammarOverrides[editor.id] = scopeName + this.editorGrammarScores.delete(editor) + editor.setGrammar(this.grammarRegistry.grammarForScopeName(scopeName)) + } + + getGrammarOverride (editor) { + return this.editorGrammarOverrides[editor.id] } clearGrammarOverride (editor) {