2017-08-14 21 views
0

特定のメソッドの使用を検出するRoslynアナライザーを開発中です。method1私はforwhileループでこのメソッドを使用し、コード内の他のすべてのケースで問題を作成したいと考えています。Roslynでノードを見つける前にノードを見つけるには?

私はそれをどのように行うことができますか?私が開発したコードはどこにでもmethod1を検出します。関数が見つかるたびに、ループ内にあるかどうかをチェックし、ループ内にない場合にのみエラーを生成するようになりました。

+2

しかし、あなたが許可したい*入れ子のレベルは何ですか?アナライザをコールスタックからどれくらい下に移動しますか?もしあなたが 'methodN' - >' method2' - > 'method1'という呼び出しチェーンを持っていて、このチェーンを呼び出すループが' methodN'の中にあればどうでしょうか?また、実行時とコンパイル時のコードの構造が同じではないという事実について考えてみてください。実行時に 'method1'をデリゲートとしてループ内にラップする別のメソッドに渡すとどうなりますか? LINQのように 'Func'を使います。 – ironstone13

答えて

2

ループが内部にある場合、メソッド呼び出しはループ宣言の子孫になります。任意のSyntaxNodeAncestorsプロパティにアクセスできます。あなたがループまたはメンバー宣言を打つまで、あなたが検出したMethodInvocationノードの祖先の中で起き上がります。

ループ(ForStatementSyntaxまたはWhileStatementSyntax)をヒットした場合は正常です。 MemberDeclarationSyntaxノードをヒットした場合は、method1が呼び出されているブロックの開始点に達したことを意味し、おそらくエラーが発生するはずです。

この時点で、あなたの直ぐの問題はで、ほとんどがとなり、カバーしたいコーナーケースの数を決定する必要があります。ラムダ式から呼び出されるとどうなりますか? method1を呼び出すメソッドがループから呼び出されるとどうなりますか?または再帰的な方法からですか?

これらのすべてのケースを検出できますが、努力する価値があるかどうかを判断する必要があります。

関連する問題