如何限制NDepend方法查询中的类型属性

7

我正在尝试使用修改后的标准“方法过长”查询来让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

我找不到将方法和类型信息结合起来的方法,即使V3的发布说明也没有提到这一点。 - Timores
1
你尝试过使用IsGeneratedByCompiler方法属性吗? - Timores
@Timores:没错,我希望我能在这两个之间建立一个连接。我还没有看过IsGeneratedByCompiler。从文档上看,它似乎不能解决问题。但我会尝试一下并更新问题。 - Brian Rasmussen
我已向NDepend的支持部门发送了请求。等我得到回复后,我会更新评论或发布答案。 - Timores
2个回答

2
Brian,感谢您使用CQLinq进行LINQ查询的代码规则源代码,您所要求的代码规则如下:

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 }

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 }

一次定义的集合 JustMyCode 可在任何代码规则中重复使用。此外,您可以查看默认查询 notmycode 从JustMyCode中放弃生成和设计方法


0

我非常喜欢NDepend,但最大的缺点是命名空间/类型/方法信息不能合并到单个查询中。如果有这个功能,CQL将变得非常强大。

除此之外,检查“IsGeneratedByCompiler”和“IsInFrameworkAssembly”可能会有所帮助。 您还可以从查询中删除某些命名空间(OUT OF NAMESPACES“…”


当然会的!我知道OUT OF功能,但不幸的是,相关程序集将开发人员编写的代码和生成的代码都放在同一个命名空间中 :( - Brian Rasmussen
flq,Brian,请看一下我上面的答案 :) - Patrick from NDepend team

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接