in SharpGen/Generator/Marshallers/MarshallerBase.cs [114:175]
protected static StatementSyntax CreateMarshalStructStatement(
CsMarshalBase marshallable,
StructMarshalMethod marshalMethod,
ExpressionSyntax publicElementExpr,
ExpressionSyntax marshalElementExpr)
{
StatementSyntaxList statements = new();
var marshalArgument = Argument(marshalElementExpr).WithRefOrOutKeyword(Token(SyntaxKind.RefKeyword));
if (marshallable.PublicType is CsStruct {GenerateAsClass: true} structType &&
marshalMethod == StructMarshalMethod.From)
{
var constructor = ObjectCreationExpression(ParseTypeName(structType.QualifiedName));
var argumentList = !structType.HasCustomMarshal
? ArgumentList(SingletonSeparatedList(marshalArgument))
: ArgumentList();
statements.Add(
ExpressionStatement(
AssignmentExpression(
SyntaxKind.SimpleAssignmentExpression,
publicElementExpr, constructor.WithArgumentList(argumentList)
)
)
);
if (!structType.HasCustomMarshal)
return statements.ToStatement();
}
var methodName = IdentifierName($"__Marshal{marshalMethod}");
var invocationExpression = marshallable.IsStaticMarshal
? InvocationExpression(
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
ParseTypeName(marshallable.PublicType.QualifiedName), methodName
),
ArgumentList(
SeparatedList(
new[]
{
Argument(publicElementExpr)
.WithRefOrOutKeyword(Token(SyntaxKind.RefKeyword)),
marshalArgument
}
)
)
)
: InvocationExpression(
MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
publicElementExpr, methodName
),
ArgumentList(SingletonSeparatedList(marshalArgument))
);
statements.Add(GenerateNullCheckIfNeeded(marshallable, ExpressionStatement(invocationExpression)));
return statements.ToStatement();
}