Мне интересно, как можно определить длину (количество строк) при анализе кода с использованием компилятора Roslyn. На данный момент я разрабатываю закон, запрещающий использование лямбда более 10 строк.Определить длину выражения лямбда с помощью Roslyn
Посмотрев на пример ниже, как я могу узнать, что простой синтаксис лямбда-выражения имеет только одну строку?
// Data source.
int[] scores = { 90, 71, 82, 93, 75, 82 };
// The call to Count forces iteration of the source
int highScoreCount = scores.Where(n => n > 80).Count();
редактирует Что я хотел бы знать, точно знать разницу в количестве строк мы можем видеть в лямбда-выражения в первом примере, и в одном только ниже:
1: private IEnumerable<Book> BooksPublishedBetween1991and1997()
2: {
3: return Books.FindAll(Book => {
4:
5: return Book.Published >= new DateTime(1991, 01, 01) &&
6: Book.Published <= new DateTime(1997, 12, 31);
7:
8: });
9: } //Link to sample : http://www.rvenables.com/2009/03/practical-introduction-to-lambda-expressions/
UPDATE
Он был направлен в комментариях, что мой вопрос является слишком широким. Я постараюсь сделать это как можно больше. Я провел анализ кода перед использованием Roslyn для проверки определенных пользователей, которые должны использовать пользователи при разработке клиентского программного обеспечения. У меня есть общий способ пройти через узлы древовидного кода (не уверен, действительно ли это так называется) с помощью объекта SyntaxNodeAnalysisContext. Что я хотел бы знать, когда я ищу SimpleLambdaExpressionSyntax и ParenthesisedLambdaExpressionSyntax, это способ взглянуть на содержимое выражения лямбда и точно знать, сколько строк написано в коде.
Трудно дать ответ на этот вопрос, не зная, как вы интегрируете Roslyn в свой процесс сборки. Вы в основном хотите найти синтаксические узлы правильного типа, а затем найти для них позицию файла ... Вы уже сделали * любую интеграцию Roslyn? –
Проблема с строками кода заключается в том, что всегда можно сделать lambda выражение compact, помещая его в одну строку, например 'Book => {return Book.Published> = new DateTime (1991, 01, 01) && Book .Published <= new DateTime (1997, 12, 31);} '. –
@JonSkeet У меня есть некоторые, такие как отключение использования методов из разных классов или указание использования определенных перегрузок, когда они доступны. Я добавляю компилятор Roslyn и бизнес-правила как пакет самородок во всех моих решениях. Что я хотел бы сделать, это пройти через SimpleLambdaExpressionSyntax и ParenthesisedLambdaExpressionSyntax и убедиться, что выражения не длиннее десяти строк. –