diff --git a/src/package-manager.js b/src/package-manager.js index 7718c8618..0f4484a5b 100644 --- a/src/package-manager.js +++ b/src/package-manager.js @@ -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) diff --git a/src/package.coffee b/src/package.coffee index 556847bc9..fdd89bc74 100644 --- a/src/package.coffee +++ b/src/package.coffee @@ -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