Bri*_*sen 7 c# ndepend cql cqlinq
我试图让NDepend使用标准的"方法太大"查询的修改版本来识别长方法.
我不想报告开发人员几乎无法控制的长方法,所以我使用DebuggerNonUserCode属性过滤掉生成的代码InitializeComponent().
不幸的是,我仍然得到一些误报,因为报告了生成类型中的方法.问题是虽然类型本身具有DebuggerNonUserCode属性,但方法没有,因此尽管它们是生成的,但它们仍包含在输出中.
我正在寻找类似于类型和方法之间的连接:给我所有没有DebuggerNonUserCode属性的类型并对其运行查询,但我无法弄清楚如何在CQL中表达这一点.
对于某些程序集,我可以简单地过滤全名,但不幸的是我们的一些程序集混合了开发人员制作和生成的类型.不幸的IsGeneratedByCompiler是,在这种情况下也不能使用.
我的查询
WARN IF Count > 0 IN SELECT METHODS WHERE
NbLinesOfCode > 30 AND
!HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
!NameIs "InitializeComponent()"
ORDER BY NbLinesOfCode DESC
Run Code Online (Sandbox Code Playgroud)
Brian,感谢LINQ 查询上的代码规则 (CQLinq),您要求的代码规则的源代码是:
warnif count > 0
from m in Application.Methods where
m.NbLinesOfCode > 30 &&
!m.ParentType.HasAttribute( "System.Diagnostics.DebuggerNonUserCodeAttribute") &&
m.Name != "InitializeComponent()"
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }
Run Code Online (Sandbox Code Playgroud)
CQLinq 语法还提供了一种定义Just-My-Code的方法。此处描述此功能。基本上,您需要通过以notmycode为前缀的查询来定义JustMyCode集。那么你要求的规则可以很容易地重写:
warnif count > 0
from m in JustMyCode.Methods where
m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }
Run Code Online (Sandbox Code Playgroud)
一次定义的JustMyCode集可以在任何代码规则上重用。另外,您可以查看notmycode默认查询Discard generated andDesignerMethods from JustMyCode