diff --git a/spec/project-spec.coffee b/spec/project-spec.coffee index 8e54c8860..2b9b96bba 100644 --- a/spec/project-spec.coffee +++ b/spec/project-spec.coffee @@ -8,6 +8,13 @@ describe "Project", -> beforeEach -> project.setPath(project.resolve('dir')) + describe "serialization", -> + it "destroys unretained buffers and does not include them in the serialized state", -> + project.bufferForPath('a') + expect(project.getBuffers().length).toBe 1 + expect(deserialize(project.serialize()).getBuffers().length).toBe 0 + expect(project.getBuffers().length).toBe 0 + describe "when an edit session is destroyed", -> it "removes edit session and calls destroy on buffer (if buffer is not referenced by other edit sessions)", -> editSession = project.open("a") diff --git a/src/project.coffee b/src/project.coffee index d1a4be979..f66bfe964 100644 --- a/src/project.coffee +++ b/src/project.coffee @@ -91,9 +91,14 @@ class Project serialize: -> state = @state.clone() state.set('path', @getPath()) + @destroyUnretainedBuffers() state.set('buffers', buffer.serialize() for buffer in @getBuffers()) state + # Private: + destroyUnretainedBuffers: -> + buffer.destroy() for buffer in @getBuffers() when not buffer.isRetained() + # Public: ? getState: -> @state diff --git a/src/text-buffer.coffee b/src/text-buffer.coffee index b2bb2807f..f206e2746 100644 --- a/src/text-buffer.coffee +++ b/src/text-buffer.coffee @@ -81,13 +81,15 @@ class TextBuffer @destroyed = true @project?.removeBuffer(this) + isRetained: -> @refcount > 0 + retain: -> @refcount++ this release: -> @refcount-- - @destroy() if @refcount <= 0 + @destroy() unless @isRetained() this serialize: ->