Подтвердить что ты не робот

Как получить Roslyn FieldSymbol из FieldDeclarationSyntax node?

Я пытаюсь использовать Roslyn для определения публично открытого API проекта (а затем сделайте некоторую дополнительную обработку с использованием этой информации, поэтому я не могу просто использовать отражение). Я использую SyntaxWalker для посещения узлов синтаксиса объявлений и вызова IModel.GetDeclaredSymbol для каждого. Это, похоже, хорошо работает для методов, свойств и типов, но, похоже, оно не работает в полях. Мой вопрос: как мне получить FieldSymbol для FieldDeclarationSyntax node?

Здесь код, с которым я работаю:

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

Ответ 1

Я был здесь несколько раз:)

Вы должны помнить, что синтаксис объявления поля может объявлять несколько полей. Итак, вы хотите:

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

Ответ 2

Могу ли я расширить это? Я в порядке с пути проектирования, который они разделили, на синтаксическом уровне. Одно поле может объявлять несколько переменных.

Но на уровне символа я сбиваю с толку, что они, похоже, объединены в один символ (т.е. IFieldSymbol), когда на самом деле некоторые черты находятся в "поле как целое объявление", а не на переменной уровень.

Рассмотрим, например, IFieldSymbol.IsReadOnly. При объявлении нескольких переменных как части одного объявления поля ограничение чтения зависит от уровня поля. Так же и тип данных. Почему я хочу получить доступ к этой информации для каждой возможной переменной?