2015-03-19 4 views
3

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

+0

Трудно дать ответ на этот вопрос, не зная, как вы интегрируете Roslyn в свой процесс сборки. Вы в основном хотите найти синтаксические узлы правильного типа, а затем найти для них позицию файла ... Вы уже сделали * любую интеграцию Roslyn? –

+1

Проблема с строками кода заключается в том, что всегда можно сделать lambda выражение compact, помещая его в одну строку, например 'Book => {return Book.Published> = new DateTime (1991, 01, 01) && Book .Published <= new DateTime (1997, 12, 31);} '. –

+0

@JonSkeet У меня есть некоторые, такие как отключение использования методов из разных классов или указание использования определенных перегрузок, когда они доступны. Я добавляю компилятор Roslyn и бизнес-правила как пакет самородок во всех моих решениях. Что я хотел бы сделать, это пройти через SimpleLambdaExpressionSyntax и ParenthesisedLambdaExpressionSyntax и убедиться, что выражения не длиннее десяти строк. –

ответ

5

Похоже, вы знаете, как добраться до соответствующих узлов синтаксиса (SimpleLambdaExpressionSyntax и ParenthesizedLambdaExpressionSyntax), и просто нужно знать, как долго они находятся.

Я думаю, что вы просто хотите что-то вроде этого:

var lineSpan = node.SyntaxTree.GetMappedLineSpan(node.Span); 
var lines = lineSpan.EndLinePosition.Line - lineSpan.StartLinePosition.Line + 1; 

Там может быть более эффективным и простым способом сделать это, но это должно вам начать работу.

+0

, глядя на мой второй пример в моем вопросе, это означало бы, используя этот код, следующий фрагмент кода должен дать мне результат 2? (На самом деле три, так как есть новая строка без какого-либо контента) –

+0

@Kavignon: Нет, я ожидаю, что это даст вам 6, так как выражение лямбда охватывает 6 строк.Если вы хотите удалить пустые строки и, возможно, удалить финальную строку, если часть диапазона для этой строки - просто пробел, за которым следует «}», вы можете это сделать ... Вам в основном нужно спросить дерево синтаксиса получите каждую строку, чтобы проверить это. Честно говоря, мне все равно не нравится идея этого «правила», и к тому времени, когда вы начнете усложнять его, добавив дополнительные правила, по которым подсчитываются строки, похоже, что все труднее и труднее объяснить для разработчиков ... Я бы просто полагался на обзор кода, сам. –

+0

Я понимаю, что вы имеете в виду, и, честно говоря, я должен изменить его максимум на 3 инструкции. Есть ли способ смотреть исключительно на ';' в лямбда-выражении. Я мог бы сказать, что если есть более 9, предупреждение, поведение, чтобы исправить? –

Смежные вопросы