解決済み: 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
forの内部controller.Add(5, 6).ToString();
に子が実際にInvocationExpressionNodes
ネストされていることが確認されます。