2015-01-08 9 views
13

Sto tentando di utilizzare Roslyn per determinare l'API esposta pubblicamente di un progetto (e quindi eseguire ulteriori elaborazioni utilizzando queste informazioni, quindi non posso semplicemente utilizzare la reflection). Sto usando un SyntaxWalker per visitare i nodi di sintassi della dichiarazione e chiamare IModel.GetDeclaredSymbol per ciascuno. Questo sembra funzionare bene per Metodi, Proprietà e Tipi, ma non sembra funzionare sui campi. La mia domanda è, come posso ottenere FieldSymbol per un nodo FieldDeclarationSyntax?Come ottenere un FieldSymbol Roslyn da un nodo FieldDeclarationSyntax?

Ecco il codice con cui sto lavorando:

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

risposta

23

Sono stato qui diverse volte :)

È necessario ricordare che una sintassi dichiarazione di campo può dichiarare più campi. Quindi vuoi:

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

Grazie, ho anche perso questo anche se è abbastanza ovvio :) – pyrocumulus

+0

Si applica anche alle dichiarazioni var locali. – JamesFaix

2

Posso espanderlo? Sto bene con il percorso di progettazione che hanno preso separandoli a livello sintattico. Un campo può dichiarare diverse variabili.

Ma a livello di simbolo, trovo confuso il fatto che sembrano essere uniti in un unico simbolo (ad esempio IFieldSymbol), quando in realtà alcuni tratti si trovano sul "campo come una dichiarazione intera", non sul livello variabile .

Considerare ad esempio IFieldSymbol.IsReadOnly. Quando si dichiarano più variabili come parte di una singola dichiarazione di campo, il vincolo di sola lettura si trova a livello di campo. E così è il tipo di dati. Perché dovrei voler accedere a quell'informazione su ogni variabile possibile?