Отказ от ответственности
Я почти уверен, что упускаю что-то очевидное, но даже после прочтения официальной документации я не совсем понимаю, как Roslyn создает синтаксическое дерево.
Пример
Рассмотрим следующий простой код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace aopsample
{
class UsbReadWriter
{
public bool ReadFromUsb()
{
return true;
}
public virtual bool WriteToUsb()
{
return true;
}
}
}
Я получаю SyntaxTree
за этот код и делаю что-то вроде этого, очень грубо и просто, но мне просто нужно понять.
string[]lines = System.IO.File.ReadAllLines(filename);
string tocompile = string.Join(string.Empty, lines);
SyntaxNode root = tree.GetRoot(new CancellationToken());
foreach (SyntaxNode sn in root.ChildNodes())
{
if (sn.Kind == SyntaxKind.NamespaceDeclaration)
{
//I get a namespace, so it's Child node just will be class
foreach (SyntaxNode sname in sn.ChildNodes())
{
if (sname.Kind == SyntaxKind.ClassDeclaration)
{
//I get class, so it's Children will be methods of the class
foreach (SyntaxNode sclass in sname.ChildNodes()) // **{1}**
{
if (sclass.Kind == SyntaxKind.MethodDeclaration)
{
}
}
}
}
И это работает очень хорошо.
Беда
Но, достаточно добавить к методу ReadFromUsb()
комментарий, примерно такой
/// <summary>
/// Reads a data from Usb
/// </summary>
/// <returns></returns>
public bool ReadFromUsb()
{
return true;
}
И вызов ChildNodes()
на отмеченной строке {1} для CLASS (???) возвращает 0.
Вопрос
Почему добавление комментария к функции-члену сбрасывает коллекцию родительских дочерних узлов синтаксиса CLASS?
Что мне не хватает?