private PrologGenerationDelegate GetPrologBuilder()

in SharpGen/Generator/ReverseCallablePrologCodeGenerator.cs [42:100]


        private PrologGenerationDelegate GetPrologBuilder(CsMarshalCallableBase publicParameter) =>
            publicParameter.PassedByNativeReference && !publicParameter.IsArray
                ? GenerateNativeByRefProlog
                : GenerateProlog;

        private delegate IEnumerable<StatementSyntax> PrologGenerationDelegate(
            CsMarshalCallableBase publicElement, ExpressionSyntax nativeParameter, TypeSyntax nativeParameterType
        );

        private IEnumerable<StatementSyntax> GenerateProlog(CsMarshalCallableBase publicElement,
                                                            ExpressionSyntax nativeParameter,
                                                            TypeSyntax nativeParameterType)
        {
            ExpressionSyntax CastToPublicType(TypeSyntax targetType, ExpressionSyntax expression) =>
                targetType.IsEquivalentTo(nativeParameterType)
                    ? expression
                    : GeneratorHelpers.CastExpression(targetType, expression);

            var marshaller = GetMarshaller(publicElement);
            var publicType = GetPublicType(publicElement);

            var generatesMarshalVariable = marshaller.GeneratesMarshalVariable(publicElement);

            var publicTypeVariableValue = nativeParameter != null && !generatesMarshalVariable
                                              ? CastToPublicType(publicType, nativeParameter)
                                              : DefaultLiteral;

            yield return LocalDeclarationStatement(
                VariableDeclaration(
                    publicType,
                    SingletonSeparatedList(
                        VariableDeclarator(Identifier(publicElement.Name))
                           .WithInitializer(EqualsValueClause(publicTypeVariableValue))
                    )
                )
            );

            if (generatesMarshalVariable)
            {
                var marshalTypeSyntax = marshaller.GetMarshalTypeSyntax(publicElement);

                var initializerExpression = nativeParameter != null
                                                ? CastToPublicType(marshalTypeSyntax, nativeParameter)
                                                : DefaultLiteral;

                yield return LocalDeclarationStatement(
                    VariableDeclaration(
                        marshalTypeSyntax,
                        SingletonSeparatedList(
                            VariableDeclarator(
                                MarshallerBase.GetMarshalStorageLocationIdentifier(publicElement),
                                null,
                                EqualsValueClause(initializerExpression)
                            )
                        )
                    )
                );
            }
        }