23

I'm trying to use Roslyn to determine the publically-exposed API of a project (and then do some further processing using this information, so I can't just use reflection). I'm using a SyntaxWalker to visit declaration syntax nodes, and calling IModel.GetDeclaredSymbol for each. This seems to work well for Methods, Properties, and Types, but it doesn't seem to work on fields. My question is, how do I get the FieldSymbol for a FieldDeclarationSyntax node?

Here's the code I'm working with:

        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);
        }
ChaseMedallion
  • 20,860
  • 17
  • 88
  • 152

1 Answers1

45

You need to remember that a field declaration syntax can declare multiple fields. So you want:

foreach (var variable in node.Declaration.Variables)
{
    var fieldSymbol = model.GetDeclaredSymbol(variable);
    // Do stuff with the symbol here
}
M--
  • 25,431
  • 8
  • 61
  • 93
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • 1
    Also applies to local var declarations. – JamesFaix Dec 06 '16 at 01:14
  • 1
    And events ([examples](https://sharplab.io/#v2:EYLgZgpghgLgrgJwgZwLQFEAeAHJzkCWA9gHYBqUCBUwANigDQwhTIwA+AAgAwAEnARgDcAWABQ4zgGZ+AJl4BhcQG9xvdbwgA3CCRj8B89AIa90s0WI281Ggnt4BJE04u317/jM4AWXgFkACgBKT1UrazsHAhcCNwj1AF9xRKA=)). – Drew Noakes Feb 22 '19 at 20:15