Как посчитать вложенность лямбда-выражений и анонимных методов?

Я пытался разобрать код и посчитать вложенность, но у меня проблемы с лямбда-выражением и анонимными методами. Я пытался использовать 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.");
}

person user3398662    schedule 09.03.2014    source источник
comment
Как именно не работает? Не могли бы вы предоставить пример кода, а также то, что вы ожидаете, и каков на самом деле результат?   -  person svick    schedule 09.03.2014
comment
Образцы, которые вы опубликовали, а затем быстро удалили, не являются допустимым кодом C#. В любом случае, если вы хотите опубликовать код, вероятно, лучше всего отредактировать вопрос, а не публиковать комментарий.   -  person svick    schedule 09.03.2014
comment
код на этих примерах может быть неверным, т.к. он писался только для разбора   -  person user3398662    schedule 09.03.2014


Ответы (1)


Когда синтаксический посетитель сталкивается с типом узла, который не имеет переопределенного метода Visit, он просто возвращает 0.

И вы не переопределяете VisitLocalDeclarationStatement, так что именно это и происходит, независимо от того, какое выражение находится внутри этого оператора.

Что вам нужно для обработки сложных выражений внутри локальных объявлений, это что-то вроде:

public override int VisitLocalDeclarationStatement(
    LocalDeclarationStatementSyntax node)
{
    return node.Declaration.Variables.Select(Visit).Max();
}

public override int VisitVariableDeclarator(VariableDeclaratorSyntax node)
{
    if (node.Initializer == null)
        return 0;

    return Visit(node.Initializer.Value);
}

Вам также понадобится аналогичный код для всех случаев, когда лямбда может появиться внутри другого выражения.

По этой причине мой исходный NestingLevelVisitor выдает исключение DefaultVisit: таким образом вы можете обнаружить типы узлов, которые вам не нужны. t еще не обработаны, и вы вынуждены явно указать, как с ними обращаться (вместо того, чтобы по умолчанию все «возвращать 0»).

person svick    schedule 09.03.2014
comment
Можете ли вы помочь мне, как переопределить узлы, что мне нужно? - person user3398662; 09.03.2014
comment
Я понял об анонимных методах, но у меня все еще есть проблемы с лямбда-выражением - person user3398662; 10.03.2014