Browse Source

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
shortcuts
Daniel Grunwald 16 years ago
parent
commit
f2a7b38c6c
  1. 4
      src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs
  2. 6
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs
  3. 20
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs
  4. 6
      src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceUtilities.cs

4
src/AddIns/Misc/SearchAndReplace/Project/Engine/Search.cs

@ -93,6 +93,7 @@ namespace SearchAndReplace
if (info != null && textIterator != null && documentIterator.CurrentFileName != null) { if (info != null && textIterator != null && documentIterator.CurrentFileName != null) {
ProvidedDocumentInformation currentInfo = documentIterator.Current; ProvidedDocumentInformation currentInfo = documentIterator.Current;
if (currentInfo != null) {
if (!info.Equals(currentInfo)) { // create new iterator, if document changed if (!info.Equals(currentInfo)) { // create new iterator, if document changed
info = currentInfo; info = currentInfo;
textIterator = textIteratorBuilder.BuildTextIterator(info); textIterator = textIteratorBuilder.BuildTextIterator(info);
@ -106,6 +107,7 @@ namespace SearchAndReplace
return result; return result;
} }
} }
}
// not found or first start -> move forward to the next document // not found or first start -> move forward to the next document
if (documentIterator.MoveForward()) { if (documentIterator.MoveForward()) {
@ -126,6 +128,7 @@ namespace SearchAndReplace
{ {
if (info != null && textIterator != null && documentIterator.CurrentFileName != null) { if (info != null && textIterator != null && documentIterator.CurrentFileName != null) {
ProvidedDocumentInformation currentInfo = documentIterator.Current; ProvidedDocumentInformation currentInfo = documentIterator.Current;
if (currentInfo != null) {
if (!info.Equals(currentInfo)) { // create new iterator, if document changed if (!info.Equals(currentInfo)) { // create new iterator, if document changed
info = currentInfo; info = currentInfo;
textIterator = textIteratorBuilder.BuildTextIterator(info); textIterator = textIteratorBuilder.BuildTextIterator(info);
@ -139,6 +142,7 @@ namespace SearchAndReplace
return result; return result;
} }
} }
}
// not found or first start -> move forward to the next document // not found or first start -> move forward to the next document
if (documentIterator.MoveForward()) { if (documentIterator.MoveForward()) {

6
src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceInFilesManager.cs

@ -24,15 +24,15 @@ namespace SearchAndReplace
find.TextIteratorBuilder = new ForwardTextIteratorBuilder(); find.TextIteratorBuilder = new ForwardTextIteratorBuilder();
} }
static void SetSearchOptions() static void SetSearchOptions(IProgressMonitor monitor)
{ {
find.SearchStrategy = SearchReplaceUtilities.CreateSearchStrategy(SearchOptions.SearchStrategyType); find.SearchStrategy = SearchReplaceUtilities.CreateSearchStrategy(SearchOptions.SearchStrategyType);
find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType); find.DocumentIterator = SearchReplaceUtilities.CreateDocumentIterator(SearchOptions.DocumentIteratorType, monitor);
} }
static bool InitializeSearchInFiles(IProgressMonitor monitor) static bool InitializeSearchInFiles(IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
find.Reset(); find.Reset();
if (!find.SearchStrategy.CompilePattern(monitor)) if (!find.SearchStrategy.CompilePattern(monitor))

20
src/AddIns/Misc/SearchAndReplace/Project/Engine/SearchReplaceManager.cs

@ -29,15 +29,15 @@ namespace SearchAndReplace
find.TextIteratorBuilder = new ForwardTextIteratorBuilder(); find.TextIteratorBuilder = new ForwardTextIteratorBuilder();
} }
static void SetSearchOptions() static void SetSearchOptions(IProgressMonitor monitor)
{ {
find.SearchStrategy = SearchReplaceUtilities.CreateSearchStrategy(SearchOptions.SearchStrategyType); 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) public static void Replace(IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
if (lastResult != null && WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) { if (lastResult != null && WorkbenchSingleton.Workbench.ActiveWorkbenchWindow != null) {
ITextEditorControlProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorControlProvider; ITextEditorControlProvider provider = WorkbenchSingleton.Workbench.ActiveViewContent as ITextEditorControlProvider;
if (provider != null) { if (provider != null) {
@ -66,7 +66,7 @@ namespace SearchAndReplace
public static void ReplaceFirstInSelection(int offset, int length, IProgressMonitor monitor) public static void ReplaceFirstInSelection(int offset, int length, IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
FindFirstInSelection(offset, length, monitor); FindFirstInSelection(offset, length, monitor);
} }
@ -100,7 +100,7 @@ namespace SearchAndReplace
public static void MarkAll(IProgressMonitor monitor) public static void MarkAll(IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
ClearSelection(); ClearSelection();
find.Reset(); find.Reset();
if (!find.SearchStrategy.CompilePattern(monitor)) if (!find.SearchStrategy.CompilePattern(monitor))
@ -125,7 +125,7 @@ namespace SearchAndReplace
public static void MarkAll(int offset, int length, IProgressMonitor monitor) public static void MarkAll(int offset, int length, IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
find.Reset(); find.Reset();
if (!find.SearchStrategy.CompilePattern(monitor)) if (!find.SearchStrategy.CompilePattern(monitor))
@ -189,7 +189,7 @@ namespace SearchAndReplace
public static void ReplaceAll(IProgressMonitor monitor) public static void ReplaceAll(IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
ClearSelection(); ClearSelection();
find.Reset(); find.Reset();
if (!find.SearchStrategy.CompilePattern(monitor)) if (!find.SearchStrategy.CompilePattern(monitor))
@ -237,7 +237,7 @@ namespace SearchAndReplace
public static void ReplaceAll(int offset, int length, IProgressMonitor monitor) public static void ReplaceAll(int offset, int length, IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
find.Reset(); find.Reset();
if (!find.SearchStrategy.CompilePattern(monitor)) if (!find.SearchStrategy.CompilePattern(monitor))
@ -268,7 +268,7 @@ namespace SearchAndReplace
public static void FindNext(IProgressMonitor monitor) public static void FindNext(IProgressMonitor monitor)
{ {
SetSearchOptions(); SetSearchOptions(monitor);
if (find == null || if (find == null ||
SearchOptions.FindPattern == null || SearchOptions.FindPattern == null ||
SearchOptions.FindPattern.Length == 0) { SearchOptions.FindPattern.Length == 0) {
@ -312,7 +312,7 @@ namespace SearchAndReplace
{ {
foundAtLeastOneItem = false; foundAtLeastOneItem = false;
textSelection = null; textSelection = null;
SetSearchOptions(); SetSearchOptions(monitor);
if (find == null || if (find == null ||
SearchOptions.FindPattern == null || SearchOptions.FindPattern == null ||

6
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) { switch (type) {
case DocumentIteratorType.CurrentDocument: case DocumentIteratorType.CurrentDocument:
@ -65,11 +65,15 @@ namespace SearchAndReplace
case DocumentIteratorType.Directory: case DocumentIteratorType.Directory:
try { try {
if (!Directory.Exists(SearchOptions.LookIn)) { 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)); 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(); return new DummyDocumentIterator();
} }
} catch (Exception ex) { } catch (Exception ex) {
if (monitor != null) monitor.ShowingDialog = true;
MessageService.ShowMessage(ex.Message); MessageService.ShowMessage(ex.Message);
if (monitor != null) monitor.ShowingDialog = false;
return new DummyDocumentIterator(); return new DummyDocumentIterator();
} }
return new DirectoryDocumentIterator(SearchOptions.LookIn, return new DirectoryDocumentIterator(SearchOptions.LookIn,

Loading…
Cancel
Save