From 7ef87cb6c4806cc5bc01887a2691cf98d4995f55 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Tue, 23 Apr 2013 10:08:15 -0700 Subject: [PATCH] Load scoped properties asynchronously --- src/app/text-mate-package.coffee | 69 ++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index f576befdb..9bb664dad 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -29,6 +29,7 @@ class TextMatePackage extends Package load: ({sync}={}) -> if sync @loadGrammarsSync() + @loadScopedPropertiesSync() else TextMatePackage.getLoadQueue().push(this) @@ -45,10 +46,14 @@ class TextMatePackage extends Package loadGrammars: (done) -> fsUtils.isDirectoryAsync @syntaxesPath, (isDirectory) => - return unless isDirectory + return done() unless isDirectory + + fsUtils.listAsync @syntaxesPath, @legalGrammarExtensions, (error, paths) => + if error? + console.log("Error loading grammars of TextMate package '#{@path}':", error.stack, error) + done() + return - fsUtils.listAsync @syntaxesPath, @legalGrammarExtensions, (err, paths) => - return console.log("Error loading grammars of TextMate package '#{@path}':", err.stack, err) if err async.waterfall [ (next) => async.eachSeries paths, @loadGrammarAtPath, next @@ -64,7 +69,7 @@ class TextMatePackage extends Package done() loadGrammarsSync: -> - for path in fsUtils.list(@syntaxesPath, @legalGrammarExtensions) ? [] + for path in fsUtils.list(@syntaxesPath, @legalGrammarExtensions) @addGrammar(TextMateGrammar.loadSync(path)) addGrammar: (grammar) -> @@ -73,30 +78,60 @@ class TextMatePackage extends Package getGrammars: -> @grammars - loadScopedProperties: -> + loadScopedPropertiesSync: -> for grammar in @getGrammars() if properties = @propertiesFromTextMateSettings(grammar) selector = syntax.cssSelectorFromScopeSelector(grammar.scopeName) @scopedProperties.push({selector, properties}) - for {scope, settings} in @getTextMatePreferenceObjects() + for path in fsUtils.list(@preferencesPath) + {scope, settings} = fsUtils.readObject(path) if properties = @propertiesFromTextMateSettings(settings) selector = syntax.cssSelectorFromScopeSelector(scope) if scope? @scopedProperties.push({selector, properties}) - if atom.isPackageActive(@path) - for { selector, properties } in @scopedProperties - syntax.addProperties(@path, selector, properties) + for {selector, properties} in @scopedProperties + syntax.addProperties(@path, selector, properties) + + loadScopedProperties: -> + scopedProperties = [] + + for grammar in @getGrammars() + if properties = @propertiesFromTextMateSettings(grammar) + selector = syntax.cssSelectorFromScopeSelector(grammar.scopeName) + scopedProperties.push({selector, properties}) - getTextMatePreferenceObjects: -> preferenceObjects = [] - if fsUtils.exists(@preferencesPath) - for preferencePath in fsUtils.list(@preferencesPath) - try - preferenceObjects.push(fsUtils.readObject(preferencePath)) - catch e - console.warn "Failed to parse preference at path '#{preferencePath}'", e.stack - preferenceObjects + done = => + for {scope, settings} in preferenceObjects + if properties = @propertiesFromTextMateSettings(settings) + selector = syntax.cssSelectorFromScopeSelector(scope) if scope? + scopedProperties.push({selector, properties}) + + @scopedProperties = scopedProperties + if atom.isPackageActive(@path) + for { selector, properties } in @scopedProperties + syntax.addProperties(@path, selector, properties) + @loadTextMatePreferenceObjects(preferenceObjects, done) + + loadTextMatePreferenceObjects: (preferenceObjects, done) -> + fsUtils.isDirectoryAsync @preferencesPath, (isDirectory) => + return done() unless isDirectory + + fsUtils.listAsync @preferencesPath, (error, paths) => + if error? + console.log("Error loading preferences of TextMate package '#{@path}':", error.stack, error) + done() + return + + loadPreferencesAtPath = (path, done) -> + fsUtils.readObjectAsync path, (error, preferences) => + if error? + console.warn("Failed to parse preference at path '#{path}'", error.stack, error) + else + preferenceObjects.push(preferences) + done() + async.eachSeries paths, loadPreferencesAtPath, done propertiesFromTextMateSettings: (textMateSettings) -> if textMateSettings.shellVariables