2

Roslynを使用して、コードの一部で使用されるすべてのタイプを取得したいと思います。私は次のSyntaxWalkerから始めました。

public class DependenciesCollector : SyntaxWalker
{
    public override void VisitIdentifierName(IdentifierNameSyntax node)
    {
        if (!(node.Parent is UsingDirectiveSyntax))
        {
            Console.WriteLine(node.PlainName);
        }
        base.VisitIdentifierName(node);
    }

    public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
    {
        Console.WriteLine(node.Expression + "." + node.Name);
        base.VisitMemberAccessExpression(node);
    }
}

ただし、使用されている(パーツ)タイプのみを表示するのではなく、usingステートメントも表示しますが、(ご覧のとおり)usingステートメントを表示しないようにしました。このコードの何が問題になっているのか教えていただけますか?

つまり、名前空間を除くタイプのみが必要です。これも可能ですか?(System.Consoleのようなものは問題ありませんが、Systemは問題ありません)

4

1 に答える 1

2

少し混乱しているかもしれません。このコードでは、タイプはまったく表示されません。ソースで使用されている識別子名と、任意のメンバーアクセス式(ab)が表示されます。これらの一部は型名である可能性がありますが、ほとんどの場合、それらは単なるコード式です。

メソッド本体の場合、次のように記述します。

System.Console.WriteLine("x")

構文的には、コンパイラはそれSystem.Consoleが型名であることをまだ認識していません。ペアをメンバーアクセス式として解析します。これはConsole.WriteLineパーツと同じです。

他の構文上の場所では、コンパイラーはよりよく知っています。たとえば、ローカル宣言では次のようになります。

Syntax.Console x = null;

コンパイラーSyntax.Consoleは、それが型を参照していることを認識しているため、メンバーのアクセス式ではなく、修飾された名前として解析されます。

コードで使用されているタイプを本当に知りたい場合は、セマンティックモデルを使用して、これらの点線の名前が対応するタイプシンボルを見つける必要があります。

于 2012-08-16T18:55:12.950 に答える