Roslyn ..获取DescendantNodes

时间:2019-02-15 13:14:57

标签: c# roslyn analyzer

roslyn方法DescendantNodes()出现问题。

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

在这种情况下,当我在调试模式下使用lambda表达式时,它可以工作。但是当我构建DLL并将其作为分析器连接到项目时,它不起作用。

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

问题出在哪里,我该如何解决?

1 个答案:

答案 0 :(得分:0)

我不知道为什么调试模式对您来说会有所不同。但是,我认为您可能未正确使用方法DescendantNodes。

传递给DescendantNodes的函数是一个谓词,它确定沿语法树查找后代的算法是否继续到给定节点的子代。如果此函数返回false,则不会返回该语法树路径下的其他子项。

这与使用LINQ Where方法非常不同,后者将集合过滤为仅与谓词匹配的节点。

例如,第一个可能会在方法主体中找到所有嵌套的纯块,但找不到任何属于其他种类的语句的块,因为由于其他种类的语句本身不是块,因此将不再考虑这些块。但是,使用第二种形式(Where方法),该函数会考虑根目录下的所有节点,从而找到所有块。