Вам не нужно разделять элементы в ArgumentListSyntax
на литералы или идентификаторы, потому что у вас фактически есть формальная структура поддержки вызова: FOR(j, variable|integer, variable|integer, >|<|<=|>=, -|+);
, поэтому вы предполагаете, что второй и третий аргументы могут быть литералами или идентификаторами.четвертый элемент сравнения и так далее.Поэтому вам нужно проверить, что входные аргументы удовлетворяют этим условиям, и если они выполнимы, сделайте что-нибудь полезное:
...
// FOR(j, variable | integer, variable | integer, > | < | <= | >=, - | +);
if (node.Expression is IdentifierNameSyntax identifier && identifier.Identifier.ValueText.Equals("FOR"))
{
var arguments = node.ArgumentList.Arguments;
if (arguments.Count != 5) return node;
var second = arguments[1].Expression;
switch (second)
{
case IdentifierNameSyntax variable:
// and some sepcific logic for identifier
break;
case LiteralExpressionSyntax literal when literal.Kind() == SyntaxKind.NumericLiteralExpression:
// and some sepcific logic for literals and check,
// that the input literal is integer and is not rational value
break;
default:
// current argument isn't literal or identifier you can not do anything
return node;
}
// do the similar check for the other arguments
// and replace node as you wish
...
}
Если вы все еще предполагаете, что ваш вызов может содержать пару других узлов в качестве аргументов, например for(j, "foo", "foo", method(), initValue, method(), 15, >, >, >, -, "foo")
вам нужно будет принимать аргументы по другой логике, например, взять первый литерал или идентификатор или что-то еще:
...
// the same code from the example above
// here you can use an another logic to retrieve expression that you want
var second = arguments.First(x => x.IsKind(SyntaxKind.NumericLiteralExpression) || x.IsKind(SyntaxKind.IdentifierName)).Expression;
switch (second)
{
// the same code from the example above
}
// the same code from the example above
...
}