File: ExtractMethod\ExtractMethodResult.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.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.ExtractMethod;
 
internal sealed class ExtractMethodResult
{
    /// <summary>
    /// True if the extract method operation succeeded.
    /// </summary>
    public bool Succeeded { get; }
 
    /// <summary>
    /// The reasons why the extract method operation did not succeed.
    /// </summary>
    public ImmutableArray<string> Reasons { get; }
 
    private readonly AsyncLazy<(Document document, SyntaxToken? invocationNameToken)>? _lazyData;
 
    internal ExtractMethodResult(
        bool succeeded,
        ImmutableArray<string> reasons,
        Func<CancellationToken, Task<(Document document, SyntaxToken? invocationNameToken)>>? getDocumentAsync)
    {
        Succeeded = succeeded;
 
        Reasons = reasons.NullToEmpty();
 
        if (getDocumentAsync != null)
            _lazyData = AsyncLazy.Create(getDocumentAsync);
    }
 
    public static ExtractMethodResult Fail(OperationStatus status)
        => new(status.Succeeded, status.Reasons, getDocumentAsync: null);
 
    public static ExtractMethodResult Success(
        OperationStatus status,
        Func<CancellationToken, Task<(Document document, SyntaxToken? invocationNameToken)>> getDocumentAsync)
    {
        return new(status.Succeeded, status.Reasons, getDocumentAsync);
    }
 
    public Task<(Document document, SyntaxToken? invocationNameToken)> GetDocumentAsync(CancellationToken cancellationToken)
        => _lazyData!.GetValueAsync(cancellationToken);
}