public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { var(document, span, cancellationToken) = context; var service = document.Project.Solution.Services.GetService <IMoveStaticMembersOptionsService>(); if (service == null) { return; } var selectedMemberNodes = await GetSelectedNodesAsync(context).ConfigureAwait(false); if (selectedMemberNodes.IsEmpty) { return; } var semanticModel = await document.GetRequiredSemanticModelAsync(cancellationToken).ConfigureAwait(false); if (semanticModel == null) { return; } var memberNodeSymbolPairs = selectedMemberNodes .SelectAsArray(m => (node: m, symbol: semanticModel.GetRequiredDeclaredSymbol(m, cancellationToken))) // Use same logic as pull members up for determining if a selected member // is valid to be moved into a base .WhereAsArray(pair => MemberAndDestinationValidator.IsMemberValid(pair.symbol) && pair.symbol.IsStatic); if (memberNodeSymbolPairs.IsEmpty) { return; } var selectedMembers = memberNodeSymbolPairs.SelectAsArray(pair => pair.symbol); var containingType = selectedMembers.First().ContainingType; Contract.ThrowIfNull(containingType); if (selectedMembers.Any(m => !m.ContainingType.Equals(containingType))) { return; } // we want to use a span which covers all the selected viable member nodes, so that more specific nodes have priority var memberSpan = TextSpan.FromBounds( memberNodeSymbolPairs.First().node.FullSpan.Start, memberNodeSymbolPairs.Last().node.FullSpan.End); var action = new MoveStaticMembersWithDialogCodeAction(document, service, containingType, context.Options, selectedMembers); context.RegisterRefactoring(action, memberSpan); }
public override async Task ComputeRefactoringsAsync(CodeRefactoringContext context) { var(document, span, cancellationToken) = context; var service = document.Project.Solution.Workspace.Services.GetService <IMoveStaticMembersOptionsService>(); if (service == null) { return; } var memberDeclaration = await GetSelectedNodeAsync(context).ConfigureAwait(false); if (memberDeclaration == null) { return; } var semanticModel = await document.GetRequiredSemanticModelAsync(cancellationToken).ConfigureAwait(false); if (semanticModel == null) { return; } var selectedType = semanticModel.GetEnclosingNamedType(span.Start, cancellationToken); if (selectedType == null) { return; } var selectedMembers = selectedType.GetMembers() .WhereAsArray(m => m.IsStatic && MemberAndDestinationValidator.IsMemberValid(m) && m.DeclaringSyntaxReferences.Any(sr => memberDeclaration.FullSpan.Contains(sr.Span))); if (selectedMembers.IsEmpty) { return; } var syntaxFacts = document.GetRequiredLanguageService <ISyntaxFactsService>(); var action = new MoveStaticMembersWithDialogCodeAction(document, span, service, selectedType, context.Options, selectedMember: selectedMembers[0]); context.RegisterRefactoring(action, selectedMembers[0].DeclaringSyntaxReferences[0].Span); }