File: PullMemberUp\Dialog\PullMemberUpWithDialogCodeAction.cs
Web Access
Project: ..\..\..\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.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.CodeActions;
using Microsoft.CodeAnalysis.CodeGeneration;
using Microsoft.CodeAnalysis.CodeRefactorings.PullMemberUp.Dialog;
using Microsoft.CodeAnalysis.PullMemberUp;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.CodeRefactorings.PullMemberUp
{
    internal abstract partial class AbstractPullMemberUpRefactoringProvider
    {
        private sealed class PullMemberUpWithDialogCodeAction : CodeActionWithOptions
        {
            /// <summary>
            /// Member which user initially selects. It will be selected initially when the dialog pops up.
            /// </summary>
            private readonly ImmutableArray<ISymbol> _selectedMembers;
            private readonly Document _document;
            private readonly IPullMemberUpOptionsService _service;
            private readonly CleanCodeGenerationOptionsProvider _fallbackOptions;
 
            public override string Title => FeaturesResources.Pull_members_up_to_base_type;
 
            public PullMemberUpWithDialogCodeAction(
                Document document,
                ImmutableArray<ISymbol> selectedMembers,
                IPullMemberUpOptionsService service,
                CleanCodeGenerationOptionsProvider fallbackOptions)
            {
                _document = document;
                _selectedMembers = selectedMembers;
                _service = service;
                _fallbackOptions = fallbackOptions;
            }
 
            public override object GetOptions(CancellationToken cancellationToken)
            {
                return _service.GetPullMemberUpOptions(_document, _selectedMembers);
            }
 
            protected override async Task<IEnumerable<CodeActionOperation>> ComputeOperationsAsync(object options, CancellationToken cancellationToken)
            {
                if (options is PullMembersUpOptions pullMemberUpOptions)
                {
                    var changedSolution = await MembersPuller.PullMembersUpAsync(_document, pullMemberUpOptions, _fallbackOptions, cancellationToken).ConfigureAwait(false);
                    return new[] { new ApplyChangesOperation(changedSolution) };
                }
                else
                {
                    // If user click cancel button, options will be null and hit this branch
                    return SpecializedCollections.EmptyEnumerable<CodeActionOperation>();
                }
            }
        }
    }
}