From db9b655d49489e0f72c39ce562612be755c7392c Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 11:18:33 -0700 Subject: [PATCH 1/7] Mark which grammars are from bundled packages --- src/package.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/package.coffee b/src/package.coffee index b48ed8014..65c7af822 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -303,6 +303,7 @@ class Package try grammar = atom.grammars.readGrammarSync(grammarPath) grammar.packageName = @name + grammar.bundledPackage = @bundledPackage @grammars.push(grammar) grammar.activate() catch error @@ -322,6 +323,7 @@ class Package atom.notifications.addFatalError("Failed to load a #{@name} package grammar", {stack, detail, dismissable: true}) else grammar.packageName = @name + grammar.bundledPackage = @bundledPackage @grammars.push(grammar) grammar.activate() if @grammarsActivated callback() From 403f7cbc6bbe6e5d567add6fd2bc4bf0f75db73a Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 11:19:08 -0700 Subject: [PATCH 2/7] Favor non bundle packages when breaking ties --- src/grammar-registry.coffee | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/grammar-registry.coffee b/src/grammar-registry.coffee index 568de483a..bccfd4569 100644 --- a/src/grammar-registry.coffee +++ b/src/grammar-registry.coffee @@ -35,7 +35,16 @@ class GrammarRegistry extends FirstMate.GrammarRegistry # * `fileContents` A {String} of text for the file path. # # Returns a {Grammar}, never null. - selectGrammar: (filePath, fileContents) -> super + selectGrammar: (filePath, fileContents) -> + bestMatch = null + highestScore = -Infinity + for grammar in @grammars + score = grammar.getScore(filePath, fileContents) + if score > highestScore + bestMatch = grammar + else if score is highestScore + bestMatch = grammar if bestMatch.bundledPackage and not grammar.bundledPackage + bestMatch clearObservers: -> @off() if includeDeprecatedAPIs From 8b25eb4f0f32a4986422faf073a7bc6c4e026329 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 11:21:27 -0700 Subject: [PATCH 3/7] Guard against missing best match --- src/grammar-registry.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/grammar-registry.coffee b/src/grammar-registry.coffee index bccfd4569..ce08c09ce 100644 --- a/src/grammar-registry.coffee +++ b/src/grammar-registry.coffee @@ -40,10 +40,10 @@ class GrammarRegistry extends FirstMate.GrammarRegistry highestScore = -Infinity for grammar in @grammars score = grammar.getScore(filePath, fileContents) - if score > highestScore + if score > highestScore or not bestMatch? bestMatch = grammar - else if score is highestScore - bestMatch = grammar if bestMatch.bundledPackage and not grammar.bundledPackage + else if score is highestScore and bestMatch?.bundledPackage + bestMatch = grammar unless grammar.bundledPackage bestMatch clearObservers: -> From 84c4ee4c79ac0da95b6cc3e2fafdba03d15314ea Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 11:24:14 -0700 Subject: [PATCH 4/7] atom.syntax -> atom.grammars --- spec/{syntax-spec.coffee => grammars-spec.coffee} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spec/{syntax-spec.coffee => grammars-spec.coffee} (99%) diff --git a/spec/syntax-spec.coffee b/spec/grammars-spec.coffee similarity index 99% rename from spec/syntax-spec.coffee rename to spec/grammars-spec.coffee index ecc0c0406..975fc3ea9 100644 --- a/spec/syntax-spec.coffee +++ b/spec/grammars-spec.coffee @@ -2,7 +2,7 @@ path = require 'path' fs = require 'fs-plus' temp = require 'temp' -describe "the `syntax` global", -> +describe "the `grammars` global", -> beforeEach -> waitsForPromise -> atom.packages.activatePackage('language-text') From 4378255ab67b367a6a982da858474e73c43ed4d8 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 11:24:34 -0700 Subject: [PATCH 5/7] syntax2 -> grammars2 --- spec/grammars-spec.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/grammars-spec.coffee b/spec/grammars-spec.coffee index 975fc3ea9..92807a32e 100644 --- a/spec/grammars-spec.coffee +++ b/spec/grammars-spec.coffee @@ -25,9 +25,9 @@ describe "the `grammars` global", -> filePath = '/foo/bar/file.js' expect(atom.grammars.selectGrammar(filePath).name).not.toBe 'Ruby' atom.grammars.setGrammarOverrideForPath(filePath, 'source.ruby') - syntax2 = atom.deserializers.deserialize(atom.grammars.serialize()) - syntax2.addGrammar(grammar) for grammar in atom.grammars.grammars when grammar isnt atom.grammars.nullGrammar - expect(syntax2.selectGrammar(filePath).name).toBe 'Ruby' + grammars2 = atom.deserializers.deserialize(atom.grammars.serialize()) + grammars2.addGrammar(grammar) for grammar in atom.grammars.grammars when grammar isnt atom.grammars.nullGrammar + expect(grammars2.selectGrammar(filePath).name).toBe 'Ruby' describe ".selectGrammar(filePath)", -> it "can use the filePath to load the correct grammar based on the grammar's filetype", -> From 00505188fa53e4d8b81e97cda5ba7ca3c63bb593 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 13:49:02 -0700 Subject: [PATCH 6/7] Add spec for grammar score tie-breaking --- .../package-with-rb-filetype/grammars/rb.cson | 11 +++++++++++ .../packages/package-with-rb-filetype/package.json | 4 ++++ spec/grammars-spec.coffee | 10 ++++++++++ src/grammar-registry.coffee | 1 + 4 files changed, 26 insertions(+) create mode 100644 spec/fixtures/packages/package-with-rb-filetype/grammars/rb.cson create mode 100644 spec/fixtures/packages/package-with-rb-filetype/package.json diff --git a/spec/fixtures/packages/package-with-rb-filetype/grammars/rb.cson b/spec/fixtures/packages/package-with-rb-filetype/grammars/rb.cson new file mode 100644 index 000000000..8b4d85412 --- /dev/null +++ b/spec/fixtures/packages/package-with-rb-filetype/grammars/rb.cson @@ -0,0 +1,11 @@ +'name': 'Test Ruby' +'scopeName': 'test.rb' +'fileTypes': [ + 'rb' +] +'patterns': [ + { + 'match': 'ruby' + 'name': 'meta.class.ruby' + } +] diff --git a/spec/fixtures/packages/package-with-rb-filetype/package.json b/spec/fixtures/packages/package-with-rb-filetype/package.json new file mode 100644 index 000000000..350967dc5 --- /dev/null +++ b/spec/fixtures/packages/package-with-rb-filetype/package.json @@ -0,0 +1,4 @@ +{ + "name": "package-with-rb-filetype", + "version": "1.0.0" +} diff --git a/spec/grammars-spec.coffee b/spec/grammars-spec.coffee index 92807a32e..52c7ea16c 100644 --- a/spec/grammars-spec.coffee +++ b/spec/grammars-spec.coffee @@ -94,6 +94,16 @@ describe "the `grammars` global", -> grammar2 = atom.grammars.loadGrammarSync(grammarPath2) expect(atom.grammars.selectGrammar('more.test', '')).toBe grammar2 + it "favors non-bundled packages when breaking scoring ties", -> + waitsForPromise -> + atom.packages.activatePackage(path.join(__dirname, 'fixtures', 'packages', 'package-with-rb-filetype')) + + runs -> + atom.grammars.grammarForScopeName('source.ruby').bundledPackage = true + atom.grammars.grammarForScopeName('test.rb').bundledPackage = false + + expect(atom.grammars.selectGrammar('test.rb').scopeName).toBe 'test.rb' + describe "when there is no file path", -> it "does not throw an exception (regression)", -> expect(-> atom.grammars.selectGrammar(null, '#!/usr/bin/ruby')).not.toThrow() diff --git a/src/grammar-registry.coffee b/src/grammar-registry.coffee index ce08c09ce..7b1ef823f 100644 --- a/src/grammar-registry.coffee +++ b/src/grammar-registry.coffee @@ -42,6 +42,7 @@ class GrammarRegistry extends FirstMate.GrammarRegistry score = grammar.getScore(filePath, fileContents) if score > highestScore or not bestMatch? bestMatch = grammar + highestScore = score else if score is highestScore and bestMatch?.bundledPackage bestMatch = grammar unless grammar.bundledPackage bestMatch From 33ac25479b443559f4cf695ae5b3a9233a4362d7 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 18 May 2015 15:39:57 -0700 Subject: [PATCH 7/7] :art: Correct indentation --- spec/grammars-spec.coffee | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/spec/grammars-spec.coffee b/spec/grammars-spec.coffee index 52c7ea16c..cc975468f 100644 --- a/spec/grammars-spec.coffee +++ b/spec/grammars-spec.coffee @@ -95,14 +95,14 @@ describe "the `grammars` global", -> expect(atom.grammars.selectGrammar('more.test', '')).toBe grammar2 it "favors non-bundled packages when breaking scoring ties", -> - waitsForPromise -> - atom.packages.activatePackage(path.join(__dirname, 'fixtures', 'packages', 'package-with-rb-filetype')) + waitsForPromise -> + atom.packages.activatePackage(path.join(__dirname, 'fixtures', 'packages', 'package-with-rb-filetype')) - runs -> - atom.grammars.grammarForScopeName('source.ruby').bundledPackage = true - atom.grammars.grammarForScopeName('test.rb').bundledPackage = false + runs -> + atom.grammars.grammarForScopeName('source.ruby').bundledPackage = true + atom.grammars.grammarForScopeName('test.rb').bundledPackage = false - expect(atom.grammars.selectGrammar('test.rb').scopeName).toBe 'test.rb' + expect(atom.grammars.selectGrammar('test.rb').scopeName).toBe 'test.rb' describe "when there is no file path", -> it "does not throw an exception (regression)", ->