File: NavigableSymbols\NavigableSymbolService.NavigableSymbolSource.cs
Web Access
Project: ..\..\..\src\EditorFeatures\Core.Wpf\Microsoft.CodeAnalysis.EditorFeatures.Wpf_bciks2fd_wpftmp.csproj (Microsoft.CodeAnalysis.EditorFeatures.Wpf)
// 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.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.BackgroundWorkIndicator;
using Microsoft.CodeAnalysis.Shared.Extensions;
using Microsoft.CodeAnalysis.Text;
using Microsoft.CodeAnalysis.Text.Shared.Extensions;
using Microsoft.VisualStudio.Language.Intellisense;
using Microsoft.VisualStudio.Text;
using Microsoft.VisualStudio.Text.Editor;
 
namespace Microsoft.CodeAnalysis.Editor.NavigableSymbols
{
    internal partial class NavigableSymbolService
    {
        private sealed class NavigableSymbolSource : INavigableSymbolSource
        {
            private readonly NavigableSymbolService _service;
            private readonly ITextView _textView;
 
            private bool _disposed;
 
            public NavigableSymbolSource(
                NavigableSymbolService service,
                ITextView textView)
            {
                _service = service;
                _textView = textView;
            }
 
            public void Dispose()
                => _disposed = true;
 
            public async Task<INavigableSymbol?> GetNavigableSymbolAsync(SnapshotSpan triggerSpan, CancellationToken cancellationToken)
            {
                if (_disposed)
                    return null;
 
                var snapshot = triggerSpan.Snapshot;
                var position = triggerSpan.Start;
                var document = snapshot.GetOpenDocumentInCurrentContextWithChanges();
                if (document == null)
                    return null;
 
                var service = document.GetLanguageService<IAsyncGoToDefinitionService>();
                if (service == null)
                    return null;
 
                var (navigableLocation, symbolSpan) = await service.FindDefinitionLocationAsync(
                    document, position, includeType: false, cancellationToken).ConfigureAwait(false);
                if (navigableLocation == null)
                    return null;
 
                var indicatorFactory = document.Project.Solution.Services.GetRequiredService<IBackgroundWorkIndicatorFactory>();
 
                return new NavigableSymbol(
                    _service,
                    _textView,
                    navigableLocation,
                    snapshot.GetSpan(symbolSpan.ToSpan()),
                    indicatorFactory);
            }
        }
    }
}