File: ExternalAccess\VSTypeScript\Api\VSTypeScriptDocumentNavigationServiceWrapper.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.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);
        });
    }
}