如何使用C#Roslyn测量方法的嵌套级别
我想使用Roslyn度量方法的“嵌套级别”,例如:如果方法只包含一个表达式,则其级别为0。如果方法包含嵌套的如何使用C#Roslyn测量方法的嵌套级别,c#,nested,nodes,roslyn,C#,Nested,Nodes,Roslyn,我想使用Roslyn度量方法的“嵌套级别”,例如:如果方法只包含一个表达式,则其级别为0。如果方法包含嵌套的If(cond1)If(cond2)则其级别为1 我尝试使用Roslyn的节点,但我不明白如何只获取while或if结构的主体,而不获取其条件和其他内容。您可以使用SyntaxVisitor实现这一点:它递归地遍历语法树,并根据其类型为每个节点执行代码 您需要指定各种语句的行为方式。例如: 对于简单语句(如ExpressionStatementSyntax),只需返回0 对于嵌套语句(包
If(cond1)
If(cond2)
则其级别为1
我尝试使用Roslyn的节点,但我不明白如何只获取while或if结构的主体,而不获取其条件和其他内容。您可以使用
SyntaxVisitor
实现这一点:它递归地遍历语法树,并根据其类型为每个节点执行代码
您需要指定各种语句的行为方式。例如:
- 对于简单语句(如
),只需返回0ExpressionStatementSyntax
- 对于嵌套语句(包括
和其他几个语句),返回其子语句的深度+1。通过递归调用子对象的IfStatementSyntax
,可以获得子对象的深度Visit()
- 对于
,返回其子级的最大深度BlockSyntax
class NestingLevelVisitor : SyntaxVisitor<int>
{
public override int DefaultVisit(SyntaxNode node)
{
throw new NotSupportedException();
}
public override int VisitMethodDeclaration(MethodDeclarationSyntax node)
{
return Visit(node.Body);
}
public override int VisitBlock(BlockSyntax node)
{
return node.Statements.Select(Visit).Max();
}
public override int VisitExpressionStatement(ExpressionStatementSyntax node)
{
return 0;
}
public override int VisitIfStatement(IfStatementSyntax node)
{
int result = Visit(node.Statement);
if (node.Else != null)
{
int elseResult = Visit(node.Else.Statement);
result = Math.Max(result, elseResult);
}
return result + 1;
}
}
MethodDeclarationSyntax method = …;
int methodNestingLevel = new NestingLevelVisitor().Visit(method);
将代码张贴在您面临的问题上。我的问题是我缺乏知识,我只想知道如何获得这样的子节点:如果我们的节点是Console.WriteLine(),那么它没有子节点。我还没有密码。我只需要像“body”这样的子节点,如果没有,则需要-null。没有它,我就不知道该怎么写,我所有的尝试都是垃圾。如果您能帮助我了解如何“过滤”节点,我知道如何递归地编写它。