public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { // Currently support to pull field, method, event, property and indexer up, // constructor, operator and finalizer are excluded. var document = context.Document; var cancellationToken = context.CancellationToken; var semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false); var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var selectedMemberNode = await GetMatchedNodeAsync(document, context.Span, cancellationToken).ConfigureAwait(false); if (selectedMemberNode == null) { return; } var selectedMember = semanticModel.GetDeclaredSymbol(selectedMemberNode); if (selectedMember == null || selectedMember.ContainingType == null) { return; } if (!MemberAndDestinationValidator.IsMemberValid(selectedMember)) { return; } if (!IsSelectionValid(context.Span, selectedMemberNode)) { return; } var allDestinations = FindAllValidDestinations( selectedMember, document.Project.Solution, cancellationToken); if (allDestinations.Length == 0) { return; } var allActions = allDestinations.Select(destination => MembersPuller.TryComputeCodeAction(document, selectedMember, destination)) .WhereNotNull().Concat(new PullMemberUpWithDialogCodeAction(document, selectedMember, _service)) .ToImmutableArray(); var nestedCodeAction = new CodeActionWithNestedActions( string.Format(FeaturesResources.Pull_0_up, selectedMember.ToNameDisplayString()), allActions, isInlinable: true); context.RegisterRefactoring(nestedCodeAction); }
protected async override Task <IEnumerable <CodeActionOperation> > ComputeOperationsAsync(object options, CancellationToken cancellationToken) { if (options is PullMembersUpOptions pullMemberUpOptions) { var changedSolution = await MembersPuller.PullMembersUpAsync(_document, pullMemberUpOptions, cancellationToken).ConfigureAwait(false); return(new[] { new ApplyChangesOperation(changedSolution) }); } else { // If user click cancel button, options will be null and hit this branch return(Array.Empty <CodeActionOperation>()); } }