public IntroduceParameterDocumentRewriter(AbstractIntroduceParameterService <TExpressionSyntax, TInvocationExpressionSyntax, TObjectCreationExpressionSyntax, TIdentifierNameSyntax> service,
                                           Document originalDocument,
                                           TExpressionSyntax expression,
                                           IMethodSymbol methodSymbol,
                                           SyntaxNode containingMethod,
                                           IntroduceParameterCodeActionKind selectedCodeAction,
                                           bool allOccurrences)
 {
     _service          = service;
     _originalDocument = originalDocument;
     _generator        = SyntaxGenerator.GetGenerator(originalDocument);
     _syntaxFacts      = originalDocument.GetRequiredLanguageService <ISyntaxFactsService>();
     _semanticFacts    = originalDocument.GetRequiredLanguageService <ISemanticFactsService>();
     _expression       = expression;
     _methodSymbol     = methodSymbol;
     _containerMethod  = containingMethod;
     _actionKind       = selectedCodeAction;
     _allOccurrences   = allOccurrences;
 }
        /// <summary>
        /// Introduces a new parameter and refactors all the call sites based on the selected code action.
        /// </summary>
        private async Task <Solution> IntroduceParameterAsync(Document originalDocument, TExpressionSyntax expression,
                                                              IMethodSymbol methodSymbol, SyntaxNode containingMethod, bool allOccurrences, IntroduceParameterCodeActionKind selectedCodeAction,
                                                              CancellationToken cancellationToken)
        {
            var methodCallSites = await FindCallSitesAsync(originalDocument, methodSymbol, cancellationToken).ConfigureAwait(false);

            var modifiedSolution = originalDocument.Project.Solution;
            var rewriter         = new IntroduceParameterDocumentRewriter(this, originalDocument,
                                                                          expression, methodSymbol, containingMethod, selectedCodeAction, allOccurrences);

            foreach (var(project, projectCallSites) in methodCallSites.GroupBy(kvp => kvp.Key.Project))
            {
                var compilation = await project.GetRequiredCompilationAsync(cancellationToken).ConfigureAwait(false);

                foreach (var(document, invocations) in projectCallSites)
                {
                    var newRoot = await rewriter.RewriteDocumentAsync(compilation, document, invocations, cancellationToken).ConfigureAwait(false);

                    modifiedSolution = modifiedSolution.WithDocumentSyntaxRoot(originalDocument.Id, newRoot);
                }
            }

            return(modifiedSolution);
        }