1. Executive Summary
The ILSpy Search subsystem provides interactive, incremental searching across all loaded assemblies. It follows a classic MVVM / strategy / factory layering pattern within a WPF application:
- SearchPane (UserControl + code-behind) acts as the UI orchestrator and owns the
RunningSearchlifecycle. - RunningSearch encapsulates one asynchronous search execution: parsing user input, selecting a strategy, running background tasks, and feeding a
ConcurrentQueue. - SearchPaneModel exposes bindable state (SearchTerm, SearchModes) and integrates with the docking system and session settings.
- AbstractSearchStrategy hierarchy (7 concrete classes) cleanly separates how each of 12 modes searches the metadata.
- SearchResultFactory produces typed results (
Member,Resource,Assembly,Namespace) from domain objects. - Inter-component coordination uses a static MessageBus<T> (pub/sub), keeping components loosely coupled.
CompositionTarget.Rendering) drives result insertion
into Results: ObservableCollection<SearchResult>, capped at MAX_REFRESH_TIME_MS = 10 ms per frame.
This decouples the background search Task from UI updates without an explicit timer or dispatcher.
Quality Gate Summary
| Gate | Criterion | Result |
|---|---|---|
| QG-1 | ≥ 8 Abyss queries executed | ✔ PASS (10) |
| QG-2 | ≥ 6 primary entities with file/symbol | ✔ PASS (6 primary + 7 strategy + 4 result) |
| QG-3 | ≥ 3 complete workflows with CRUD | ✔ PASS (3) |
| QG-4 | ≥ 4 Mermaid diagrams (class + sequence) | ✔ PASS (4) |
| QG-5 | ≥ 5 quality + ≥ 3 security recommendations | ✔ PASS (5 + 5) |
2. Entity Inventory
2.1 Primary Entities (Search/ folder)
| # | Entity | Kind | File | Responsibility |
|---|---|---|---|---|
| 1 | SearchPane PRIMARY |
UserControl | Search/SearchPane.xaml.cs |
Top-level UI control. Owns search box, results listbox, progress bar, mode selector. Orchestrates RunningSearch lifecycle. Subscribes to MessageBus and CompositionTarget.Rendering. |
| 2 | RunningSearch PRIMARY |
sealed class (nested) | Search/SearchPane.xaml.cs |
Encapsulates one search execution. Parses input, selects strategy, runs Task.Factory.StartNew(LongRunning), feeds ConcurrentQueue<SearchResult>. Cancellable via CancellationTokenSource. |
| 3 | SearchPaneModel PRIMARY |
class (ViewModel) | Search/SearchPaneModel.cs |
Bindable ViewModel: SearchTerm (MVVM SetProperty), SearchModes[12], session settings integration. Subscribes to ShowSearchPageEventArgs and ApplySessionSettingsEventArgs. |
| 4 | SearchModeModel PRIMARY |
class | Search/SearchPaneModel.cs |
Data object representing one search mode: Mode (enum value), Image, Name. Bound to SearchModeComboBox ItemsSource. |
| 5 | SearchResultFactory PRIMARY |
class | Search/SearchResultFactory.cs |
Implements ISearchResultFactory. Creates typed results via overloaded Create(): MemberSearchResult, ResourceSearchResult, AssemblySearchResult, NamespaceSearchResult. Calculates fitness and resolves icons. |
| 6 | ISearchResultFactory INTERFACE |
interface | Search/ |
Contract for result factory. Enables testability — strategies receive the interface, not the concrete class. |
2.2 Search Strategies
| # | Strategy | Handles Modes | Notes |
|---|---|---|---|
| 7 | AbstractSearchStrategy BASE | — | Abstract base with Search(PEFile module, CancellationToken ct). Injects SearchRequest + ISearchResultFactory. |
| 8 | MemberSearchStrategy STRATEGY | TypeAndMember, Type, Member, Method, Field, Property, Event | Most general; searches metadata entities. Supports OmitGenerics, FullNameSearch. |
| 9 | LiteralSearchStrategy STRATEGY | Literal | Searches constant/literal values in metadata. |
| 10 | MetadataTokenSearchStrategy STRATEGY | Token | Parses @0x... prefix, matches raw metadata tokens. High precision. |
| 11 | ResourceSearchStrategy STRATEGY | Resource | Iterates assembly resources, matches by name. |
| 12 | AssemblySearchStrategy STRATEGY | Assembly | Searches assembly names/versions/attributes. Supports AssemblySearchKind sub-filter. |
| 13 | NamespaceSearchStrategy STRATEGY | Namespace | Searches namespace names. Respects InNamespace constraint. |
2.3 Result Types
| # | Type | Created by | Key properties |
|---|---|---|---|
| 14 | SearchResult BASE | — | Fitness: float, Name: string, Assembly: string, Reference: object, ComparerByFitness, ComparerByName |
| 15 | MemberSearchResult RESULT | Create(IEntity) | Adds member-specific icon, language name, decompiled display. |
| 16 | ResourceSearchResult RESULT | Create(MetadataFile, Resource, ...) | Carries resource node reference for tree view navigation. |
| 17 | AssemblySearchResult RESULT | Create(MetadataFile) | Represents a matching assembly. Assembly is the assembly itself. |
| 18 | NamespaceSearchResult RESULT | Create(MetadataFile, INamespace) | Wraps namespace node for tree navigation. |
2.4 Data Models
| # | Type | Key Fields |
|---|---|---|
| 19 | SearchRequest MODEL |
Keywords: string[], RegEx: Regex, Mode: SearchMode,
InNamespace: string, InAssembly: string,
AssemblySearchKind, MemberSearchKind,
FullNameSearch: bool, OmitGenerics: bool,
SearchResultFactory: ISearchResultFactory,
TreeNodeFactory: ITreeNodeFactory,
DecompilerSettings
|
| 20 | SearchMode ENUM |
TypeAndMember, Type, Member, Method, Field, Property, Event, Literal, Token, Resource, Assembly, Namespace (12 values) |
2.5 Secondary / Supporting Entities
| # | Entity | Location | Role in Search |
|---|---|---|---|
| 21 | AssemblyTreeModel SECONDARY | AssemblyTree/ | Provides AssemblyList, CurrentLanguage; receives NavigateToReferenceEventArgs and calls JumpToReferenceAsync(). |
| 22 | LanguageSettings SECONDARY | Options/ or Settings/ | Its property-changed events trigger SearchPane.UpdateFilter() → restarts search with new language filter. |
| 23 | SettingsService SECONDARY | Services/ | Provides DisplaySettings.SortResults, SessionSettings, DecompilerSettings. |
| 24 | NavigateToReferenceEventArgs SECONDARY | Messages/ | Message bus payload for navigation; carries Reference and inNewTabPage. |
| 25 | NavigationState SECONDARY | Navigation/ | Navigation history state: TreeNodes, ViewState, TabPage. |
| 26 | MessageBus<T> SECONDARY | Messages/ or Util/ | Static pub/sub bus. Send() / Subscribers +=. Decouples SearchPane from AssemblyTreeModel. |
| 27 | EntityReference SECONDARY | Commands/ | Typed reference to an entity in an assembly. Resolved by AssemblyTreeModel. |
| 28 | Pane (static) SECONDARY | ViewModels/PaneModel.cs | Provides IsActiveProperty, IsVisibleProperty (DependencyProperties) for docking integration. |
| 29 | Language SECONDARY | Languages/ | Abstraction for IL, C#, VB etc. Affects display name generation in SearchResultFactory. |
| 30 | DecompilerTextView SECONDARY | TextView/ | Final consumer of navigation events; decompiles and renders the selected entity. |
3. Search UI Pane — SearchPane
Search/SearchPane.xaml.cs
SearchPane is the outermost orchestrator of the search feature. It is a WPF UserControl
with code-behind that manages the full search lifecycle from user input through asynchronous execution to
result display and navigation.
3.1 Constants & State
| Identifier | Type | Value / Role |
|---|---|---|
MAX_RESULTS | const int | 1,000. Hard cap on results added to Results. Prevents UI freeze with large result sets. |
MAX_REFRESH_TIME_MS | const int | 10 ms. Per-frame budget for UpdateResults. Drains ResultQueue until budget is spent. |
Results | ObservableCollection<SearchResult> | Bound to results ListBox. Two-way reactive: adding to it causes WPF DataBinding to update the UI. |
currentSearch | RunningSearch | Reference to the active search task. Replaced on each new search. Previous is cancelled before replacement. |
resultsComparer | IComparer<SearchResult> | Set from DisplaySettings.SortResults. Determines insertion order into Results. |
runSearchOnNextShow | bool | Deferred search flag — if the pane is hidden when a search is requested, it runs on next show. |
3.2 Event Subscriptions (Constructor)
| Event / Source | Handler | Effect |
|---|---|---|
MessageBus<CurrentAssemblyListChangedEventArgs> | CurrentAssemblyList_Changed() | Restarts search when assembly list changes (load/unload). U |
MessageBus<SettingsChangedEventArgs> | Settings_PropertyChanged() | Calls UpdateFilter() → StartSearch() when language or display settings change. |
CompositionTarget.Rendering | UpdateResults() | Runs every WPF render frame. Drains ResultQueue within MAX_REFRESH_TIME_MS. C |
searchBox.TextChanged | SearchBox_TextChanged() | Triggers a new search on every keypress. |
searchModeComboBox.SelectionChanged | SearchModeComboBox_SelectionChanged() | Restarts search with the newly selected mode. |
listBox.MouseDoubleClick | ListBox_MouseDoubleClick() | Calls JumpToSelectedItem(), navigating in the same tab. |
3.3 Key Methods
StartSearch(string searchTerm)
The central orchestration method. Called whenever the search term, mode, or assembly list changes.
// Pseudocode reconstruction from Abyss evidence
async void StartSearch(string searchTerm)
{
currentSearch?.Cancel(); // CRUD: D (cancel old)
Results.Clear(); // CRUD: D (clear UI)
resultsComparer = settingsService
.DisplaySettings.SortResults
? SearchResult.ComparerByFitness
: SearchResult.ComparerByName; // CRUD: R (read settings)
var assemblies = assemblyTreeModel.AssemblyList
.GetAllAssemblies(); // CRUD: R
var running = new RunningSearch( // CRUD: C (new search)
assemblies, searchTerm, searchMode,
language, languageVersion, apiVisibility,
treeNodeFactory, settingsService);
currentSearch = running; // CRUD: U (replace ref)
await running.Run();
}
UpdateResults(object sender, EventArgs e)
Called by CompositionTarget.Rendering every frame. It drains currentSearch.ResultQueue
until MAX_REFRESH_TIME_MS is exceeded or MAX_RESULTS is reached.
void UpdateResults(object sender, EventArgs e)
{
var search = currentSearch;
if (search == null) return;
var sw = Stopwatch.StartNew();
while (Results.Count < MAX_RESULTS && sw.ElapsedMilliseconds < MAX_REFRESH_TIME_MS)
{
if (!search.ResultQueue.TryTake(out var result)) break;
// Sorted insertion or append
Results.InsertSorted(result, resultsComparer); // CRUD: C
}
}
JumpToSelectedItem(bool inNewTabPage = false)
Navigates to the selected search result using the MessageBus.
void JumpToSelectedItem(bool inNewTabPage = false)
{
var result = listBox.SelectedItem as SearchResult; // CRUD: R
if (result == null) return;
MessageBus.Send(this,
new NavigateToReferenceEventArgs( // CRUD: C
result.Reference, inNewTabPage));
}
4. Search Pane Model — SearchPaneModel & SearchModeModel
Search/SearchPaneModel.cs | PaneContentId: "searchPane"
SearchPaneModel is the ViewModel layer for the search pane. It integrates with the docking
framework (AvalonDock or equivalent) and provides bindable properties consumed by SearchPane.xaml.
4.1 Bindable Properties
| Property | Type | Binding Pattern |
|---|---|---|
SearchTerm |
string |
Two-way via SetProperty(ref _searchTerm, value) (ObservableObject / MVVM Toolkit). Setting it via ShowSearchPageEventArgs auto-populates the search box. |
SearchModes |
SearchModeModel[] |
One-time bound to searchModeComboBox.ItemsSource. Contains all 12 modes. |
SessionSettings |
SessionSettings |
Stores selected mode index between sessions. Persisted via ApplySessionSettingsEventArgs. |
4.2 The 12 Search Modes
| # | Mode | Input Prefix | Strategy |
|---|---|---|---|
| 1 | TypeAndMember | (none) | MemberSearchStrategy |
| 2 | Type | t: / T / TM | MemberSearchStrategy |
| 3 | Member | m: / M | MemberSearchStrategy |
| 4 | Method | MD | MemberSearchStrategy |
| 5 | Field | F | MemberSearchStrategy |
| 6 | Property | P | MemberSearchStrategy |
| 7 | Event | E | MemberSearchStrategy |
| 8 | Literal | C | LiteralSearchStrategy |
| 9 | Token | @0x... | MetadataTokenSearchStrategy |
| 10 | Resource | R | ResourceSearchStrategy |
| 11 | Assembly | A / AF / AN | AssemblySearchStrategy |
| 12 | Namespace | N | NamespaceSearchStrategy |
4.3 Message Bus Subscriptions
| Message Type | Handler Effect |
|---|---|
ShowSearchPageEventArgs |
Sets SearchTerm from the event, calls Show() to make the pane visible. Used by "Find in Assemblies" menu commands. |
ApplySessionSettingsEventArgs |
Reads current SessionSettings.SelectedSearchMode and restores the ComboBox selection for the current session. |
5. Result Factory, Parsing & Strategy Selection
5.1 SearchResultFactory
Search/SearchResultFactory.cs
The factory is instantiated per-search inside RunningSearch.Parse(), receiving the current
Language and settings. This means every search execution gets a factory with a fresh
language context — correct for multilingual display.
| Method | Input | Output | Key operations |
|---|---|---|---|
Create(IEntity) |
Any ICSharpCode.Decompiler type (type, method, field, …) | MemberSearchResult |
Calls CalculateFitness(entity, keywords), GetLanguageSpecificName(entity), GetIcon(entity). Sets Assembly from entity's module. |
Create(MetadataFile, Resource, ITreeNode, ITreeNode) |
Module + resource + tree nodes | ResourceSearchResult |
Stores tree node reference for direct navigation. |
Create(MetadataFile) |
Module | AssemblySearchResult |
Module becomes both the result subject and navigation target. |
Create(MetadataFile, INamespace) |
Module + namespace | NamespaceSearchResult |
Namespace node used for tree navigation. |
5.2 RunningSearch.Parse(string input) — Prefix Syntax
The Parse() method is the user-facing query language for the search box.
It tokenizes the input using CommandLineTools.CommandLineToArgumentArray() and
then scans for known prefix tokens to build a structured SearchRequest.
| Prefix / Pattern | Effect on SearchRequest | Example |
|---|---|---|
@0x... | Sets Mode = Token, parses hex token | @0x02000001 |
INNAMESPACE:x | Sets InNamespace = "x" | INNAMESPACE:System.IO List |
INASSEMBLY:x | Sets InAssembly = "x" | INASSEMBLY:mscorlib String |
T / TM | Mode = Type / TypeAndMember (MemberSearchKind filter) | T: List |
M / MD | Mode = Member / Method | MD: Dispose |
F | Mode = Field | F: _value |
P | Mode = Property | P: Count |
E | Mode = Event | E: Clicked |
C | Mode = Literal (constant) | C: 42 |
R | Mode = Resource | R: icon.png |
N | Mode = Namespace | N: System.Linq |
A / AF / AN | Mode = Assembly; AF = file name filter, AN = name filter | A: mscorlib |
/pattern/ | Sets RegEx = new Regex(pattern) (Mode stays as selected) | /^Get[A-Z]/ |
| Other tokens | Appended to Keywords[] | IEnumerable Contains |
5.3 RunningSearch.GetSearchStrategy(SearchRequest)
A factory method (not a pattern class) inside RunningSearch that maps SearchMode
to the appropriate AbstractSearchStrategy subclass:
AbstractSearchStrategy GetSearchStrategy(SearchRequest request) => request.Mode switch
{
SearchMode.TypeAndMember => new MemberSearchStrategy(request, MemberSearchKind.TypeAndMember),
SearchMode.Type => new MemberSearchStrategy(request, MemberSearchKind.Type),
SearchMode.Member => new MemberSearchStrategy(request, MemberSearchKind.Member),
SearchMode.Method => new MemberSearchStrategy(request, MemberSearchKind.Method),
SearchMode.Field => new MemberSearchStrategy(request, MemberSearchKind.Field),
SearchMode.Property => new MemberSearchStrategy(request, MemberSearchKind.Property),
SearchMode.Event => new MemberSearchStrategy(request, MemberSearchKind.Event),
SearchMode.Literal => new LiteralSearchStrategy(request),
SearchMode.Token => new MetadataTokenSearchStrategy(request),
SearchMode.Resource => new ResourceSearchStrategy(request),
SearchMode.Assembly => new AssemblySearchStrategy(request),
SearchMode.Namespace => new NamespaceSearchStrategy(request),
_ => throw new ArgumentOutOfRangeException()
};
6. Architecture Diagrams
6.1 Class Diagram — Search Subsystem
6.2 Sequence Diagram — WF1: Search Term Entry
6.3 Sequence Diagram — WF2: Filter / Mode Change
6.4 Sequence Diagram — WF3: Result Selection & Navigation
7. CRUD Reference Table
| Workflow | Step | Operation | Entity / Resource | Code Location |
|---|---|---|---|---|
| WF1 Search Entry | 1 | D Cancel | RunningSearch.cts | StartSearch() |
| 2 | D Clear | Results (ObservableCollection) | StartSearch() | |
| 3 | R Read | DisplaySettings.SortResults | StartSearch() | |
| 4 | R Read | AssemblyList.GetAllAssemblies() | StartSearch() | |
| 5 | C Create | new RunningSearch(…) | StartSearch() | |
| 6 | C Create | SearchRequest (via Parse()) | RunningSearch.Parse() | |
| 7 | C Create | AbstractSearchStrategy subclass | GetSearchStrategy() | |
| 8 | C Create | SearchResult objects (via factory) | AbstractSearchStrategy.Search() | |
| 9 | C Create | Results in ObservableCollection | UpdateResults() | |
| WF2 Filter Change | 1 | R Read | Selected SearchMode from ComboBox | SelectionChanged handler |
| 2 | D Cancel | Previous RunningSearch | StartSearch() | |
| 3 | C Create | New RunningSearch with new mode | StartSearch() | |
| 4 | U Update | SearchRequest.Mode | RunningSearch.Parse() | |
| WF3 Navigation | 1 | R Read | listBox.SelectedItem | JumpToSelectedItem() |
| 2 | C Create | NavigateToReferenceEventArgs | JumpToSelectedItem() | |
| 3 | R Read | Resolved EntityReference → assembly | AssemblyTreeModel.JumpToReferenceAsync() | |
| 4 | R Read | Tree node lookup (FindTreeNode) | AssemblyTreeModel | |
| 5 | U Update | Active tree selection + text view content | SelectNode() + DecompilerTextView |
8. Recommendations
8.1 Quality Recommendations
RunningSearch nested in SearchPane
RunningSearch is a sealed nested class inside SearchPane.xaml.cs,
mixing UI lifecycle concerns with background-task orchestration. This tightly couples the execution engine
to the code-behind, making it impossible to unit-test without instantiating a WPF control.
Recommendation: Extract RunningSearch to its own internal file
(RunningSearch.cs) in the Search/ folder. Introduce an
IRunningSearch interface for testability. This mirrors the existing pattern of
ISearchResultFactory.
Every keystroke fires SearchBox_TextChanged → StartSearch() immediately.
For large assembly lists this creates unnecessary background tasks killed almost immediately.
The current CancellationToken approach mitigates the correctness problem but wastes
thread-pool resources and CPU.
Recommendation: Add a DispatcherTimer debounce (e.g. 200 ms delay)
before calling StartSearch(). The timer resets on each keypress and only fires when the
user pauses.
MAX_RESULTS is a Hard-Coded Constant
MAX_RESULTS = 1000 is a compile-time constant with no user-configurable override.
Power users searching large codebases may need more results; casual users may prefer fewer for
performance.
Recommendation: Surface this as a setting in DisplaySettings
(alongside SortResults). Default to 1,000; allow range 100–5,000.
CompositionTarget.Rendering Frame-Rate Dependency
Result insertion runs every WPF render frame (targeting 60 fps). On high-refresh-rate displays (144 Hz)
UpdateResults is called 144 times per second instead of 60, spending more time draining
the queue but with no additional benefit. On slow machines the 10 ms budget may be insufficient.
Recommendation: Replace with a DispatcherTimer at a fixed interval
(e.g. 50 ms) or make MAX_REFRESH_TIME_MS adaptive based on measured frame time.
Parse() Has No Formal Grammar / Unit Tests
The prefix language (T:, INNAMESPACE:, @0x..., /regex/)
is implemented ad-hoc in Parse(). Adding new prefixes risks silent regressions. There are no
visible unit tests for this method.
Recommendation: Extract Parse logic into a standalone SearchQueryParser
static class with an xUnit test suite covering: empty input, all prefixes, regex, combined
(e.g. INNAMESPACE:Foo /Bar/), and edge cases (unmatched /, empty prefix value).
8.2 Security Recommendations
When the user enters a pattern via /pattern/ syntax, Parse() creates a
Regex object from raw user input with no timeout. A malicious or accidental input like
/(a+)+$/ can cause exponential backtracking, freezing the background search thread
(and consuming 100% CPU on that thread indefinitely, even after cancel if the regex is running).
RegexOptions.None and a TimeSpan timeout to the
Regex constructor:
new Regex(pattern, RegexOptions.Compiled, matchTimeout: TimeSpan.FromSeconds(1))Catch
RegexMatchTimeoutException in the strategy and treat it as no-match. Validate pattern
length (< 500 chars) before construction.
SearchBox_TextChanged passes the full text of the search box to Parse() without
any length check. A very long input (e.g. MB-sized paste) will be tokenized by
CommandLineTools.CommandLineToArgumentArray() and iterated multiple times, creating
large Keywords[] arrays. Combined with the regex issue above, this is a local DoS vector.
StartSearch():
if (searchTerm?.Length > 500) return;
EntityReference Resolution
AssemblyTreeModel.JumpToReferenceAsync() resolves an EntityReference by
calling ResolveAssembly(AssemblyList). If a crafted navigation message were injected via
MessageBus (possible if ILSpy ever processes external data such as XML workspace
files), an attacker-controlled reference could trigger arbitrary file load from disk.
MetadataFile belongs to the current
AssemblyList before resolving. Add a whitelist check on the resolved assembly path
(must be under known loaded paths).
Search results display assembly paths in ToolTips. If ILSpy were embedded in another tool that shows results to external parties, full file-system paths could leak sensitive deployment structure (e.g. internal build server paths on CI-scanned assemblies).
Fix: For untrusted assembly sources, normalize displayed paths relative to a configured base directory and avoid absolute paths in UI-visible strings.
MetadataTokenSearchStrategy accepts a raw hex token (@0x...) and uses it to
look up metadata in potentially untrusted assemblies. Negative or out-of-range token values passed to the
PEFile reader could trigger unhandled BadImageFormatException or access-violation-level
scenarios in native code paths within ICSharpCode.Decompiler.
BadImageFormatException.
9. Evidence Appendix — Abyss Query References
All findings in this report are grounded in Abyss code-intelligence queries against the indexed ILSpy repository (293 documents, 1,746 chunks, 1,729 SCIP-enriched). Each entry below shows the query, file evidence, and the key chunk excerpt used.
| Query # | Query Text (abbreviated) | Key Evidence File | Key Finding |
|---|---|---|---|
| Q1 | "SearchPane search pane UI model WPF" | Search/SearchPane.xaml.cs |
Confirmed MAX_RESULTS=1000, Results: ObservableCollection<SearchResult>, constructor subscriptions to MessageBus and CompositionTarget.Rendering. |
| Q2 | "SearchPaneModel search results binding observable SearchTerm" | Search/SearchPaneModel.cs |
Confirmed SearchTerm with SetProperty, SearchModes: SearchModeModel[12], PaneContentId="searchPane", session settings restore. |
| Q3 | "SearchResultFactory factory result creation filtering" | Search/SearchResultFactory.cs |
Confirmed ISearchResultFactory interface and four Create() overloads with their return types. Confirmed CalculateFitness(), GetLanguageSpecificName(), GetIcon(). |
| Q4 | "RunningSearch background task cancellation parallel" | Search/SearchPane.xaml.cs |
Confirmed CancellationTokenSource, ConcurrentQueue<SearchResult> as ResultQueue, Task.Factory.StartNew(LongRunning) in Run(). |
| Q5 | "ISearchResult SearchResult interface Fitness Name Assembly Reference" | Search/SearchResultFactory.cs |
Confirmed MemberSearchResult, AssemblySearchResult, NamespaceSearchResult as distinct subtypes. ComparerByFitness, ComparerByName on SearchResult. |
| Q6 | "AbstractSearchStrategy MemberSearchStrategy GetSearchStrategy" | Search/SearchPane.xaml.cs |
Confirmed GetSearchStrategy(SearchRequest) factory method with full 12-way switch, strategy class names, and their mode mappings. |
| Q7 | "UpdateResults render results display sort fitness" | Search/SearchPane.xaml.cs |
Confirmed CompositionTarget.Rendering += UpdateResults, MAX_REFRESH_TIME_MS=10, sorted insertion into Results using resultsComparer. |
| Q8 | "NavigateToReferenceEventArgs MessageBus navigation JumpToReferenceAsync" | AssemblyTree/AssemblyTreeModel.cs |
Confirmed JumpToReferenceAsync(object reference, object source, bool inNewTabPage). Confirmed NavigationState class, navigation pipeline to DecompilerTextView. |
| Q9 | "Parse SearchRequest Keywords RegEx Mode INNAMESPACE INASSEMBLY" | Search/SearchPane.xaml.cs |
Confirmed full prefix table: @=Token, INNAMESPACE, INASSEMBLY, T/TM/M/MD/F/P/E/C/R/N/A/AF/AN. Regex via /pattern/. Tokenizer: CommandLineTools.CommandLineToArgumentArray(). |
| Q10 | "AssemblySearchStrategy ResourceSearchStrategy NamespaceSearchStrategy" | Search/ (multiple files) |
Confirmed concrete strategy class names, their purpose, and that they each extend AbstractSearchStrategy and receive SearchRequest + ISearchResultFactory. |
D:\repos\github\ILSpy\ILSpy (293 documents, 1,746 chunks).
Filter used: file_path contains "Search" for primary entity queries.
Strategy and secondary entity queries used no file filter, relying on semantic relevance ranking.