Я пытался разобрать код и посчитать вложенность, но у меня проблемы с лямбда-выражением и анонимными методами. Я пытался использовать VisitSimpleLambdaExpression() и VisitAnonymousMethodExpression(), но это мне не помогло. Расскажите мне еще одну идею для подсчета вложенности лямбда-выражений и анонимных методов? Мой текущий код:
class NestingLevelVisitor : SyntaxVisitor<int>
{
public override int VisitMethodDeclaration(MethodDeclarationSyntax node)
{
return Visit(node.Body);
}
public override int VisitBlock(BlockSyntax node)
{
if (node.Statements.Select(Visit).Count() == 0)
return 0;
return node.Statements.Select(Visit).Max();
}
public override int VisitExpressionStatement(ExpressionStatementSyntax node)
{
return 0;
}
public override int VisitAnonymousMethodExpression(AnonymousMethodExpressionSyntax node)
{
int result = Visit(node.Block);
return result + 1; //dont works
}
public override int VisitSimpleLambdaExpression(SimpleLambdaExpressionSyntax node)
{
Console.WriteLine(node.Body);
int result = Visit(node.Body);
return result + 1; //dont works
}
}
UPD: этот пример демонстрирует лямбда-выражение с фигурными скобками:
class Program
{
static void Main()
{
int m = 0;
document =>
{
return new InsertRequest(nominalType, document);
};
}
}
и вложенность = 1
но если я использую такую конструкцию:
bool f2()
{
int a = 1;
Func< bool, bool> not = b =>!b;
return 1;
}
вложение не меняется
этот метод содержит анонимный метод и вложенность этого метода = 1:
static void Main()
{
Printer p = delegate(string j)
{
System.Console.WriteLine(j);
};
p("The delegate using the anonymous method is called.");
p = new Printer(TestClass.DoWork);
p("The delegate using the named method is called.");
}