【发布时间】:2018-11-19 18:49:44
【问题描述】:
rebuild for 语句有问题。我想重建片段代码:
FOR(j, variable or integer, integer, > or < or <= or >=, - or +);
到
for(var j = variable or integer; j > or < or >= or <= 15; j-- or j++){}
例如FOR(j, k, >, -); -> for(var j = k; j > 15; j--){}。此外,我不知道如何将列表<ArgumentListSyntax> 上的元素分隔为IdentifierNameSyntax 或LiteralExpressionSyntax,当列表上会有两个IdentifierNameSyntax 或LiteralExpressionSyntax 时。所以不知道我的尝试是否正确。
public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
{
// FOR(j, k, 10, >, -);
if (node.Kind() == SyntaxKind.InvocationExpression)
{
InvocationExpressionSyntax invocationExpression = node;
if (invocationExpression.GetFirstToken().ToString() == "FOR")
{
//List<ArgumentSyntax> argumentList = new List<ArgumentSyntax>();
//List<IdentifierNameSyntax> test = new List<IdentifierNameSyntax>();
var tmp = node.ChildNodes().OfType<ArgumentListSyntax>().FirstOrDefault();
var tmp1 = tmp.ChildNodes().OfType<ArgumentSyntax>().FirstOrDefault();
var tmp2 = tmp1.ChildNodes().OfType<IdentifierNameSyntax>().FirstOrDefault();
var tmp3 = tmp.Arguments.ElementAt(1);
var tmp4 = tmp3.ChildNodes().OfType<IdentifierNameSyntax>().FirstOrDefault();
Console.WriteLine(tmp.Arguments.ElementAt(0));
Console.WriteLine(tmp.Arguments);
Console.WriteLine(tmp2.GetFirstToken());
Console.WriteLine(tmp4);
node = node.ReplaceNode(node, SyntaxFactory.ForStatement(SyntaxKind.ForKeyword, SyntaxKind.OpenParenToken,
SyntaxFactory.VariableDeclaration(SyntaxFactory.IdentifierName("var"), )));
}
}
return base.VisitInvocationExpression(node);
}
【问题讨论】: