in SharpGen/Transform/RelationParser.cs [153:218]
private static ParseResult ParseSingleRelation(ExpressionSyntax item)
{
if (item is not InvocationExpressionSyntax invocationExpression)
return new ParseResult(ParseResult.ParseIssue.RelationInvocationExpected, item.Span);
var functionNameExpression = invocationExpression.Expression;
if (functionNameExpression is not IdentifierNameSyntax functionIdentifier)
return new ParseResult(
ParseResult.ParseIssue.SimpleIdentifierAsFunctionNameExpected,
functionNameExpression.Span
);
var argumentList = invocationExpression.ArgumentList.Arguments;
ParseResult ParseLengthRelation(string identifier)
{
return argumentList.Count switch
{
1 => new ParseResult(
new LengthRelation
{
Identifier = argumentList[0].Expression.ToString()
},
identifier
),
_ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
};
}
ParseResult ParseConstantValueRelation(string identifier)
{
return argumentList.Count switch
{
1 => new ParseResult(
new ConstantValueRelation
{
Value = argumentList[0].Expression
},
identifier
),
_ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
};
}
ParseResult ParseStructSizeRelation(string identifier)
{
return argumentList.Count switch
{
0 => new ParseResult(new StructSizeRelation(), identifier),
_ => new ParseResult(ParseResult.ParseIssue.ArgumentCountMismatch, argumentList.Span)
};
}
var identifierText = functionIdentifier.Identifier.ValueText;
return identifierText switch
{
"length" => ParseLengthRelation(identifierText),
"Length" => ParseLengthRelation(identifierText),
ConstReplacement => ParseConstantValueRelation(identifierText),
"Const" => ParseConstantValueRelation(identifierText),
StructSizeReplacement => ParseStructSizeRelation(identifierText),
"StructSize" => ParseStructSizeRelation(identifierText),
_ => new ParseResult(ParseResult.ParseIssue.UnknownRelation, functionIdentifier.Span)
};
}