特定のメソッドの使用を検出するRoslynアナライザーを開発中です。method1
私はfor
とwhile
ループでこのメソッドを使用し、コード内の他のすべてのケースで問題を作成したいと考えています。Roslynでノードを見つける前にノードを見つけるには?
私はそれをどのように行うことができますか?私が開発したコードはどこにでもmethod1
を検出します。関数が見つかるたびに、ループ内にあるかどうかをチェックし、ループ内にない場合にのみエラーを生成するようになりました。
特定のメソッドの使用を検出するRoslynアナライザーを開発中です。method1
私はfor
とwhile
ループでこのメソッドを使用し、コード内の他のすべてのケースで問題を作成したいと考えています。Roslynでノードを見つける前にノードを見つけるには?
私はそれをどのように行うことができますか?私が開発したコードはどこにでもmethod1
を検出します。関数が見つかるたびに、ループ内にあるかどうかをチェックし、ループ内にない場合にのみエラーを生成するようになりました。
ループが内部にある場合、メソッド呼び出しはループ宣言の子孫になります。任意のSyntaxNode
のAncestors
プロパティにアクセスできます。あなたがループまたはメンバー宣言を打つまで、あなたが検出したMethodInvocation
ノードの祖先の中で起き上がります。
ループ(ForStatementSyntax
またはWhileStatementSyntax
)をヒットした場合は正常です。 MemberDeclarationSyntax
ノードをヒットした場合は、method1
が呼び出されているブロックの開始点に達したことを意味し、おそらくエラーが発生するはずです。
この時点で、あなたの直ぐの問題はで、ほとんどがとなり、カバーしたいコーナーケースの数を決定する必要があります。ラムダ式から呼び出されるとどうなりますか? method1
を呼び出すメソッドがループから呼び出されるとどうなりますか?または再帰的な方法からですか?
これらのすべてのケースを検出できますが、努力する価値があるかどうかを判断する必要があります。
しかし、あなたが許可したい*入れ子のレベルは何ですか?アナライザをコールスタックからどれくらい下に移動しますか?もしあなたが 'methodN' - >' method2' - > 'method1'という呼び出しチェーンを持っていて、このチェーンを呼び出すループが' methodN'の中にあればどうでしょうか?また、実行時とコンパイル時のコードの構造が同じではないという事実について考えてみてください。実行時に 'method1'をデリゲートとしてループ内にラップする別のメソッドに渡すとどうなりますか? LINQのように 'Func'を使います。 – ironstone13