From 726dd2cbdaf0d633a33cdeacbf515bb3da188094 Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Tue, 8 Sep 2026 21:31:50 +0200 Subject: [PATCH 1/4] Report the projects of a Navigate-To search that has no F# service `SearchProjectsAsync` returns early when no `IFSharpNavigateToSearchService` was composed, without reporting the projects it was handed. The searcher adds one progress item per project up front, so those items stay outstanding until the whole search ends and drains them, and the progress bar sits still in the meantime. Report each project instead, and search it only when there is a service to search it with. Co-Authored-By: Claude Opus 5 (1M context) --- .../NavigateTo/FSharpNavigateToSearchService.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs index a051d255403d7..63b2fd3f767de 100644 --- a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs @@ -52,17 +52,17 @@ public async Task SearchProjectsAsync( Func onProjectCompleted, CancellationToken cancellationToken) { - if (_service == null) - return; - Contract.ThrowIfTrue(projects.IsEmpty); Contract.ThrowIfTrue(projects.Select(p => p.Language).Distinct().Count() != 1); foreach (var project in projects) { - var results = await _service.SearchProjectAsync(project, priorityDocuments, searchPattern, kinds, cancellationToken).ConfigureAwait(false); - if (results.Length > 0) - await onResultsFound(results.SelectAsArray(result => (INavigateToSearchResult)new InternalFSharpNavigateToSearchResult(result))).ConfigureAwait(false); + if (_service != null) + { + var results = await _service.SearchProjectAsync(project, priorityDocuments, searchPattern, kinds, cancellationToken).ConfigureAwait(false); + if (results.Length > 0) + await onResultsFound(results.SelectAsArray(result => (INavigateToSearchResult)new InternalFSharpNavigateToSearchResult(result))).ConfigureAwait(false); + } await onProjectCompleted().ConfigureAwait(false); } From 579f429d79a9733b93d1842ebc5c9b8f16149a1a Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Wed, 9 Sep 2026 01:58:26 +0200 Subject: [PATCH 2/4] Let F# take part in the Navigate-To search that runs during load While the solution is loading, Navigate To searches through `IAdvancedNavigateToSearchService`, and a language service that does not implement it has each of its projects reported complete and searched not at all. No full search follows, by design, so nothing that language declares can be found until the user searches again. F# reaches Navigate To through external access, which has no way to say it can answer that search. `IFSharpAdvancedNavigateToSearchService` adds that member with the signature of `IAdvancedNavigateToSearchService.SearchCachedDocumentsAsync` itself: the batch of projects, the priority documents, the active document, and the two callbacks, so the F# side can stream results and report progress the way the C# and VB service does, and so a later F# index has the whole contract to work with. It derives from `IFSharpNavigateToSearchService` rather than extending it, because the implementation ships separately and this repository reaches Visual Studio first: a member added to the existing interface fails type load during composition for an implementation built against the previous version, and `Microsoft.VisualStudio.LanguageServices.ExternalAccess` targets net472, where default interface members have no runtime. `IFSharpEditorFormattingServiceWithOptions` is the same shape. The adapter implements `IAdvancedNavigateToSearchService`. Its cached search is the branch `NavigateToSearcher` has for a service without the advanced interface: when the imported service has it, the call is passed through with the results wrapped; when it does not, every project is reported and nothing is searched, which is what the searcher does today. Generated documents are reported and not searched: F# has no Roslyn source generators, and type providers give types during checking rather than documents. Co-Authored-By: Claude Opus 5 (1M context) --- .../FSharpNavigateToSearchService.cs | 49 ++++++++++++++++++- .../IFSharpAdvancedNavigateToSearchService.cs | 40 +++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs index 63b2fd3f767de..b4dcb7c3202f9 100644 --- a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs @@ -18,7 +18,7 @@ namespace Microsoft.CodeAnalysis.ExternalAccess.FSharp.Internal.NavigateTo; [ExportLanguageService(typeof(INavigateToSearchService), LanguageNames.FSharp)] [method: ImportingConstructor] [method: Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] -internal class FSharpNavigateToSearchService([Import(AllowDefault = true)] IFSharpNavigateToSearchService? service) : INavigateToSearchService +internal class FSharpNavigateToSearchService([Import(AllowDefault = true)] IFSharpNavigateToSearchService? service) : IAdvancedNavigateToSearchService { private readonly IFSharpNavigateToSearchService? _service = service; @@ -67,4 +67,51 @@ public async Task SearchProjectsAsync( await onProjectCompleted().ConfigureAwait(false); } } + + public async Task SearchCachedDocumentsAsync( + Solution solution, + ImmutableArray projects, + ImmutableArray priorityDocuments, + string searchPattern, + IImmutableSet kinds, + Document? activeDocument, + Func, Task> onResultsFound, + Func onProjectCompleted, + CancellationToken cancellationToken) + { + Contract.ThrowIfTrue(projects.IsEmpty); + Contract.ThrowIfTrue(projects.Select(p => p.Language).Distinct().Count() != 1); + + // if the service doesn't support searching cached docs, immediately transition the projects to the + // completed state. + if (_service is not IFSharpAdvancedNavigateToSearchService advancedService) + { + foreach (var project in projects) + await onProjectCompleted().ConfigureAwait(false); + } + else + { + await advancedService.SearchCachedDocumentsAsync( + solution, projects, priorityDocuments, searchPattern, kinds, activeDocument, + results => onResultsFound(results.SelectAsArray(result => (INavigateToSearchResult)new InternalFSharpNavigateToSearchResult(result))), + onProjectCompleted, cancellationToken).ConfigureAwait(false); + } + } + + public async Task SearchGeneratedDocumentsAsync( + Solution solution, + ImmutableArray projects, + string searchPattern, + IImmutableSet kinds, + Document? activeDocument, + Func, Task> onResultsFound, + Func onProjectCompleted, + CancellationToken cancellationToken) + { + // Nothing to search: F# has no Roslyn source generators, and type providers give types during checking + // rather than documents. The projects still have to be reported for the progress the searcher added for + // them to complete. + foreach (var project in projects) + await onProjectCompleted().ConfigureAwait(false); + } } diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs new file mode 100644 index 0000000000000..c5ab63bec30f1 --- /dev/null +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs @@ -0,0 +1,40 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Immutable; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo; + +/// +/// Optional expanded API for Navigate-To. An that also implements this +/// takes part in the search that runs while the solution is still loading; one that does not is skipped until the +/// solution is fully loaded, and so contributes nothing to that search. +/// +internal interface IFSharpAdvancedNavigateToSearchService : IFSharpNavigateToSearchService +{ + /// + /// Searches the documents inside for symbols that matches . Results should be reported from a previous computed cache (even if that cache is out of + /// date) to produce results as quickly as possible. This is called for every project of the solution while it + /// loads, so it must not wait on anything that only becomes available once the project has loaded. + /// + /// + /// All the projects passed are for F#. Similarly, all the belong to these + /// projects. must be called exactly once per project, whether or not + /// anything was found in it. + /// + Task SearchCachedDocumentsAsync( + Solution solution, + ImmutableArray projects, + ImmutableArray priorityDocuments, + string searchPattern, + IImmutableSet kinds, + Document? activeDocument, + Func, Task> onResultsFound, + Func onProjectCompleted, + CancellationToken cancellationToken); +} From feeadc17484b1dc184011321347032d1f5f2889a Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Wed, 9 Sep 2026 01:58:41 +0200 Subject: [PATCH 3/4] Check for null with a pattern in the F# Navigate-To adapter The file now tests the imported service for the advanced interface with a type pattern, and reads oddly with the remaining two checks in the older form. Both say the same thing to the compiler; this is the one the rest of the file is written in. Co-Authored-By: Claude Opus 5 (1M context) --- .../Internal/NavigateTo/FSharpNavigateToSearchService.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs index b4dcb7c3202f9..9c555ab0b8944 100644 --- a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs @@ -33,7 +33,7 @@ public async Task SearchDocumentAsync( Func, Task> onResultsFound, CancellationToken cancellationToken) { - if (_service == null) + if (_service is null) return; var results = await _service.SearchDocumentAsync(document, searchPattern, kinds, cancellationToken).ConfigureAwait(false); @@ -57,7 +57,7 @@ public async Task SearchProjectsAsync( foreach (var project in projects) { - if (_service != null) + if (_service is not null) { var results = await _service.SearchProjectAsync(project, priorityDocuments, searchPattern, kinds, cancellationToken).ConfigureAwait(false); if (results.Length > 0) From 3ccfc0c08ec9e9b5ccb376f1ac4f005aa1689a1c Mon Sep 17 00:00:00 2001 From: Andrii Chebukin Date: Wed, 9 Sep 2026 16:40:28 +0200 Subject: [PATCH 4/4] Record the new Navigate-To contract in the external access baselines The type forward and the API baselines are how a type added under `ExternalAccess` becomes visible to the consumers that reference the F# facade rather than the core assembly, and `IFSharpNavigateToSearchService` next door has entries in all three. Give the new interface and the two adapter methods the same. Also: the loop that reports the projects of a search it does not run keeps its variable unused, so name it `_`, as `NoOpNavigateToSearchService` does; and the doc comment, copied from `IAdvancedNavigateToSearchService`, carried two grammar slips from there. Co-Authored-By: Claude Opus 5 --- .../Internal/NavigateTo/FSharpNavigateToSearchService.cs | 4 ++-- .../NavigateTo/IFSharpAdvancedNavigateToSearchService.cs | 6 +++--- .../ExternalAccess/Core/InternalAPI.Unshipped.txt | 8 ++++++++ .../ExternalAccess/FSharp/InternalAPI.Unshipped.txt | 2 ++ src/VisualStudio/ExternalAccess/FSharp/TypeForwards.cs | 1 + 5 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs index 9c555ab0b8944..7a2092862c553 100644 --- a/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/Internal/NavigateTo/FSharpNavigateToSearchService.cs @@ -86,7 +86,7 @@ public async Task SearchCachedDocumentsAsync( // completed state. if (_service is not IFSharpAdvancedNavigateToSearchService advancedService) { - foreach (var project in projects) + foreach (var _ in projects) await onProjectCompleted().ConfigureAwait(false); } else @@ -111,7 +111,7 @@ public async Task SearchGeneratedDocumentsAsync( // Nothing to search: F# has no Roslyn source generators, and type providers give types during checking // rather than documents. The projects still have to be reported for the progress the searcher added for // them to complete. - foreach (var project in projects) + foreach (var _ in projects) await onProjectCompleted().ConfigureAwait(false); } } diff --git a/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs b/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs index c5ab63bec30f1..860737cf82ace 100644 --- a/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs +++ b/src/VisualStudio/ExternalAccess/Core/FSharp/NavigateTo/IFSharpAdvancedNavigateToSearchService.cs @@ -17,9 +17,9 @@ namespace Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo; internal interface IFSharpAdvancedNavigateToSearchService : IFSharpNavigateToSearchService { /// - /// Searches the documents inside for symbols that matches . Results should be reported from a previous computed cache (even if that cache is out of - /// date) to produce results as quickly as possible. This is called for every project of the solution while it + /// Searches the documents inside for symbols that match . Results should be reported from a previously computed cache (even if that cache is out + /// of date) to produce results as quickly as possible. This is called for every project of the solution while it /// loads, so it must not wait on anything that only becomes available once the project has loaded. /// /// diff --git a/src/VisualStudio/ExternalAccess/Core/InternalAPI.Unshipped.txt b/src/VisualStudio/ExternalAccess/Core/InternalAPI.Unshipped.txt index 77c661ed5a023..709b01990f995 100644 --- a/src/VisualStudio/ExternalAccess/Core/InternalAPI.Unshipped.txt +++ b/src/VisualStudio/ExternalAccess/Core/InternalAPI.Unshipped.txt @@ -435,7 +435,9 @@ Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpN Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.CanFilter.get -> bool Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.FSharpNavigateToSearchService(Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService? service) -> void Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.KindsProvided.get -> System.Collections.Immutable.IImmutableSet! +Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchGeneratedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchProjectsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.InternalFSharpNavigateToSearchResult Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.InternalFSharpNavigateToSearchResult.IsCaseSensitive.get -> bool @@ -480,7 +482,9 @@ Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateTo Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToMatchKind.Substring = 2 -> Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToMatchKind Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToSearchResult Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToSearchResult.MatchKind.get -> Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToMatchKind +Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService +Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService.CanFilter.get -> bool Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService.KindsProvided.get -> System.Collections.Immutable.IImmutableSet! Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>! @@ -843,7 +847,9 @@ Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateT Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.CanFilter.get -> bool Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.FSharpNavigateToSearchService(Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService! service) -> void Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.KindsProvided.get -> System.Collections.Immutable.IImmutableSet! +Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! +Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchGeneratedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchProjectsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.InternalFSharpNavigateToSearchResult Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.InternalFSharpNavigateToSearchResult.IsCaseSensitive.get -> bool @@ -888,7 +894,9 @@ Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKin Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKind.Substring = 2 ->Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToMatchKind Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult.MatchKind.get ->Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToMatchKind +Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService +Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.CanFilter.get -> bool Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.KindsProvided.get -> System.Collections.Immutable.IImmutableSet! Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>! diff --git a/src/VisualStudio/ExternalAccess/FSharp/InternalAPI.Unshipped.txt b/src/VisualStudio/ExternalAccess/FSharp/InternalAPI.Unshipped.txt index 7e0790c7be3d4..8405b251834c7 100644 --- a/src/VisualStudio/ExternalAccess/FSharp/InternalAPI.Unshipped.txt +++ b/src/VisualStudio/ExternalAccess/FSharp/InternalAPI.Unshipped.txt @@ -313,7 +313,9 @@ Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKin Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKind.Substring = 2 -> Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKind Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult.MatchKind.get -> Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKind +Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService +Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray projects, System.Collections.Immutable.ImmutableArray priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func, System.Threading.Tasks.Task!>! onResultsFound, System.Func! onProjectCompleted, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task! Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.CanFilter.get -> bool Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.KindsProvided.get -> System.Collections.Immutable.IImmutableSet! Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet! kinds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task>! diff --git a/src/VisualStudio/ExternalAccess/FSharp/TypeForwards.cs b/src/VisualStudio/ExternalAccess/FSharp/TypeForwards.cs index 5c8a84ca53f1c..b31873c348060 100644 --- a/src/VisualStudio/ExternalAccess/FSharp/TypeForwards.cs +++ b/src/VisualStudio/ExternalAccess/FSharp/TypeForwards.cs @@ -119,6 +119,7 @@ [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToItemKind))] [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToMatchKind))] [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult))] +[assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpAdvancedNavigateToSearchService))] [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService))] [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.Navigation.FSharpDocumentNavigationService))] [assembly: TypeForwardedTo(typeof(Microsoft.CodeAnalysis.ExternalAccess.FSharp.Navigation.FSharpNavigableItem))]