private static ThrowStatementSyntax ThrowException()

in SharpGen/Generator/GeneratorHelpers.cs [18:70]


        private static ThrowStatementSyntax ThrowException(TypeSyntax exception, string message) =>
            ThrowStatement(
                ObjectCreationExpression(
                    exception,
                    ArgumentList(
                        message == null
                            ? default
                            : SingletonSeparatedList(
                                Argument(LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(message)))
                            )
                    ),
                    null
                )
            );

        private static readonly ThrowStatementSyntax ThrowPlatformNotSupportedStatement = ThrowException(
            ParseTypeName("System.PlatformNotSupportedException"), null
        );

        internal static readonly LiteralExpressionSyntax ZeroLiteral = LiteralExpression(
            SyntaxKind.NumericLiteralExpression, Literal(0)
        );

        public static ExpressionSyntax WrapInParentheses(ExpressionSyntax expression) =>
            expression is TypeSyntax or ParenthesizedExpressionSyntax or LiteralExpressionSyntax
                or InvocationExpressionSyntax or MemberAccessExpressionSyntax or ElementAccessExpressionSyntax
                or MemberBindingExpressionSyntax or ThisExpressionSyntax or BaseExpressionSyntax
                ? expression
                : ParenthesizedExpression(expression);

        public static ExpressionSyntax LengthExpression(ExpressionSyntax expression) => MemberAccessExpression(
            SyntaxKind.SimpleMemberAccessExpression,
            WrapInParentheses(expression),
            IdentifierName("Length")
        );

        public static ExpressionSyntax OptionalLengthExpression(ExpressionSyntax expression) => BinaryExpression(
            SyntaxKind.CoalesceExpression,
            ConditionalAccessExpression(
                WrapInParentheses(expression),
                MemberBindingExpression(IdentifierName("Length"))
            ),
            ZeroLiteral
        );

        public static ExpressionSyntax CastExpression(TypeSyntax type, ExpressionSyntax expression)
        {
            var wrappedExpression = WrapInParentheses(expression);

            return expression is CastExpressionSyntax {Type: { } castType} && castType.IsEquivalentTo(type)
                ? wrappedExpression
                : SyntaxFactory.CastExpression(type, wrappedExpression);
        }