File: Internal\Navigation\FSharpCrossLanguageSymbolNavigationService.cs
Web Access
Project: src\src\VisualStudio\ExternalAccess\FSharp\Microsoft.CodeAnalysis.ExternalAccess.FSharp.csproj (Microsoft.CodeAnalysis.ExternalAccess.FSharp)
// 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.Composition;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.ExternalAccess.FSharp.Navigation;
using Microsoft.CodeAnalysis.Host.Mef;
using Microsoft.CodeAnalysis.Navigation;
 
namespace Microsoft.CodeAnalysis.ExternalAccess.FSharp.Internal.Navigation;
 
/// <summary>
/// Internal F# implementation of the <see cref="ICrossLanguageSymbolNavigationService"/>.  Will defer to the EA
/// layer api (<see cref="IFSharpCrossLanguageSymbolNavigationService"/>) that they will actually export to do the
/// work here.
/// </summary>
[Export(typeof(ICrossLanguageSymbolNavigationService)), Shared]
internal sealed class FSharpCrossLanguageSymbolNavigationService : ICrossLanguageSymbolNavigationService
{
    private readonly IFSharpCrossLanguageSymbolNavigationService _underlyingService;
 
    [ImportingConstructor]
    [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)]
    public FSharpCrossLanguageSymbolNavigationService(
        [Import(AllowDefault = true)] IFSharpCrossLanguageSymbolNavigationService underlyingService)
    {
        _underlyingService = underlyingService;
    }
 
    public async Task<INavigableLocation?> TryGetNavigableLocationAsync(
        string assemblyName, string documentationCommentId, CancellationToken cancellationToken)
    {
        // Only defer to actual F# service if it exists.
        if (_underlyingService is null)
            return null;
 
        var location = await _underlyingService.TryGetNavigableLocationAsync(
            assemblyName, documentationCommentId, cancellationToken).ConfigureAwait(false);
        if (location == null)
            return null;
 
        return new NavigableLocation((options, cancellationToken) =>
            location.NavigateToAsync(new FSharpNavigationOptions2(options.PreferProvisionalTab, options.ActivateTab), cancellationToken));
    }
}