Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 37 additions & 6 deletions QuickShell.Core/Services/LaunchCommandSanity.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,48 @@ public static bool IsUsableDotNetProjectFileName(string? fileName)
private static bool LooksLikeTempProjectReference(string command)
{
// e.g. dotnet watch --project tmp_serilog_probe.csproj
foreach (var token in command.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
var span = command.AsSpan();
var index = 0;

while (index < span.Length)
{
var file = token.Trim('"', '\'');
if (!file.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase)
&& !file.EndsWith(".fsproj", StringComparison.OrdinalIgnoreCase)
&& !file.EndsWith(".sln", StringComparison.OrdinalIgnoreCase)
&& !file.EndsWith(".slnx", StringComparison.OrdinalIgnoreCase))
// Skip whitespace
while (index < span.Length && span[index] == ' ')
{
index++;
}

if (index >= span.Length)
{
break;
}

// Find end of token
var tokenStart = index;
while (index < span.Length && span[index] != ' ')
{
index++;
}

var tokenSpan = span.Slice(tokenStart, index - tokenStart).Trim();
if (tokenSpan.IsEmpty)
{
continue;
}

var fileSpan = tokenSpan.Trim(['"', '\'']);

// Check extensions using spans to avoid allocations
if (!fileSpan.EndsWith(".csproj", StringComparison.OrdinalIgnoreCase)
&& !fileSpan.EndsWith(".fsproj", StringComparison.OrdinalIgnoreCase)
&& !fileSpan.EndsWith(".sln", StringComparison.OrdinalIgnoreCase)
&& !fileSpan.EndsWith(".slnx", StringComparison.OrdinalIgnoreCase))
{
continue;
}

// Fall back to string allocation only when necessary to call IsUsableDotNetProjectFileName
var file = fileSpan.ToString();
if (!IsUsableDotNetProjectFileName(file))
{
return true;
Expand Down
5 changes: 4 additions & 1 deletion QuickShell.Core/Services/WorkspaceHealthCheck.cs
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,10 @@ private static IEnumerable<int> DetectPorts(TerminalShortcut shortcut)
return endQuote > 1 ? Path.GetFileName(trimmed[1..endQuote]) : null;
}

var token = trimmed.Split([' ', '\t'], StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
// Bolt: Performance optimization - use IndexOfAny to avoid string array allocation from Split
var spaceIndex = trimmed.AsSpan().IndexOfAny(' ', '\t');
var token = spaceIndex >= 0 ? trimmed[..spaceIndex] : trimmed;

if (string.IsNullOrWhiteSpace(token))
{
return null;
Expand Down
Loading