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;
}