protected static StatementSyntax GenerateNullCheckIfNeeded()

in SharpGen/Generator/Marshallers/MarshallerBase.cs [50:112]


        protected static StatementSyntax GenerateNullCheckIfNeeded(CsMarshalBase marshallable,
                                                                   StatementSyntax statement) =>
            IsNullable(marshallable)
                ? IfStatement(
                    BinaryExpression(SyntaxKind.NotEqualsExpression, IdentifierName(marshallable.Name), NullLiteral),
                    statement
                )
                : statement;

        protected static ExpressionSyntax GenerateNullCheckIfNeeded(CsMarshalBase marshallable,
                                                                    ExpressionSyntax expression,
                                                                    ExpressionSyntax nullAlternative) =>
            IsNullable(marshallable)
                ? ConditionalExpression(
                    BinaryExpression(SyntaxKind.EqualsExpression, IdentifierName(marshallable.Name), NullLiteral),
                    nullAlternative, expression
                )
                : expression;

        protected static StatementSyntax LoopThroughArrayParameter(
            CsMarshalBase marshallable,
            Func<ElementAccessExpressionSyntax, ElementAccessExpressionSyntax, StatementSyntax> loopBodyFactory,
            string variableName = "i")
        {
            var indexVariable = Identifier(variableName);
            var indexVariableName = IdentifierName(variableName);
            var arrayIdentifier = IdentifierName(marshallable.Name);

            var element = ElementAccessExpression(
                arrayIdentifier,
                BracketedArgumentList(SingletonSeparatedList(Argument(indexVariableName)))
            );
            var nativeElement = ElementAccessExpression(
                ParenthesizedExpression(GetMarshalStorageLocation(marshallable)),
                BracketedArgumentList(SingletonSeparatedList(Argument(indexVariableName)))
            );

            return GenerateNullCheckIfNeeded(
                marshallable,
                ForStatement(loopBodyFactory(element, nativeElement))
                   .WithDeclaration(
                        VariableDeclaration(
                            TypeInt32,
                            SeparatedList(
                                new[]
                                {
                                    VariableDeclarator(indexVariable, default, EqualsValueClause(ZeroLiteral)),
                                    VariableDeclarator(
                                        LengthIdentifier, default,
                                        EqualsValueClause(GeneratorHelpers.LengthExpression(arrayIdentifier))
                                    )
                                }
                            )))
                   .WithCondition(
                        BinaryExpression(SyntaxKind.LessThanExpression, indexVariableName, LengthIdentifierName)
                    )
                   .WithIncrementors(
                        SingletonSeparatedList<ExpressionSyntax>(
                            PrefixUnaryExpression(
                                SyntaxKind.PreIncrementExpression,
                                indexVariableName)))
            );
        }