private ExpressionSyntax GenerateAsRefInitializer()

in SharpGen/Generator/ReverseCallablePrologCodeGenerator.cs [232:280]


        private ExpressionSyntax GenerateAsRefInitializer(CsMarshalCallableBase publicElement,
                                                          ExpressionSyntax nativeParameter,
                                                          TypeSyntax marshalTypeSyntax)
        {
            var refToNativeExpression = InvocationExpression(
                MemberAccessExpression(
                    SyntaxKind.SimpleMemberAccessExpression,
                    GlobalNamespace.GetTypeNameSyntax(BuiltinType.Unsafe),
                    GenericName(
                        Identifier(nameof(Unsafe.AsRef)),
                        TypeArgumentList(SingletonSeparatedList(marshalTypeSyntax))
                    )
                ),
                ArgumentList(SingletonSeparatedList(Argument(nativeParameter)))
            );

            ExpressionSyntax refToNativeClauseExpression;

            if (publicElement.IsLocalManagedReference)
            {
                Debug.Assert(
                    publicElement is CsReturnValue or CsParameter
                    {
                        Attribute: CsParameterAttribute.Ref or CsParameterAttribute.Out
                    }
                );

                refToNativeClauseExpression = RefExpression(refToNativeExpression);
            }
            else
            {
                Debug.Assert(publicElement is CsParameter {IsRefIn: true});

                if (publicElement is CsParameter {IsOptional: true})
                {
                    refToNativeClauseExpression = ConditionalExpression(
                        BinaryExpression(SyntaxKind.NotEqualsExpression, nativeParameter, DefaultLiteral),
                        refToNativeExpression,
                        DefaultLiteral
                    );
                }
                else
                {
                    refToNativeClauseExpression = refToNativeExpression;
                }
            }

            return refToNativeClauseExpression;
        }