Ensure non-async deactivate is run syncronously without await

This commit is contained in:
Damien Guard
2017-09-08 11:20:23 -07:00
parent 79fbef8e24
commit 524d483610
2 changed files with 29 additions and 12 deletions

View File

@@ -758,7 +758,12 @@ module.exports = class PackageManager {
if (!suppressSerialization && this.isPackageActive(pack.name)) {
this.serializePackage(pack)
}
await pack.deactivate()
const deactivationResult = pack.deactivate()
if (deactivationResult && typeof deactivationResult.then === 'function') {
await deactivationResult;
}
delete this.activePackages[pack.name]
delete this.activatingPackages[pack.name]
this.emitter.emit('did-deactivate-package', pack)

View File

@@ -506,18 +506,30 @@ class Package
@configSchemaRegisteredOnActivate = false
@deactivateResources()
@deactivateKeymaps()
result = Promise.resolve()
if @mainActivated
try
result = Promise.resolve(@mainModule?.deactivate?()).then =>
@mainModule?.deactivateConfig?()
@mainActivated = false
@mainInitialized = false
catch e
console.error "Error deactivating package '#{@name}'", e.stack
result = result.then =>
unless @mainActivated
@emitter.emit 'did-deactivate'
result
return
try
deactivationResult = @mainModule?.deactivate?()
catch e
console.error "Error deactivating package '#{@name}'", e.stack
# We support then-able async promises as well as sync ones from deactivate
if deactivationResult?.then is 'function'
deactivationResult.then => @afterDeactivation()
else
@afterDeactivation()
afterDeactivation: ->
try
@mainModule?.deactivateConfig?()
catch e
console.error "Error deactivating package '#{@name}'", e.stack
@mainActivated = false
@mainInitialized = false
@emitter.emit 'did-deactivate'
deactivateResources: ->
grammar.deactivate() for grammar in @grammars