File: ExternalAccess\VSTypeScript\Api\VSTypeScriptDocumentNavigationServiceWrapper.cs
Web Access
Project: src\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.Threading;
using Microsoft.CodeAnalysis.Navigation;
using Microsoft.CodeAnalysis.Options;
using Microsoft.CodeAnalysis.Shared.Utilities;
 
namespace Microsoft.CodeAnalysis.ExternalAccess.VSTypeScript.Api;
 
internal readonly struct VSTypeScriptDocumentNavigationServiceWrapper(
    IDocumentNavigationService underlyingObject,
    IWorkspaceThreadingServiceProvider threadingProvider)
{
    private readonly IDocumentNavigationService _underlyingObject = underlyingObject;
    private readonly IWorkspaceThreadingServiceProvider _threadingProvider = threadingProvider;
 
    public static VSTypeScriptDocumentNavigationServiceWrapper Create(Workspace workspace)
        => new(workspace.Services.GetRequiredService<IDocumentNavigationService>(),
               workspace.Services.GetRequiredService<IWorkspaceThreadingServiceProvider>());
 
    [Obsolete("Call overload that takes a CancellationToken", error: false)]
    public bool TryNavigateToPosition(Workspace workspace, DocumentId documentId, int position, int virtualSpace = 0, OptionSet? options = null)
        => this.TryNavigateToPosition(workspace, documentId, position, virtualSpace, options, CancellationToken.None);
 
    [Obsolete("Call overload that doesn't take options", error: false)]
    public bool TryNavigateToPosition(Workspace workspace, DocumentId documentId, int position, int virtualSpace, OptionSet? options, CancellationToken cancellationToken)
    {
        var obj = _underlyingObject;
        return _threadingProvider.Service.Run(async () =>
        {
            var location = await obj.GetLocationForPositionAsync(
                workspace, documentId, position, virtualSpace, allowInvalidPosition: false, cancellationToken).ConfigureAwait(false);
            return location != null &&
                await location.NavigateToAsync(NavigationOptions.Default, cancellationToken).ConfigureAwait(false);
        });
    }
 
    public bool TryNavigateToPosition(Workspace workspace, DocumentId documentId, int position, int virtualSpace, CancellationToken cancellationToken)
    {
        var obj = _underlyingObject;
        return _threadingProvider.Service.Run(async () =>
        {
            var location = await obj.GetLocationForPositionAsync(
                workspace, documentId, position, virtualSpace, allowInvalidPosition: false, cancellationToken).ConfigureAwait(false);
            return location != null &&
                await location.NavigateToAsync(NavigationOptions.Default, cancellationToken).ConfigureAwait(false);
        });
    }
}