search v2

This commit is contained in:
Matt Parker
2025-09-23 22:37:02 +10:00
parent 6a95ea892c
commit 96dd10d296
8 changed files with 135 additions and 6 deletions

View File

@@ -0,0 +1,10 @@
using SharpIDE.Application.Features.SolutionDiscovery;
namespace SharpIDE.Application.Features.Search;
public class SearchResult
{
public required SharpIdeFile File { get; set; }
public required int LineNumber { get; set; }
public required string LineText { get; set; }
}

View File

@@ -1,4 +1,5 @@
using System.Collections.Concurrent;
using System.Diagnostics;
using System.IO.MemoryMappedFiles;
using SharpIDE.Application.Features.SolutionDiscovery.VsPersistence;
@@ -6,24 +7,34 @@ namespace SharpIDE.Application.Features.Search;
public static class SearchService
{
public static async Task FindInFiles(SharpIdeSolutionModel solutionModel, string searchTerm)
public static async Task<List<SearchResult>> FindInFiles(SharpIdeSolutionModel solutionModel, string searchTerm)
{
if (searchTerm.Length < 4)
{
return;
return [];
}
var timer = Stopwatch.StartNew();
var files = solutionModel.AllFiles;
ConcurrentBag<string> results = [];
ConcurrentBag<SearchResult> results = [];
await Parallel.ForEachAsync(files, async (file, ct) =>
{
await foreach (var (index, line) in File.ReadLinesAsync(file.Path, ct).Index().WithCancellation(ct))
{
if (line.Contains(searchTerm, StringComparison.OrdinalIgnoreCase))
{
results.Add($"{file.Path} (Line {index + 1}): {line.Trim()}");
results.Add(new SearchResult
{
File = file,
LineNumber = index + 1,
LineText = line.Trim()
});
}
}
}
);
timer.Stop();
Console.WriteLine($"Search completed in {timer.ElapsedMilliseconds} ms. Found {results.Count} results.");
return results.ToList();
}
}