From f2a7b38c6c48493082eff85a9d4acba8cd5d14ef Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 16 Jul 2009 21:04:30 +0000 Subject: [PATCH] Fixed potential ArgumentNullException in search (forum-9109, though I couldn't reproduce it). git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0@4457 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../SearchAndReplace/Project/Engine/Search.cs | 48 ++++++++++--------- .../Engine/SearchReplaceInFilesManager.cs | 6 +-- .../Project/Engine/SearchReplaceManager.cs | 22 ++++----- .../Project/Engine/SearchReplaceUtilities.cs | 6 ++- 4 files changed, 45 insertions(+), 37 deletions(-) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs index a1e0f0eecd..e50ad827d6 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs @@ -93,17 +93,19 @@ namespace SearchAndReplace if (info != null && textIterator != null && documentIterator.CurrentFileName != null) { ProvidedDocumentInformation currentInfo = documentIterator.Current; - if (!info.Equals(currentInfo)) { // create new iterator, if document changed - info = currentInfo; - textIterator = textIteratorBuilder.BuildTextIterator(info); - } else { // old document -> initialize iterator position to caret pos - textIterator.Position = info.CurrentOffset; - } - - SearchResultMatch result = CreateNamedSearchResult(searchStrategy.FindNext(textIterator)); - if (result != null) { - info.CurrentOffset = textIterator.Position; - return result; + if (currentInfo != null) { + if (!info.Equals(currentInfo)) { // create new iterator, if document changed + info = currentInfo; + textIterator = textIteratorBuilder.BuildTextIterator(info); + } else { // old document -> initialize iterator position to caret pos + textIterator.Position = info.CurrentOffset; + } + + SearchResultMatch result = CreateNamedSearchResult(searchStrategy.FindNext(textIterator)); + if (result != null) { + info.CurrentOffset = textIterator.Position; + return result; + } } } @@ -126,17 +128,19 @@ namespace SearchAndReplace { if (info != null && textIterator != null && documentIterator.CurrentFileName != null) { ProvidedDocumentInformation currentInfo = documentIterator.Current; - if (!info.Equals(currentInfo)) { // create new iterator, if document changed - info = currentInfo; - textIterator = textIteratorBuilder.BuildTextIterator(info); - } else { // old document -> initialize iterator position to caret pos - textIterator.Position = info.CurrentOffset; - } - - SearchResultMatch result = CreateNamedSearchResult(searchStrategy.FindNext(textIterator, offset, length)); - if (result != null) { - info.CurrentOffset = textIterator.Position; - return result; + if (currentInfo != null) { + if (!info.Equals(currentInfo)) { // create new iterator, if document changed + info = currentInfo; + textIterator = textIteratorBuilder.BuildTextIterator(info); + } else { // old document -> initialize iterator position to caret pos + textIterator.Position = info.CurrentOffset; + } + + SearchResultMatch result = CreateNamedSearchResult(searchStrategy.FindNext(textIterator, offset, length)); + if (result != null) { + info.CurrentOffset = textIterator.Position; + return result; + } } } diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs index fe79f09a35..731f1644c0 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs @@ -24,15 +24,15 @@ namespace SearchAndReplace find.TextIteratorBuilder = new ForwardTextIteratorBuilder(); } - static void SetSearchOptions() + static void SetSearchOptions(IProgressMonitor monitor) { find.SearchStrategy = SearchReplaceUtilities.CreateSearchStrategy(SearchOptions.SearchStrategyType); - find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType); + find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType, monitor); } static bool InitializeSearchInFiles(IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); find.Reset(); if (!find.SearchStrategy.CompilePattern(monitor)) diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs index daf014d8e6..a1014bfd05 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs @@ -22,22 +22,22 @@ namespace SearchAndReplace { public static SearchAndReplaceDialog SearchAndReplaceDialog = null; - static Search find = new Search(); + static Search find = new Search(); static SearchReplaceManager() { find.TextIteratorBuilder = new ForwardTextIteratorBuilder(); } - static void SetSearchOptions() + static void SetSearchOptions(IProgressMonitor monitor) { find.SearchStrategy = SearchReplaceUtilities.CreateSearchStrategy(SearchOptions.SearchStrategyType); - find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType); + find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType, monitor); } public static void Replace(IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); if (lastResult != null && WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) { ITextEditorControlProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorControlProvider; if (provider != null) { @@ -66,7 +66,7 @@ namespace SearchAndReplace public static void ReplaceFirstInSelection(int offset, int length, IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); FindFirstInSelection(offset, length, monitor); } @@ -100,7 +100,7 @@ namespace SearchAndReplace public static void MarkAll(IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); ClearSelection(); find.Reset(); if (!find.SearchStrategy.CompilePattern(monitor)) @@ -125,7 +125,7 @@ namespace SearchAndReplace public static void MarkAll(int offset, int length, IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); find.Reset(); if (!find.SearchStrategy.CompilePattern(monitor)) @@ -189,7 +189,7 @@ namespace SearchAndReplace public static void ReplaceAll(IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); ClearSelection(); find.Reset(); if (!find.SearchStrategy.CompilePattern(monitor)) @@ -237,7 +237,7 @@ namespace SearchAndReplace public static void ReplaceAll(int offset, int length, IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); find.Reset(); if (!find.SearchStrategy.CompilePattern(monitor)) @@ -268,7 +268,7 @@ namespace SearchAndReplace public static void FindNext(IProgressMonitor monitor) { - SetSearchOptions(); + SetSearchOptions(monitor); if (find == null || SearchOptions.FindPattern == null || SearchOptions.FindPattern.Length == 0) { @@ -312,7 +312,7 @@ namespace SearchAndReplace { foundAtLeastOneItem = false; textSelection = null; - SetSearchOptions(); + SetSearchOptions(monitor); if (find == null || SearchOptions.FindPattern == null || diff --git a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs index 8d8d52b30f..97842398ec 100644 --- a/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs +++ b/src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs @@ -56,7 +56,7 @@ namespace SearchAndReplace } } - public static IDocumentIterator CreateDocumentIterator(DocumentIteratorType type) + public static IDocumentIterator CreateDocumentIterator(DocumentIteratorType type, IProgressMonitor monitor) { switch (type) { case DocumentIteratorType.CurrentDocument: @@ -65,11 +65,15 @@ namespace SearchAndReplace case DocumentIteratorType.Directory: try { if (!Directory.Exists(SearchOptions.LookIn)) { + if (monitor != null) monitor.ShowingDialog = true; MessageService.ShowMessageFormatted("${res:Dialog.NewProject.SearchReplace.SearchStringNotFound.Title}", "${res:Dialog.NewProject.SearchReplace.LookIn.DirectoryNotFound}", FileUtility.NormalizePath(SearchOptions.LookIn)); + if (monitor != null) monitor.ShowingDialog = false; return new DummyDocumentIterator(); } } catch (Exception ex) { + if (monitor != null) monitor.ShowingDialog = true; MessageService.ShowMessage(ex.Message); + if (monitor != null) monitor.ShowingDialog = false; return new DummyDocumentIterator(); } return new DirectoryDocumentIterator(SearchOptions.LookIn,