已解决: mike z 是对的,我没有正确调用基础来继续递归。谢谢,迈克
我正在使用 Roslyn 进行一些代码重写,通过实现一个SyntaxRewriter
.
我遇到的奇怪的事情是,当覆盖时SyntaxNode.VisitInvocationExpression(InvocationExpressionSyntax)
,它不会访问InvocationExpressionSyntax
树中的所有节点。(我认为所有SyntaxNode
类型都相同)
例如,给定这个调用表达式:
controller.Add(5, 6).ToString();
它只访问整个表达式的节点,即使那里有 2 次调用。
虽然我当然可以编写递归函数或类似函数来解析子/嵌套 InvocationExpression 节点,但这似乎不一致且不方便。
为什么不访问整个树中所有 * 类型的节点?
这是我的覆盖:
public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node)
{
IdentifierNameSyntax ident = node.ChildNodes().OfType<IdentifierNameSyntax>().FirstOrDefault();
if (ident == null)
return node;//In my test case, the example above returns here when it's node is encountered. Shouldn't this then allow the walker to continue deeper into the node,
// finding the deeper nested Invocations?
string name = ident.PlainName;
if (!TempStore.ConstructedInvocations.ContainsKey(name))//not replacing this then
return node;
InvocationExpressionSyntax newInvocation = ((InvocationExpressionSyntax)TempStore.ConstructedInvocations[name]).WithArgumentList(node.ArgumentList);
return newInvocation;
}
在调试中单步执行该代码确认InvocationExpressionNode
forcontroller.Add(5, 6).ToString();
确实有子InvocationExpressionNodes
嵌套在里面。