in SharpGen/Generator/GeneratorHelpers.cs [18:70]
private static ThrowStatementSyntax ThrowException(TypeSyntax exception, string message) =>
ThrowStatement(
ObjectCreationExpression(
exception,
ArgumentList(
message == null
? default
: SingletonSeparatedList(
Argument(LiteralExpression(SyntaxKind.StringLiteralExpression, Literal(message)))
)
),
null
)
);
private static readonly ThrowStatementSyntax ThrowPlatformNotSupportedStatement = ThrowException(
ParseTypeName("System.PlatformNotSupportedException"), null
);
internal static readonly LiteralExpressionSyntax ZeroLiteral = LiteralExpression(
SyntaxKind.NumericLiteralExpression, Literal(0)
);
public static ExpressionSyntax WrapInParentheses(ExpressionSyntax expression) =>
expression is TypeSyntax or ParenthesizedExpressionSyntax or LiteralExpressionSyntax
or InvocationExpressionSyntax or MemberAccessExpressionSyntax or ElementAccessExpressionSyntax
or MemberBindingExpressionSyntax or ThisExpressionSyntax or BaseExpressionSyntax
? expression
: ParenthesizedExpression(expression);
public static ExpressionSyntax LengthExpression(ExpressionSyntax expression) => MemberAccessExpression(
SyntaxKind.SimpleMemberAccessExpression,
WrapInParentheses(expression),
IdentifierName("Length")
);
public static ExpressionSyntax OptionalLengthExpression(ExpressionSyntax expression) => BinaryExpression(
SyntaxKind.CoalesceExpression,
ConditionalAccessExpression(
WrapInParentheses(expression),
MemberBindingExpression(IdentifierName("Length"))
),
ZeroLiteral
);
public static ExpressionSyntax CastExpression(TypeSyntax type, ExpressionSyntax expression)
{
var wrappedExpression = WrapInParentheses(expression);
return expression is CastExpressionSyntax {Type: { } castType} && castType.IsEquivalentTo(type)
? wrappedExpression
: SyntaxFactory.CastExpression(type, wrappedExpression);
}