private static SyntaxNode Refactor(SyntaxNode node)
        {
            switch (node.Kind())
            {
            case SyntaxKind.MethodDeclaration:
                {
                    var methodDeclaration            = (MethodDeclarationSyntax)node;
                    BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(methodDeclaration.Body);

                    return(methodDeclaration
                           .WithExpressionBody(CreateExpressionBody(analysis, methodDeclaration))
                           .WithSemicolonToken(CreateSemicolonToken(methodDeclaration.Body, analysis))
                           .WithBody(null));
                }

            case SyntaxKind.ConstructorDeclaration:
                {
                    var constructorDeclaration       = (ConstructorDeclarationSyntax)node;
                    BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(constructorDeclaration.Body);

                    return(constructorDeclaration
                           .WithExpressionBody(CreateExpressionBody(analysis, constructorDeclaration))
                           .WithSemicolonToken(CreateSemicolonToken(constructorDeclaration.Body, analysis))
                           .WithBody(null));
                }

            case SyntaxKind.DestructorDeclaration:
                {
                    var destructorDeclaration        = (DestructorDeclarationSyntax)node;
                    BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(destructorDeclaration.Body);

                    return(destructorDeclaration
                           .WithExpressionBody(CreateExpressionBody(analysis, destructorDeclaration))
                           .WithSemicolonToken(CreateSemicolonToken(destructorDeclaration.Body, analysis))
                           .WithBody(null));
                }

            case SyntaxKind.LocalFunctionStatement:
                {
                    var localFunction = (LocalFunctionStatementSyntax)node;
                    BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(localFunction.Body);

                    return(localFunction
                           .WithExpressionBody(CreateExpressionBody(analysis, localFunction))
                           .WithSemicolonToken(CreateSemicolonToken(localFunction.Body, analysis))
                           .WithBody(null));
                }

            case SyntaxKind.OperatorDeclaration:
            {
                var operatorDeclaration          = (OperatorDeclarationSyntax)node;
                BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(operatorDeclaration.Body);

                return(operatorDeclaration
                       .WithExpressionBody(CreateExpressionBody(analysis, operatorDeclaration))
                       .WithSemicolonToken(CreateSemicolonToken(operatorDeclaration.Body, analysis))
                       .WithBody(null));
            }

            case SyntaxKind.ConversionOperatorDeclaration:
            {
                var operatorDeclaration          = (ConversionOperatorDeclarationSyntax)node;
                BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(operatorDeclaration.Body);

                return(operatorDeclaration
                       .WithExpressionBody(CreateExpressionBody(analysis, operatorDeclaration))
                       .WithSemicolonToken(CreateSemicolonToken(operatorDeclaration.Body, analysis))
                       .WithBody(null));
            }

            case SyntaxKind.PropertyDeclaration:
            {
                var propertyDeclaration          = (PropertyDeclarationSyntax)node;
                BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(propertyDeclaration.AccessorList);

                return(propertyDeclaration
                       .WithExpressionBody(CreateExpressionBody(analysis, propertyDeclaration))
                       .WithSemicolonToken(CreateSemicolonToken(analysis.Block, analysis))
                       .WithAccessorList(null));
            }

            case SyntaxKind.IndexerDeclaration:
            {
                var indexerDeclaration           = (IndexerDeclarationSyntax)node;
                BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(indexerDeclaration.AccessorList);

                return(indexerDeclaration
                       .WithExpressionBody(CreateExpressionBody(analysis, indexerDeclaration))
                       .WithSemicolonToken(CreateSemicolonToken(analysis.Block, analysis))
                       .WithAccessorList(null));
            }

            case SyntaxKind.GetAccessorDeclaration:
            case SyntaxKind.SetAccessorDeclaration:
            case SyntaxKind.InitAccessorDeclaration:
            case SyntaxKind.AddAccessorDeclaration:
            case SyntaxKind.RemoveAccessorDeclaration:
            {
                var accessor = (AccessorDeclarationSyntax)node;
                BlockExpressionAnalysis analysis = BlockExpressionAnalysis.Create(accessor);

                return(accessor
                       .WithExpressionBody(CreateExpressionBody(analysis, accessor))
                       .WithSemicolonToken(CreateSemicolonToken(analysis.Block, analysis))
                       .WithBody(null));
            }

            default:
            {
                SyntaxDebug.Fail(node);
                return(node);
            }
            }
        }