2015-01-08 9 views
13

Bir projenin genel olarak maruz kaldığı API'yi belirlemek için Roslyn'i kullanmaya çalışıyorum (ve daha sonra bu bilgileri kullanarak daha fazla işlem gerçekleştiriyorum, bu yüzden yalnızca yansımayı kullanamıyorum). Bildiri sözdizimi düğümlerini ziyaret etmek ve her biri için IModel.GetDeclaredSymbol öğesini çağırmak için bir SyntaxWalker kullanıyorum. Bu Yöntemler, Özellikler ve Türler için iyi çalışıyor gibi görünüyor, ancak alanlarda çalışmak için görünmüyor. Sorum şu: Field Field sembolünü FieldDeclarationSyntax düğümüne nasıl alabilirim?Bir FieldDeclarationSyntax düğümünden Roslyn FieldSymbol nasıl alınır?

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

cevap

23

burada oldum birkaç kez :)

Bir alan beyan sözdizimi birden alanları ilan edebilir unutmamak gerekir:

İşte çalışıyorum kod. Bu nedenle:

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

Teşekkür ederim, oldukça açık olsa da bunu da özledim :) – pyrocumulus

+0

Ayrıca yerel var bildirimleri için de geçerlidir. – JamesFaix

2

Bu konuda genişletebilir miyim? Bunları sözdizimsel düzeyde ayıran tasarım yolunda iyiyim. Bir alan çeşitli değişkenler bildirebilir.

Ancak, simge seviyesinde, değişken seviyesinde değil, bazı özelliklerin "tüm deklarasyon alanı" üzerindeyken, tek bir sembolün (örn. IFieldSymbol) birleştirildiği görünmektedir. .

Örneğin, IFieldSymbol.IsReadOnly'u düşünün. Tek bir alan bildiriminin bir parçası olarak çoklu değişkenler bildirirken, salt okunur kısıtlama alan seviyesindedir. Ve veri türü de öyle. Bu bilgiye mümkün olan her değişkene neden erişmek isterdim?