2015-01-08 12 views
13

私はRoslynを使用して、公開されている公開されているAPIを特定しようとしています(この情報を使用してさらに処理を行うため、リフレクションだけでは使用できません)。私は、SyntaxWalkerを使用して宣言構文ノードにアクセスし、それぞれにIModel.GetDeclaredSymbolを呼び出しています。これは、メソッド、プロパティ、およびタイプでうまくいくようですが、フィールドでは機能しないようです。私の質問は、どのようにFieldDeclarationSyntaxノードのFieldSymbolを取得するのですか?FieldDeclarationSyntaxノードからRoslyn FieldSymbolを取得する方法は?

 public override void VisitFieldDeclaration(FieldDeclarationSyntax node) 
     { 
      var model = this._compilation.GetSemanticModel(node.SyntaxTree); 
      var symbol = model.GetDeclaredSymbol(node); 
      if (symbol != null 
       && symbol.CanBeReferencedByName 
       // this is my own helper: it just traverses the publ 
       && symbol.IsExternallyPublic()) 
      { 
       this._gatherer.RegisterPublicDeclaration(node, symbol); 
      } 

      base.VisitFieldDeclaration(node); 
     } 

答えて

23

私はここにきた、数回:)

あなたは、フィールドの宣言構文は複数のフィールドを宣言することができることを覚えておく必要があります。

は、ここに私が働いているコードです。だからあなたは欲しい:

foreach (var variable in node.Declaration.Variables) 
{ 
    var fieldSymbol = model.GetDeclaredSymbol(variable); 
    // Do stuff with the symbol here 
} 
+0

ありがとうございます。私はまた、これがかなり分かりましたが、これも逃しました:) – pyrocumulus

+0

ローカルのvar宣言にも適用されます。 – JamesFaix

2

これを拡張することはできますか?私は文法レベルでこれらを分け合わせたデザインパスでうまくいっています。 1つのフィールドで複数の変数を宣言できます。

しかし、シンボルレベルでは、実際にはいくつかの特質が可変レベルではなく「全体宣言としてのフィールド」にあるときに、それらが単一のシンボル(つまりIFieldSymbol)にマージされるように見えるのが混乱しています。 。

たとえば、IFieldSymbol.IsReadOnlyを考えてください。 1つのフィールド宣言の一部として複数の変数を宣言する場合、readonly制約はフィールドレベルにあります。データタイプも同様です。なぜ私は可能なすべての変数についてその情報にアクセスしたいのですか?

関連する問題