Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get a Roslyn FieldSymbol from a FieldDeclarationSyntax node?

Tags:

c#

roslyn

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);
        }
like image 691
ChaseMedallion Avatar asked Jan 08 '15 20:01

ChaseMedallion


1 Answers

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 } 
like image 75
Jon Skeet Avatar answered Sep 23 '22 15:09

Jon Skeet