Add search files popup

This commit is contained in:
Matt Parker
2025-10-13 19:41:56 +10:00
parent 4e1f682764
commit 207b8fe3c8
15 changed files with 294 additions and 9 deletions

View File

@@ -0,0 +1,9 @@
using OneOf;
using SharpIDE.Application.Features.SolutionDiscovery;
namespace SharpIDE.Application.Features.Search;
public class FindFilesSearchResult
{
public required SharpIdeFile File { get; set; }
}

View File

@@ -2,7 +2,7 @@
namespace SharpIDE.Application.Features.Search;
public class SearchResult
public class FindInFilesSearchResult
{
public required SharpIdeFile File { get; set; }
public required int Line { get; set; }

View File

@@ -7,16 +7,16 @@ namespace SharpIDE.Application.Features.Search;
public static class SearchService
{
public static async Task<List<SearchResult>> FindInFiles(SharpIdeSolutionModel solutionModel, string searchTerm, CancellationToken cancellationToken)
public static async Task<List<FindInFilesSearchResult>> FindInFiles(SharpIdeSolutionModel solutionModel, string searchTerm, CancellationToken cancellationToken)
{
if (searchTerm.Length < 4)
if (searchTerm.Length < 4) // TODO: halt search once 100 results are found, and remove this restriction
{
return [];
}
var timer = Stopwatch.StartNew();
var files = solutionModel.AllFiles;
ConcurrentBag<SearchResult> results = [];
ConcurrentBag<FindInFilesSearchResult> results = [];
await Parallel.ForEachAsync(files, cancellationToken, async (file, ct) =>
{
if (cancellationToken.IsCancellationRequested) return;
@@ -25,7 +25,7 @@ public static class SearchService
if (cancellationToken.IsCancellationRequested) return;
if (line.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
{
results.Add(new SearchResult
results.Add(new FindInFilesSearchResult
{
File = file,
Line = index + 1,
@@ -40,4 +40,31 @@ public static class SearchService
Console.WriteLine($"Search completed in {timer.ElapsedMilliseconds} ms. Found {results.Count} results. {(cancellationToken.IsCancellationRequested ? "(Cancelled)" : "")}");
return results.ToList();
}
public static async Task<List<FindFilesSearchResult>> FindFiles(SharpIdeSolutionModel solutionModel, string searchTerm, CancellationToken cancellationToken)
{
if (searchTerm.Length < 2) // TODO: halt search once 100 results are found, and remove this restriction
{
return [];
}
var timer = Stopwatch.StartNew();
var files = solutionModel.AllFiles;
ConcurrentBag<FindFilesSearchResult> results = [];
await Parallel.ForEachAsync(files, cancellationToken, async (file, ct) =>
{
if (cancellationToken.IsCancellationRequested) return;
if (file.Name.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
{
results.Add(new FindFilesSearchResult
{
File = file
});
}
}
).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
timer.Stop();
Console.WriteLine($"File search completed in {timer.ElapsedMilliseconds} ms. Found {results.Count} results. {(cancellationToken.IsCancellationRequested ? "(Cancelled)" : "")}");
return results.ToList();
}
}