From dd2ad39d7c1971143a81ceae107194c6361cc18a Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Tue, 22 Sep 2026 09:59:58 -0400 Subject: [PATCH 1/4] Repair XREF gen tool --- .../Pages/Home.razor | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor index 6eff6e136..444c4e03f 100644 --- a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor +++ b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor @@ -95,22 +95,27 @@ if (SearchResultItems?.Results?.Any() == true) { - var index = 1; foreach (var result in SearchResultItems.Results.Take(MaxResults)) { - var client = ClientFactory.CreateClient(); - var encodedUrl = WebUtility.UrlEncode($"https://learn.microsoft.com/en-us{result.Url}?view={dotNetVersion}"); - using var request = new HttpRequestMessage(HttpMethod.Get, $"https://corsproxy.io/?{encodedUrl}"); - using var response = await client.SendAsync(request); - var content = await response.Content.ReadAsStringAsync(); - - var match = Regex.Match(content, ""); - if (match.Success) + if (!string.IsNullOrEmpty(result.DisplayName)) { - result.Link = match.Groups[1].Value.Replace("*", "%2A").Replace("`", "%60"); + + if (result.ItemType == "Constructor") + { + result.Link = Regex.Replace(result.DisplayName, @"\(.*\)", ".%23ctor%2A"); + } + else if (result.ItemType == "Method") + { + result.Link = Regex.Replace(result.DisplayName, @"\(.*\)", "%2A"); + } + else + { + result.Link = result.DisplayName; + } + + result.Link = Regex.Replace(result.Link ?? string.Empty, @"<([^>]+)>", "%601"); } - result.Index = index++; ResultsToRender.Add(result); StateHasChanged(); } From 3ff0c5aff8f32c1a3f9716cd351ef3bb2f89301c Mon Sep 17 00:00:00 2001 From: guardrex <1622880+guardrex@users.noreply.github.com> Date: Tue, 22 Sep 2026 10:14:41 -0400 Subject: [PATCH 2/4] Updates --- .../BlazorWebAssemblyXrefGenerator.sln | 2 +- BlazorWebAssemblyXrefGenerator/Pages/Home.razor | 15 ++------------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/BlazorWebAssemblyXrefGenerator/BlazorWebAssemblyXrefGenerator.sln b/BlazorWebAssemblyXrefGenerator/BlazorWebAssemblyXrefGenerator.sln index 434c3767a..c66d19724 100644 --- a/BlazorWebAssemblyXrefGenerator/BlazorWebAssemblyXrefGenerator.sln +++ b/BlazorWebAssemblyXrefGenerator/BlazorWebAssemblyXrefGenerator.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 18 -VisualStudioVersion = 18.3.11206.111 d18.3 +VisualStudioVersion = 18.3.11206.111 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BlazorWebAssemblyXrefGenerator", "BlazorWebAssemblyXrefGenerator.csproj", "{AC54A61E-49B7-4494-B9FF-978F64A9EF7C}" EndProject diff --git a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor index 444c4e03f..d4811d1b3 100644 --- a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor +++ b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor @@ -10,17 +10,6 @@

Search

- - - - - - - - - - -
@@ -68,7 +57,6 @@ private SearchResults? SearchResultItems { get; set; } private List ResultsToRender { get; set; } = new(); public string? message; - private string? dotNetVersion; private const int MaxResults = 22; @@ -83,6 +71,7 @@ message = string.Empty; var apiClient = ClientFactory.CreateClient("APIClient"); + if (string.IsNullOrEmpty(Model?.SearchText) || apiClient == null) { isSearching = false; @@ -91,7 +80,7 @@ try { - SearchResultItems = await apiClient.GetFromJsonAsync($"api/apibrowser/dotnet/search?api-version=0.2&search={Model.SearchText}"); + SearchResultItems = await apiClient.GetFromJsonAsync($"api/apibrowser/dotnet/search?search={Model.SearchText}"); if (SearchResultItems?.Results?.Any() == true) { From 2bf5960459fba562b3ead4fb48e5bed7cb1c2ca3 Mon Sep 17 00:00:00 2001 From: Luke Latham <1622880+guardrex@users.noreply.github.com> Date: Tue, 22 Sep 2026 10:24:11 -0400 Subject: [PATCH 3/4] Fix regex replacement and update result index Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- BlazorWebAssemblyXrefGenerator/Pages/Home.razor | 1 + 1 file changed, 1 insertion(+) diff --git a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor index d4811d1b3..0601940bd 100644 --- a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor +++ b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor @@ -105,6 +105,7 @@ result.Link = Regex.Replace(result.Link ?? string.Empty, @"<([^>]+)>", "%601"); } + result.Index = ResultsToRender.Count + 1; ResultsToRender.Add(result); StateHasChanged(); } From f9686541393d6970cfdccc2303834c69ec558557 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 22 Sep 2026 14:26:36 +0000 Subject: [PATCH 4/4] Fix generic arity replacement for nested type arguments Co-authored-by: guardrex <1622880+guardrex@users.noreply.github.com> --- .../Pages/Home.razor | 65 ++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor index 0601940bd..979c6f4fb 100644 --- a/BlazorWebAssemblyXrefGenerator/Pages/Home.razor +++ b/BlazorWebAssemblyXrefGenerator/Pages/Home.razor @@ -1,5 +1,6 @@ @page "/" @using System.Net +@using System.Text @using System.Text.RegularExpressions @inject IHttpClientFactory ClientFactory @@ -102,7 +103,7 @@ result.Link = result.DisplayName; } - result.Link = Regex.Replace(result.Link ?? string.Empty, @"<([^>]+)>", "%601"); + result.Link = ReplaceGenericArity(result.Link ?? string.Empty); } result.Index = ResultsToRender.Count + 1; @@ -132,6 +133,68 @@ message = string.Empty; } + private static string ReplaceGenericArity(string value) + { + var builder = new StringBuilder(); + + for (var index = 0; index < value.Length; index++) + { + if (value[index] != '<') + { + builder.Append(value[index]); + continue; + } + + var depth = 1; + var endIndex = index + 1; + + while (endIndex < value.Length && depth > 0) + { + if (value[endIndex] == '<') + { + depth++; + } + else if (value[endIndex] == '>') + { + depth--; + } + + endIndex++; + } + + if (depth > 0) + { + builder.Append(value[index]); + continue; + } + + var genericArguments = value[(index + 1)..(endIndex - 1)]; + var arity = 1; + var argumentDepth = 0; + + foreach (var character in genericArguments) + { + if (character == '<') + { + argumentDepth++; + } + else if (character == '>') + { + argumentDepth--; + } + else if (character == ',' && argumentDepth == 0) + { + arity++; + } + } + + builder.Append($"%60{arity}"); + index = endIndex - 1; + } + + return builder.ToString(); + } + public class FormModel { public string? SearchText { get; set; } = string.Empty;