From 63083daa04614b67b10c86ede754099b5d4b26c8 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 25 Apr 2018 10:17:58 -0700 Subject: [PATCH] .dispose() all the disposables - Reloading the package (e.g. with https://github.com/cakecatz/atom-hot-package-loader) would cause all of the commands to fire N times, once for each reload - This applies `CompositeDisposable` on all `.on*` and `.add*` calls to properly dispose all disposables and fix that leakage --- lib/file-view.coffee | 11 ++++++----- lib/main.coffee | 20 +++++++++----------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/file-view.coffee b/lib/file-view.coffee index 0a4dcb3..7425398 100644 --- a/lib/file-view.coffee +++ b/lib/file-view.coffee @@ -1,3 +1,4 @@ +{CompositeDisposable} = require 'atom' {$$} = require 'atom-space-pen-views' SymbolsView = require './symbols-view' @@ -6,16 +7,16 @@ class FileView extends SymbolsView initialize: -> super - @editorsSubscription = atom.workspace.observeTextEditors (editor) => - disposable = editor.onDidSave => + @disposables = new CompositeDisposable() + + @disposables.add atom.workspace.observeTextEditors (editor) => + @disposables.add editor.onDidSave => f = editor.getPath() return unless atom.project.contains(f) @ctagsCache.generateTags(f, true) - editor.onDidDestroy -> disposable.dispose() - destroy: -> - @editorsSubscription.dispose() + @disposables.dispose() super viewForItem: ({lineNumber, name, file, pattern}) -> diff --git a/lib/main.coffee b/lib/main.coffee index c963f32..b0a72dd 100644 --- a/lib/main.coffee +++ b/lib/main.coffee @@ -3,7 +3,7 @@ $ = null MouseEventWhichDict = {"left click": 1, "middle click": 2, "right click": 3} module.exports = - disposable: null + disposables: new CompositeDisposable() config: disableComplete: @@ -50,10 +50,10 @@ module.exports = @ctagsCache.activate() @ctagsCache.initTags(atom.project.getPaths(), atom.config.get('atom-ctags.autoBuildTagsWhenActive')) - @disposable = atom.project.onDidChangePaths (paths)=> + @disposables.add atom.project.onDidChangePaths (paths)=> @ctagsCache.initTags(paths, atom.config.get('atom-ctags.autoBuildTagsWhenActive')) - atom.commands.add 'atom-workspace', 'atom-ctags:rebuild', (e, cmdArgs)=> + @disposables.add atom.commands.add 'atom-workspace', 'atom-ctags:rebuild', (e, cmdArgs)=> console.error "rebuild: ", e @ctagsCache.cmdArgs = cmdArgs if Array.isArray(cmdArgs) @createFileView().rebuild(true) @@ -61,15 +61,15 @@ module.exports = clearTimeout(t) t = null - atom.commands.add 'atom-workspace', 'atom-ctags:toggle-project-symbols', => + @disposables.add atom.commands.add 'atom-workspace', 'atom-ctags:toggle-project-symbols', => @createFileView().toggleAll() - atom.commands.add 'atom-text-editor', + @disposables.add atom.commands.add 'atom-text-editor', 'atom-ctags:toggle-file-symbols': => @createFileView().toggle() 'atom-ctags:go-to-declaration': => @createFileView().goto() 'atom-ctags:return-from-declaration': => @createGoBackView().toggle() - atom.workspace.observeTextEditors (editor) => + @disposables.add atom.workspace.observeTextEditors (editor) => editorView = atom.views.getView(editor) {$} = require 'atom-space-pen-views' unless $ $(editorView).on 'mousedown', (event) => @@ -85,12 +85,12 @@ module.exports = atom-ctags replaces and enhances the symbols-view package. Therefore, symbols-view has been disabled." - atom.config.observe 'atom-ctags.disableComplete', => + @disposables.add atom.config.observe 'atom-ctags.disableComplete', => return unless @provider @provider.disabled = atom.config.get('atom-ctags.disableComplete') initExtraTagsTime = null - atom.config.observe 'atom-ctags.extraTagFiles', => + @disposables.add atom.config.observe 'atom-ctags.extraTagFiles', => clearTimeout initExtraTagsTime if initExtraTagsTime initExtraTagsTime = setTimeout((=> @ctagsCache.initExtraTags(atom.config.get('atom-ctags.extraTagFiles').split(" ")) @@ -98,9 +98,6 @@ module.exports = ), 1000) deactivate: -> - if @disposable? - @disposable.dispose() - @disposable = null if @fileView? @fileView.destroy() @@ -119,6 +116,7 @@ module.exports = @goBackView = null @ctagsCache.deactivate() + @disposables.dispose() createFileView: -> unless @fileView?