From 9cc8c5248d0b9e20be115248ba91e65ada7f355f Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 13 Mar 2013 22:18:37 +0100 Subject: [PATCH] Fix various crashes reported by UDC. --- .../Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs | 4 +++- .../SharpRefactoring/Project/Src/MethodExtractorBase.cs | 2 ++ .../Doozer/ProjectContentRegistryDescriptor.cs | 7 ++++++- .../RefactoringService/ContextActions/EditorContext.cs | 2 ++ .../ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs | 9 +++++++-- 5 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs index fba190a87f..9427ce46d4 100644 --- a/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs +++ b/src/AddIns/BackendBindings/AspNet.Mvc/Project/Src/WebProjectOptions/WebProjectOptionsPanel.xaml.cs @@ -176,7 +176,9 @@ namespace ICSharpCode.AspNet.Mvc void PortTextBox_KeyUp(object sender, KeyEventArgs e) { - properties.DevelopmentServerPort = Int32.Parse(PortTextBox.Text); + int port; + if (int.TryParse(PortTextBox.Text, out port)) + properties.DevelopmentServerPort = port; properties.IISUrl = String.Format(@"{0}:{1}/", WebBehavior.LocalHost, PortTextBox.Text); } } diff --git a/src/AddIns/Misc/SharpRefactoring/Project/Src/MethodExtractorBase.cs b/src/AddIns/Misc/SharpRefactoring/Project/Src/MethodExtractorBase.cs index e72a644c8b..273300d805 100644 --- a/src/AddIns/Misc/SharpRefactoring/Project/Src/MethodExtractorBase.cs +++ b/src/AddIns/Misc/SharpRefactoring/Project/Src/MethodExtractorBase.cs @@ -137,6 +137,8 @@ namespace SharpRefactoring protected bool IsInCurrentSelection(Location location) { + if (location.IsEmpty) + return false; return IsInCurrentSelection(textEditor.Document.PositionToOffset(location.Line, location.Column)); } diff --git a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs index ae95624d0f..259f25897a 100644 --- a/src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs +++ b/src/Main/Base/Project/Src/Services/ParserService/Doozer/ProjectContentRegistryDescriptor.cs @@ -34,7 +34,12 @@ namespace ICSharpCode.SharpDevelop // aren't used with project content registries, and this code // will be removed in SD5. #pragma warning disable 618 - return codon.GetFailedAction(project) == ConditionFailedAction.Nothing; + try { + return codon.GetFailedAction(project) == ConditionFailedAction.Nothing; + } catch (ObjectDisposedException) { + // This method may be used on a background thread, so there's a chance that the project got disposed. + return false; + } } public ProjectContentRegistryDescriptor(Codon codon) diff --git a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs index b96b6d51d3..de76bb66a4 100644 --- a/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs +++ b/src/Main/Base/Project/Src/Services/RefactoringService/ContextActions/EditorContext.cs @@ -105,6 +105,8 @@ namespace ICSharpCode.SharpDevelop.Refactoring public ResolveResult ResolveExpression(Expression expression) { + if (expression.EndLocation.IsEmpty) + return null; ExpressionResult expr = GetExpressionAt(this.Editor, expression.EndLocation.Line, expression.EndLocation.Column); return ResolveExpression(expr, this.Editor, expression.EndLocation.Line, expression.EndLocation.Column); } diff --git a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs index b36d7bf292..e0a0f0c890 100644 --- a/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs +++ b/src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/XmlDoc.cs @@ -68,8 +68,13 @@ namespace ICSharpCode.SharpDevelop.Dom public string GetDocumentation(string key) { - if (xmlDescription == null) - throw new ObjectDisposedException("XmlDoc"); + if (xmlDescription == null) { + //throw new ObjectDisposedException("XmlDoc"); + // Sometimes SD accesses a project content after it is disposed. + // Not sure why, but we can avoid the crash by just returning null. + // SD5 fixes the issue by making IProjectContent immutable (no Dispose() method) + return null; + } lock (xmlDescription) { string result; if (xmlDescription.TryGetValue(key, out result))