Рослин.. получая DescendantNodes

У меня проблема с методом 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));

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

0 ответов

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

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

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

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

Другие вопросы по тегам