Skip to content
Merged
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
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -33,7 +33,7 @@ public async Task SearchDocumentAsync(
Func<ImmutableArray<INavigateToSearchResult>, Task> onResultsFound,
CancellationToken cancellationToken)
{
if (_service == null)
if (_service is null)
return;

var results = await _service.SearchDocumentAsync(document, searchPattern, kinds, cancellationToken).ConfigureAwait(false);
Expand All @@ -52,19 +52,66 @@ public async Task SearchProjectsAsync(
Func<Task> 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 is not 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);
}
}

public async Task SearchCachedDocumentsAsync(
Solution solution,
ImmutableArray<Project> projects,
ImmutableArray<Document> priorityDocuments,
string searchPattern,
IImmutableSet<string> kinds,
Document? activeDocument,
Func<ImmutableArray<INavigateToSearchResult>, Task> onResultsFound,
Func<Task> 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 _ 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<Project> projects,
string searchPattern,
IImmutableSet<string> kinds,
Document? activeDocument,
Func<ImmutableArray<INavigateToSearchResult>, Task> onResultsFound,
Func<Task> 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 _ in projects)
await onProjectCompleted().ConfigureAwait(false);
}
}
Original file line number Diff line number Diff line change
@@ -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;

/// <summary>
/// Optional expanded API for Navigate-To. An <see cref="IFSharpNavigateToSearchService"/> 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.
/// </summary>
internal interface IFSharpAdvancedNavigateToSearchService : IFSharpNavigateToSearchService
{
/// <summary>
/// Searches the documents inside <paramref name="projects"/> for symbols that match <paramref
/// name="searchPattern"/>. 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.
/// </summary>
/// <remarks>
/// All the projects passed are for F#. Similarly, all the <paramref name="priorityDocuments"/> belong to these
/// projects. <paramref name="onProjectCompleted"/> must be called exactly once per project, whether or not
/// anything was found in it.
/// </remarks>
Task SearchCachedDocumentsAsync(
Solution solution,
ImmutableArray<Project> projects,
ImmutableArray<Document> priorityDocuments,
string searchPattern,
IImmutableSet<string> kinds,
Document? activeDocument,
Func<ImmutableArray<FSharpNavigateToSearchResult>, Task> onResultsFound,
Func<Task> onProjectCompleted,
CancellationToken cancellationToken);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<string!>!
Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<string!>! kinds, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, 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<Microsoft.CodeAnalysis.Project!> projects, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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
Expand Down Expand Up @@ -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<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<string!>!
Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.IFSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.ExternalAccess.Unified.FSharp.NavigateTo.FSharpNavigateToSearchResult!>>!
Expand Down Expand Up @@ -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<string!>!
Microsoft.VisualStudio.ExternalAccess.FSharp.Internal.NavigateTo.FSharpNavigateToSearchService.SearchCachedDocumentsAsync(Microsoft.CodeAnalysis.Solution! solution, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<string!>! kinds, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, 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<Microsoft.CodeAnalysis.Project!> projects, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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
Expand Down Expand Up @@ -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<Microsoft.CodeAnalysis.Project!> projects, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Document!> priorityDocuments, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, Microsoft.CodeAnalysis.Document? activeDocument, System.Func<System.Collections.Immutable.ImmutableArray<Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult!>, System.Threading.Tasks.Task!>! onResultsFound, System.Func<System.Threading.Tasks.Task!>! 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<string!>!
Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.IFSharpNavigateToSearchService.SearchDocumentAsync(Microsoft.CodeAnalysis.Document! document, string! searchPattern, System.Collections.Immutable.IImmutableSet<string!>! kinds, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task<System.Collections.Immutable.ImmutableArray<Microsoft.VisualStudio.ExternalAccess.FSharp.NavigateTo.FSharpNavigateToSearchResult!>>!
Expand Down
Loading