private static async Task <Solution> CreateFiles(Document document, SyntaxNode root,
                                                         SemanticModel model, ImmutableArray <TypeToRemove> typesToRemove,
                                                         Func <string, string> typeFolderGenerator,
                                                         CancellationToken token)
        {
            var project   = document.Project;
            var workspace = project.Solution.Workspace;

            project = ExtractTypesToFilesCodeRefactoringProvider.MoveTypeNodes(
                model, typesToRemove, typeFolderGenerator, project, token);

            var newRoot = root.RemoveNodes(
                typesToRemove.Select(_ => _.Declaration),
                SyntaxRemoveOptions.AddElasticMarker);

            var newSolution = project.Solution;
            var projectId   = project.Id;

            newSolution = newSolution.WithDocumentSyntaxRoot(document.Id, newRoot);

            var newDocument = newSolution.GetProject(project.Id).GetDocument(document.Id);

            newRoot = await newDocument.GetSyntaxRootAsync(token);

            var newModel = await newDocument.GetSemanticModelAsync(token);

            var newUsings = newRoot.GenerateUsingDirectives(newModel);

            newRoot = newRoot.RemoveNodes(
                newRoot.DescendantNodes(_ => true).OfType <UsingDirectiveSyntax>(),
                SyntaxRemoveOptions.AddElasticMarker);

            newRoot = (newRoot as CompilationUnitSyntax)?.WithUsings(newUsings);
            return(newSolution.WithDocumentSyntaxRoot(document.Id, newRoot));
        }