private static async Task <CompilationUnitSyntax> GeneratePartialDeclaration(Document document, TypeDeclarationSyntax typeDecl, bool isOptional, CancellationToken cancellationToken)
        {
            var properties = typeDecl.Members.OfType <PropertyDeclarationSyntax>().Where(p => p.IsAutoProperty());
            var newCtor    = GenerateConstructor(typeDecl.Identifier.Text, properties, isOptional);

            var name        = typeDecl.Identifier.Text;
            var newTypeDecl = typeDecl.CreatePartialTypeDelaration()
                              .AddMembers(newCtor)
                              .WithAdditionalAnnotations(Formatter.Annotation);

            var ns = typeDecl.FirstAncestorOrSelf <NamespaceDeclarationSyntax>()?.Name.WithoutTrivia().GetText().ToString();

            MemberDeclarationSyntax topDecl;

            if (ns != null)
            {
                topDecl = NamespaceDeclaration(IdentifierName(ns))
                          .AddMembers(newTypeDecl)
                          .WithAdditionalAnnotations(Formatter.Annotation);
            }
            else
            {
                topDecl = newTypeDecl;
            }

            var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false) as CompilationUnitSyntax;

            return(CompilationUnit().AddUsings(root.Usings.ToArray())
                   .AddMembers(topDecl)
                   .WithTrailingTrivia(CarriageReturnLineFeed)
                   .WithAdditionalAnnotations(Formatter.Annotation));
        }