Browse Source

fix leaked OpenedFile after creation of ViewContent fails, causes exceptions some later actions, see:

http://community.sharpdevelop.net/forums/t/15625.aspx
pull/6/merge
Siegfried Pammer 14 years ago
parent
commit
c580b21697
  1. 3
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
  2. 6
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs
  3. 16
      src/Main/Base/Project/Src/Services/File/FileService.cs
  4. 27
      src/Main/Base/Project/Src/Services/File/OpenedFile.cs

3
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs

@ -275,7 +275,8 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -275,7 +275,8 @@ namespace ICSharpCode.AvalonEdit.AddIn
{
if (trackedFeature != null)
trackedFeature.EndTracking();
this.PrimaryFile.IsDirtyChanged -= PrimaryFile_IsDirtyChanged;
if (PrimaryFile != null)
this.PrimaryFile.IsDirtyChanged -= PrimaryFile_IsDirtyChanged;
base.Dispose();
BookmarksDetach();
codeEditor.Dispose();

6
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/DefaultChangeWatcher.cs

@ -197,8 +197,10 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -197,8 +197,10 @@ namespace ICSharpCode.AvalonEdit.AddIn
if (!disposed) {
if (watcher != null)
watcher.Dispose();
this.textDocument.LineTrackers.Remove(this);
this.textDocument.UndoStack.PropertyChanged -= UndoStackPropertyChanged;
if (this.textDocument != null) {
this.textDocument.LineTrackers.Remove(this);
this.textDocument.UndoStack.PropertyChanged -= UndoStackPropertyChanged;
}
disposed = true;
}
}

16
src/Main/Base/Project/Src/Services/File/FileService.cs

@ -161,7 +161,8 @@ namespace ICSharpCode.SharpDevelop @@ -161,7 +161,8 @@ namespace ICSharpCode.SharpDevelop
/// <summary>Called by OpenedFile.UnregisterView to update the dictionary.</summary>
internal static void OpenedFileClosed(OpenedFile file)
{
if (openedFileDict[file.FileName] != file)
OpenedFile existing;
if (openedFileDict.TryGetValue(file.FileName, out existing) && existing != file)
throw new ArgumentException("file must be registered");
openedFileDict.Remove(file.FileName);
@ -217,12 +218,15 @@ namespace ICSharpCode.SharpDevelop @@ -217,12 +218,15 @@ namespace ICSharpCode.SharpDevelop
public void Invoke(string fileName)
{
OpenedFile file = FileService.GetOrCreateOpenedFile(FileName.Create(fileName));
IViewContent newContent = binding.CreateContentForFile(file);
if (newContent != null) {
DisplayBindingService.AttachSubWindows(newContent, false);
WorkbenchSingleton.Workbench.ShowView(newContent, switchToOpenedView);
try {
IViewContent newContent = binding.CreateContentForFile(file);
if (newContent != null) {
DisplayBindingService.AttachSubWindows(newContent, false);
WorkbenchSingleton.Workbench.ShowView(newContent, switchToOpenedView);
}
} finally {
file.CloseIfAllViewsClosed();
}
file.CloseIfAllViewsClosed();
}
}

27
src/Main/Base/Project/Src/Services/File/OpenedFile.cs

@ -123,19 +123,24 @@ namespace ICSharpCode.SharpDevelop @@ -123,19 +123,24 @@ namespace ICSharpCode.SharpDevelop
if (view == null)
throw new ArgumentNullException("view");
if (currentView != view) {
if (currentView == null) {
SwitchedToView(view);
} else {
try {
inLoadOperation = true;
using (Stream sourceStream = OpenRead()) {
view.Load(this, sourceStream);
try {
if (currentView != view) {
if (currentView == null) {
SwitchedToView(view);
} else {
try {
inLoadOperation = true;
using (Stream sourceStream = OpenRead()) {
view.Load(this, sourceStream);
}
} finally {
inLoadOperation = false;
}
} finally {
inLoadOperation = false;
}
}
} catch (Exception) {
view.Dispose();
throw;
}
}
@ -276,8 +281,6 @@ namespace ICSharpCode.SharpDevelop @@ -276,8 +281,6 @@ namespace ICSharpCode.SharpDevelop
currentView = newView;
return;
}
}
if (currentView != null) {
SaveCurrentView();
}
try {

Loading…
Cancel
Save