使用Roslyn检测lambda表达式的长度

时间:2015-03-19 13:51:23

标签: c# lambda code-analysis roslyn

我想知道在使用Roslyn编译器分析代码时,怎么可能检测到长度(行数)。目前,我正在制定一项禁止使用超过10行的lambdas的法律。

查看下面的示例,我怎么知道简单的lambda表达式语法只有一行?

        // 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();

EDITS 我想知道的是,我们可以清楚地知道第一个例子和下面一个例子中lambda表达式中可以看到的行数的差异:

   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/

更新

评论中指出,我的问题过于宽泛。我会尽可能地尝试简单。在使用Roslyn验证开发客户端软件时用户应具有的某些开发用量之前,我已经完成了代码分析。 我有一个通用的方法来通过使用SyntaxNodeAnalysisContext对象来遍历树代码的节点(不确定它是否真的被称为)。 我想知道的是,当我在寻找SimpleLambdaExpressionSyntax和ParenthesisedLambdaExpressionSyntax时,是查看lambda表达式内容并确切知道代码编写行数的方法。

1 个答案:

答案 0 :(得分:5)

听起来您知道如何访问相关的语法节点(SimpleLambdaExpressionSyntaxParenthesizedLambdaExpressionSyntax),只需知道它们有多长。

我想你只想要这样的东西:

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

可能有一种更有效或更简单的方法,但这应该让你开始。