File: CodeRefactorings\FixAllOccurences\RefactorAllContext.cs
Web Access
Project: src\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces)
// 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 Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeFixes;
using Microsoft.CodeAnalysis.CodeFixesAndRefactorings;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.CodeAnalysis.CodeRefactorings;
 
/// <summary>
/// Context for "Refactor all occurrences" for code refactorings provided by each <see cref="CodeRefactoringProvider"/>.
/// </summary>
/// <remarks>
/// TODO: Make public, tracked with https://github.com/dotnet/roslyn/issues/60703
/// </remarks>
public sealed class RefactorAllContext : IRefactorOrFixAllContext
{
    internal RefactorAllState State { get; }
 
    internal RefactorAllProvider RefactorAllProvider => State.FixAllProvider;
 
    /// <summary>
    /// Document within which refactor all occurrences was triggered.
    /// </summary>
    public Document Document => State.Document!;
 
    /// <summary>
    /// Underlying <see cref="CodeRefactoringProvider"/> which triggered this refactor all.
    /// </summary>
    public CodeRefactoringProvider CodeRefactoringProvider => State.Provider;
 
    /// <summary>
    /// <see cref="RefactorAllScope"/> to refactor all occurrences.
    /// </summary>
    public RefactorAllScope Scope => (RefactorAllScope)State.Scope;
 
    /// <summary>
    /// The <see cref="CodeAction.EquivalenceKey"/> value expected of a <see cref="CodeAction"/> participating in this
    /// refactor all.
    /// </summary>
    public string? CodeActionEquivalenceKey => State.CodeActionEquivalenceKey;
 
    /// <summary>
    /// CancellationToken for refactor all session.
    /// </summary>
    public CancellationToken CancellationToken { get; }
 
    public IProgress<CodeAnalysisProgress> Progress { get; }
 
    /// <summary>
    /// Project to refactor all occurrences within.
    /// </summary>
    public Project Project => State.Project;
 
    public Solution Solution => Project.Solution;
 
    #region IFixAllContext implementation
    IRefactorOrFixAllState IRefactorOrFixAllContext.State => this.State;
 
    IRefactorOrFixProvider IRefactorOrFixAllContext.Provider => this.CodeRefactoringProvider;
 
    string IRefactorOrFixAllContext.GetDefaultTitle() => this.GetDefaultRefactorAllTitle();
 
    IRefactorOrFixAllContext IRefactorOrFixAllContext.With(
        Optional<(Document? document, Project project)> documentAndProject,
        Optional<FixAllScope> scope,
        Optional<string?> codeActionEquivalenceKey,
        Optional<CancellationToken> cancellationToken)
    {
        var newState = State.With(documentAndProject, scope, codeActionEquivalenceKey);
        var newCancellationToken = cancellationToken.HasValue ? cancellationToken.Value : this.CancellationToken;
 
        return State == newState && CancellationToken == newCancellationToken
            ? this
            : new RefactorAllContext(newState, this.Progress, newCancellationToken);
    }
    #endregion
 
    internal RefactorAllContext(
        RefactorAllState state,
        IProgress<CodeAnalysisProgress> progressTracker,
        CancellationToken cancellationToken)
    {
        State = state;
        this.Progress = progressTracker;
        this.CancellationToken = cancellationToken;
    }
 
    /// <summary>
    /// Gets the spans to refactor by document for the <see cref="Scope"/> for this refactor all occurrences fix. If no
    /// spans are specified, it indicates the entire document needs to be refactored.
    /// </summary>
    public Task<ImmutableDictionary<Document, Optional<ImmutableArray<TextSpan>>>> GetRefactorAllSpansAsync(CancellationToken cancellationToken)
        => State.GetRefactorAllSpansAsync(cancellationToken);
 
    internal string GetDefaultRefactorAllTitle()
        => FixAllHelper.GetDefaultFixAllTitle(this.Scope.ToFixAllScope(), this.State.CodeActionTitle, this.Document, this.Project);
}