Рослин .. получая DescendantNodes - PullRequest
0 голосов
/ 15 февраля 2019

У меня проблема с методом Roslyn DescendantNodes () .. С этой строкой

var blockNodes = root.DescendantNodes(n => n.IsKind(SyntaxKind.Block))

Когда я использую лямбда-выражение в этом случае в режиме отладки, оно работает .. Но когда я собираю DLL и подключаю еепроектировать как анализатор, он не работает .. Он работает только тогда, когда я переписываю его так:

var nodes = root.DescendantNodes();
var blockNodes = nodes.Where(n => n.IsKind(SyntaxKind.Block));

Где проблема и как я могу это исправить?

1 Ответ

0 голосов
/ 03 апреля 2019

Я не знаю, почему режим отладки работает по-другому для вас.Тем не менее, я думаю, что вы можете использовать метод DescendantNodes неправильно.

Функция, которая передается в DescendantNodes, является предикатом, который определяет, продолжается ли алгоритм, идущий вниз по синтаксическому дереву, находящему потомков, дочерним узлам данного узла или нет.Если эта функция возвращает false, дополнительные дочерние элементы в этом пути синтаксического дерева не возвращаются.

Это очень отличается от использования метода LINQ Where, который фильтрует набор только для узлов, соответствующих предикату.

Например, первый может найти все вложенные чистые блоки в теле метода, но не найти блоков, являющихся частью других типов операторов, поскольку они никогда не будут рассматриваться, потому что другие типы операторов не являются самими блоками.,Однако, используя вторую форму (метод Where), функция рассматривает все узлы в корне и, таким образом, находит все блоки.

...