| File: NavigateTo\AbstractNavigateToSearchService.cs | Web Access |
| Project: src\roslyn\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features) |
// 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.Generic; using System.Collections.Immutable; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.Collections; using Microsoft.CodeAnalysis.PooledObjects; using Microsoft.CodeAnalysis.Threading; namespace Microsoft.CodeAnalysis.NavigateTo; internal abstract partial class AbstractNavigateToSearchService : IAdvancedNavigateToSearchService { public static readonly IImmutableSet<string> AllKinds = [ NavigateToItemKind.Class, NavigateToItemKind.Constant, NavigateToItemKind.Delegate, NavigateToItemKind.Enum, NavigateToItemKind.EnumItem, NavigateToItemKind.Event, NavigateToItemKind.Field, NavigateToItemKind.Interface, NavigateToItemKind.Method, NavigateToItemKind.Module, NavigateToItemKind.Property, NavigateToItemKind.Structure]; public IImmutableSet<string> KindsProvided { get; } = AllKinds; public bool CanFilter => true; private static Func<ImmutableArray<RoslynNavigateToItem>, VoidResult, CancellationToken, Task> GetOnItemsFoundCallback( Solution solution, Document? activeDocument, Func<ImmutableArray<INavigateToSearchResult>, Task> onResultsFound) { return async (items, _, cancellationToken) => { using var _1 = ArrayBuilder<INavigateToSearchResult>.GetInstance(items.Length, out var results); foreach (var item in items) { var result = await item.TryCreateSearchResultAsync(solution, activeDocument, cancellationToken).ConfigureAwait(false); if (result != null) results.Add(result); } if (results.Count > 0) await onResultsFound(results.ToImmutableAndClear()).ConfigureAwait(false); }; } private static PooledDisposer<PooledHashSet<T>> GetPooledHashSet<T>(IEnumerable<T> items, out PooledHashSet<T> instance) { var disposer = PooledHashSet<T>.GetInstance(out instance); instance.AddRange(items); return disposer; } private static PooledDisposer<PooledHashSet<T>> GetPooledHashSet<T>(ImmutableArray<T> items, out PooledHashSet<T> instance) { var disposer = PooledHashSet<T>.GetInstance(out instance); instance.AddRange(items); return disposer; } private static IEnumerable<T> Prioritize<T>(IEnumerable<T> items, Func<T, bool> isPriority) { using var _ = ArrayBuilder<T>.GetInstance(out var normalItems); foreach (var item in items) { if (isPriority(item)) yield return item; else normalItems.Add(item); } foreach (var item in normalItems) yield return item; } }