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