13

次のコードを使用して、特定のメソッドへのすべての呼び出しのソリューションからリストを取得できます。

var createCommandList = new List<MethodSymbol>();
INamedTypeSymbol interfaceSymbol = 
   (from p
    in solution.Projects
    select p.GetCompilation().GetTypeByMetadataName(
        "BuySeasons.BsiServices.DataResource.IBsiDataConnection")
    ).FirstOrDefault();
foreach (ISymbol symbol in interfaceSymbol.GetMembers("CreateCommand"))
{
    if (symbol.Kind == CommonSymbolKind.Method
        && symbol is MethodSymbol)
    {
        createCommandList.Add(symbol as MethodSymbol);
    }
}
foreach (MethodSymbol methodSymbol in createCommandList)
{
    foreach (ReferencedSymbol referenceSymbol
        in methodSymbol.FindReferences(solution))
    {
        foreach (ReferenceLocation referenceLocation
            in from l
               in referenceSymbol.Locations
               orderby l.Document.FilePath
               select l)
        {
            if (referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Line ==
                referenceLocation.Location.GetLineSpan(false)
                    .EndLinePosition.Line)
            {
                Debug.WriteLine("{0} {1} at {2} {3}/{4} - {5}",
                    methodSymbol.Name,
                    "(" + String.Join(",",
                       (from p
                        in methodSymbol.Parameters
                        select p.Type.Name + " " + p.Name).ToArray()
                       ) + ")",
                Path.GetFileName(referenceLocation.Location.GetLineSpan(false)
                    .Path),
                referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Line,
                referenceLocation.Location.GetLineSpan(false)
                    .StartLinePosition.Character,
                referenceLocation.Location.GetLineSpan(false)
                    .EndLinePosition.Character));
            }
            else
            {
                throw new ApplicationException("Call spans multiple lines");
            }
        }
    }
}

しかし、これは私にのリストを与えますReferencedSymbol。これにより、メソッドが呼び出されるファイルと行番号が得られますが、メソッドが呼び出される特定の引数も取得したいと思います。私が持っているものを変換したり、Roslyn で同じ情報を取得したりするにはどうすればよいですか? (最初にメソッドを使用してソリューションをロードし、Solution.Loadループしてメソッドが定義/宣言されている場所を見つけることに注意してください(createCommandList))。

4

3 に答える 3

0

参照の特定のソース位置で参照の構文ツリーを検索して、探しているノードを見つけることができます。ツリーのルートノードからDescendentNodesのような呼び出しを使用する必要があり、おそらく、探している言語固有のノードタイプを要求する必要があります。参照ツリーにノードができたら、そのツリーのセマンティックモデルを使用して、引数に関するその他の情報を通知できます。

于 2012-06-29T19:43:17.870 に答える