How to get a Roslyn FieldSymbol from a FieldDeclarationSyntax node?

孤人 提交于 2020-01-09 05:20:49

问题


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

回答1:


I've been here several times :)

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
}



回答2:


Can I expand on this? I'm fine with the design path they took separating these on the syntactic level. One field can declare several variables.

But on the symbol level, I find it confusing that they seem to be merged into a single symbol (i.e. IFieldSymbol), when in fact some traits are on the "field as a whole declaration", not on the variable level.

Consider IFieldSymbol.IsReadOnly for example. When declaring multiple variables as part of a single field declaration, the readonly constraint is on the field level. And so is the data type. Why would I want to access that information on every possible variable?



来源:https://stackoverflow.com/questions/27848576/how-to-get-a-roslyn-fieldsymbol-from-a-fielddeclarationsyntax-node

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!