Свободный синтаксис Roslyn для создания дерева выражений для многострочной лямбда

Я пишу настраиваемый инструмент на основе Roslyn, который пытается искоренить CS0834, переписав заданные многострочные lambdas в деревья выражений во время сборки.

Изменить. На данный момент я использую только анонимные многострочные lambdas.

Например:

    // Will produce CS0834 if Bar takes Expression<Action<...>>
    Foo.Bar((int x) => { ... });

к

    Foo.Bar(Expression.Lambda<Action<int>>(
        Expression.Block(
            ...
            ),
        Expression.Parameter(typeof(int))));

Итак, это будет правильно составлено. Хотя я могу выяснить синтаксис Expression. (Blah), необходимый для преобразования данного кода, делать это с помощью Roslyn - это совсем другое дело. Возможно, я просто не знаю API-интерфейса Roslyn. (Blah) достаточно хорошо, чтобы перевести эту необработанную лямбду

    (int index, float[] a, float[] b) =>
    {
        var sum = 0f;
        for (int i = 0; i < index; i++)
            sum += a[i];

        b[index] = sum;
    });

Может ли кто-нибудь помочь мне написать синтаксис Roslyn Syntax. (blah), который будет генерировать дерево выражений, которое выглядит следующим образом:

    Expression<Action<int, float[], float[]>> action = 
        Expression.Lambda(
            Expression.Block(
                Expression.Assign(sumParameter, Expression.Constant(0)),
                Expression.Loop(...) // The for loop here
                )
            );

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

Большое спасибо, ваша помощь очень ценится.

Ответ 1

У нас инструмент под названием Quoter, который будет генерировать синтаксис. * API вызывает любую программу С#.

Вы можете просмотреть его в прямом эфире на roslynquoter.azurewebsites.net.

Если вы определяете логику генерации вызовов Expression. *, вы можете легко генерировать код, который ее генерирует.

Обновление: теперь инструмент открыт с открытым исходным кодом! https://github.com/KirillOsenkov/RoslynQuoter