From 131708ba3732451a9fa5ca8b109b623e6c03cf62 Mon Sep 17 00:00:00 2001 From: Corey Johnson & Kevin Sawicki Date: Tue, 8 Jan 2013 15:24:14 -0800 Subject: [PATCH] Serialize grammar overrides for paths --- spec/app/project-spec.coffee | 9 +++++++++ src/app/language-mode.coffee | 5 ++++- src/app/project.coffee | 18 ++++++++++++++---- src/app/root-view.coffee | 16 +++++++++++----- 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index 9b8b7312c..09549eb98 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -1,5 +1,6 @@ Project = require 'project' fs = require 'fs' +_ = require 'underscore' describe "Project", -> project = null @@ -250,3 +251,11 @@ describe "Project", -> path: project.resolve('a') match: 'aa' range: [[1, 3], [1, 5]] + + describe "serialization", -> + it "restores the project path and grammar overrides", -> + jsGrammar = _.find syntax.grammars, (grammar) -> grammar.name is 'JavaScript' + project.addGrammarOverrideForPath('/a/b.txt', jsGrammar) + newProject = Project.deserialize(project.serialize()) + expect(newProject.getPath()).toBe project.getPath() + expect(newProject.grammarOverrideForPath('/a/b.txt')).toBe jsGrammar diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 08f68a228..8c6e21b89 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -48,7 +48,10 @@ class LanguageMode false reloadGrammar: -> - @grammar = rootView.project.grammarForFilePath(@buffer.getPath()) + if @buffer.project? + @grammar = @buffer.project.grammarForFilePath(@buffer.getPath()) + else + @grammar = syntax.grammarForFilePath(@buffer.getPath()) isQuote: (string) -> /'|"/.test(string) diff --git a/src/app/project.coffee b/src/app/project.coffee index b538692f6..1bbb56ceb 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -11,6 +11,10 @@ Git = require 'git' module.exports = class Project + + @deserialize: (state) -> + new Project(state.path, state.grammarOverridesByPath) + tabLength: 2 autoIndent: true softTabs: true @@ -18,13 +22,17 @@ class Project rootDirectory: null editSessions: null ignoredPathRegexes: null - grammarOverridesByPath: {} + grammarOverridesByPath: null - constructor: (path) -> + constructor: (path, @grammarOverridesByPath={}) -> @setPath(path) @editSessions = [] @buffers = [] + serialize: -> + path: @getPath() + grammarOverridesByPath: @grammarOverridesByPath + destroy: -> editSession.destroy() for editSession in @getEditSessions() @@ -34,9 +42,11 @@ class Project removeGrammarOverrideForPath: (path) -> delete @grammarOverridesByPath[path] + grammarOverrideForPath: (path) -> + syntax.grammarForScopeName(@grammarOverridesByPath[path]) + grammarForFilePath: (path) -> - grammar = syntax.grammarForScopeName(@grammarOverridesByPath[path]) if path - grammar or syntax.grammarForFilePath(path) + @grammarOverrideForPath(path) or syntax.grammarForFilePath(path) getPath: -> @rootDirectory?.path diff --git a/src/app/root-view.coffee b/src/app/root-view.coffee index dd9f9a3b9..5adee2902 100644 --- a/src/app/root-view.coffee +++ b/src/app/root-view.coffee @@ -23,8 +23,9 @@ class RootView extends View @div id: 'vertical', outlet: 'vertical', => @div id: 'panes', outlet: 'panes' - @deserialize: ({ projectPath, panesViewState, packageStates }) -> - rootView = new RootView(projectPath, packageStates: packageStates, suppressOpen: true) + @deserialize: ({ projectState, panesViewState, packageStates }) -> + project = Project.deserialize(projectState) if projectState + rootView = new RootView(project, packageStates: packageStates, suppressOpen: true) rootView.setRootPane(rootView.deserializeView(panesViewState)) if panesViewState rootView @@ -32,11 +33,16 @@ class RootView extends View packageStates: null title: null - initialize: (pathToOpen, { @packageStates, suppressOpen } = {}) -> + initialize: (projectOrPathToOpen, { @packageStates, suppressOpen } = {}) -> window.rootView = this @packageStates ?= {} @packageModules = {} - @project = new Project(pathToOpen) + + if not projectOrPathToOpen or _.isString(projectOrPathToOpen) + pathToOpen = projectOrPathToOpen + @project = new Project(projectOrPathToOpen) + else + @project = projectOrPathToOpen config.load() @@ -48,7 +54,7 @@ class RootView extends View @open() serialize: -> - projectPath: @project?.getPath() + projectState: @project?.serialize() panesViewState: @panes.children().view()?.serialize() packageStates: @serializePackages()