2015-01-08 5 views
13

Próbuję użyć Roslyn do określenia publicznie eksponowanego interfejsu API projektu (a następnie wykonać dalsze przetwarzanie przy użyciu tych informacji, więc nie mogę po prostu użyć refleksji). Używam SyntaxWalker do odwiedzenia węzłów składni deklaracji i wywoływania IModel.GetDeclaredSymbol dla każdego. Wydaje się, że działa to dobrze dla metod, właściwości i typów, ale wydaje się, że nie działa na polach. Moje pytanie brzmi: w jaki sposób uzyskać FieldSymbol dla węzła FieldDeclarationSyntax?Jak uzyskać Roslyn FieldSymbol z węzła FieldDeclarationSyntax?

Oto kod pracuję z:

 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); 
     } 

Odpowiedz

23

Byłem tu kilka razy :)

Trzeba pamiętać, że składnia deklaracji pole może zadeklarować wielu pól. Więc chcesz:

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

Dziękuję, również tęskniłem za tym, mimo że jest to dość oczywiste :) – pyrocumulus

+0

Dotyczy również lokalnych deklaracji var. – JamesFaix

2

Czy mogę to rozwinąć? Nic mi nie jest na drodze do projektowania, którą rozdzielili na poziomie syntaktycznym. Jedno pole może zadeklarować kilka zmiennych.

Ale na poziomie symboli, uważam za mylące, że wydają się być połączone w jeden symbol (tj. IFieldSymbol), gdy w rzeczywistości niektóre cechy są na "polu jako całości deklaracji", a nie na poziomie zmiennym .

Weź pod uwagę np. IFieldSymbol.IsReadOnly. Deklarując wiele zmiennych jako część pojedynczej deklaracji pola, ograniczenie tylko do odczytu znajduje się na poziomie pola. I tak jest typ danych. Dlaczego chciałbym uzyskać dostęp do tych informacji o każdej możliwej zmiennej?