File: Utilities\IVsEditorAdaptersFactoryServiceExtensions.cs
Web Access
Project: src\src\VisualStudio\Core\Def\Microsoft.VisualStudio.LanguageServices_ozsccwvc_wpftmp.csproj (Microsoft.VisualStudio.LanguageServices)
// 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.
 
#nullable disable
 
using System;
using System.Threading;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Text;
using Microsoft.VisualStudio.Editor;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Text;
 
namespace Microsoft.VisualStudio.LanguageServices.Utilities;
 
internal static class IVsEditorAdaptersFactoryServiceExtensions
{
    public static IOleUndoManager TryGetUndoManager(
        this IVsEditorAdaptersFactoryService editorAdaptersFactoryService,
        Microsoft.CodeAnalysis.Workspace workspace,
        DocumentId contextDocumentId,
        CancellationToken cancellationToken)
    {
        // https://github.com/dotnet/roslyn/issues/17898
        // We have a report of a null ref occurring in this method. The only place we believe 
        // this could be would be if 'document' was null. Try to catch a reasonable 
        // non -fatal-watson dump to help track down what the root cause of this might be.
        var document = workspace.CurrentSolution.GetDocument(contextDocumentId);
        if (document == null)
        {
            var message = contextDocumentId == null
                ? $"{nameof(contextDocumentId)} was null."
                : $"{nameof(contextDocumentId)} was not null.";
 
            FatalError.ReportAndCatch(new InvalidOperationException("Could not retrieve document. " + message));
 
            return null;
        }
 
        var text = document.GetTextSynchronously(cancellationToken);
        var textSnapshot = text.FindCorrespondingEditorTextSnapshot();
        var textBuffer = textSnapshot?.TextBuffer;
        return editorAdaptersFactoryService.TryGetUndoManager(textBuffer);
    }
 
    public static IOleUndoManager TryGetUndoManager(
        this IVsEditorAdaptersFactoryService editorAdaptersFactoryService, ITextBuffer subjectBuffer)
    {
        if (subjectBuffer != null)
        {
            var adapter = editorAdaptersFactoryService?.GetBufferAdapter(subjectBuffer);
            if (adapter != null)
            {
                if (ErrorHandler.Succeeded(adapter.GetUndoManager(out var manager)))
                {
                    return manager;
                }
            }
        }
 
        return null;
    }
}