in SharpGen/Generator/Marshallers/MarshallerBase.cs [50:112]
protected static StatementSyntax GenerateNullCheckIfNeeded(CsMarshalBase marshallable,
StatementSyntax statement) =>
IsNullable(marshallable)
? IfStatement(
BinaryExpression(SyntaxKind.NotEqualsExpression, IdentifierName(marshallable.Name), NullLiteral),
statement
)
: statement;
protected static ExpressionSyntax GenerateNullCheckIfNeeded(CsMarshalBase marshallable,
ExpressionSyntax expression,
ExpressionSyntax nullAlternative) =>
IsNullable(marshallable)
? ConditionalExpression(
BinaryExpression(SyntaxKind.EqualsExpression, IdentifierName(marshallable.Name), NullLiteral),
nullAlternative, expression
)
: expression;
protected static StatementSyntax LoopThroughArrayParameter(
CsMarshalBase marshallable,
Func<ElementAccessExpressionSyntax, ElementAccessExpressionSyntax, StatementSyntax> loopBodyFactory,
string variableName = "i")
{
var indexVariable = Identifier(variableName);
var indexVariableName = IdentifierName(variableName);
var arrayIdentifier = IdentifierName(marshallable.Name);
var element = ElementAccessExpression(
arrayIdentifier,
BracketedArgumentList(SingletonSeparatedList(Argument(indexVariableName)))
);
var nativeElement = ElementAccessExpression(
ParenthesizedExpression(GetMarshalStorageLocation(marshallable)),
BracketedArgumentList(SingletonSeparatedList(Argument(indexVariableName)))
);
return GenerateNullCheckIfNeeded(
marshallable,
ForStatement(loopBodyFactory(element, nativeElement))
.WithDeclaration(
VariableDeclaration(
TypeInt32,
SeparatedList(
new[]
{
VariableDeclarator(indexVariable, default, EqualsValueClause(ZeroLiteral)),
VariableDeclarator(
LengthIdentifier, default,
EqualsValueClause(GeneratorHelpers.LengthExpression(arrayIdentifier))
)
}
)))
.WithCondition(
BinaryExpression(SyntaxKind.LessThanExpression, indexVariableName, LengthIdentifierName)
)
.WithIncrementors(
SingletonSeparatedList<ExpressionSyntax>(
PrefixUnaryExpression(
SyntaxKind.PreIncrementExpression,
indexVariableName)))
);
}