を呼び出すオブジェクトを分析:ロザリン:例えば方法
SqlCommand command = new SqlCommand();
SqlDataReader datareader = command.ExecuteReader();
ここで呼び出しノードがcommand.ExecuteReader()
あります。 roslynを使用して、変数識別子トークン/ノードcommand
を起動ノードから取得するにはどうすればよいですか?この呼び出しノードは、その前に他の多くのメソッド呼び出しを持つことができると仮定する。 classA.methodA().methodB().classB.methodC(command.ExecuteReader())
であるため、node.DescendantNodes
で識別子を取得すると便利ではない可能性があります。 私が考えた解決策は、最初にExecuteReader
のスパンスタートを取得し、次にcommand
のシンボルをSymbolFinder.FindSymbolAtPosition
と呼び、ExecuteReader.SpanStart - 2
の位置でコールすることでした。しかし、このソリューションがあらゆる状況に対応できるかどうかは不明です。私が取り組んでいるアプリケーションは静的コードアナライザです。
は、それらは、単に呼び出し/単純なメンバーがアクセス連鎖されます。一番内側の呼び出し(または 'SimpleMemberAccessExpression')を取得した場合、必要なものが得られます。すべての祖先ではなく、直系の親を見てください。 –
は、ハードコーディングするのではなく、より良い方法ですか?たとえば、メソッド呼び出しのシンボルを取得し、次にシンボルから、メソッドを呼び出すオブジェクトのインスタンスを特定します。たとえば、次のようになります。 'ClassA varA = new ClassA(); varA.methodA() 'は' methodA() 'のシンボルを取得し、' varA'が呼び出すことがわかります。 –
「ハードコーディング」とはどういう意味ですか?その呼び出しが必要な場合は、呼び出しを取得するコードを記述する必要があります。 –