I'm trying to get NDepend to identify long methods using a modified version of the standard "Methods too big" query.
I don't want to report long methods that the developers have little control over, so I filter out generated code using the DebuggerNonUserCode
attribute and InitializeComponent()
.
Unfortunately, I still get a few false positives as methods in generated types are reported as well. The problem is that while the type itself has the DebuggerNonUserCode
attribute, the methods do not, so they are included in the output despite the fact that they are generated.
I am looking for something like a join between types and methods: Give me all types that do not have the DebuggerNonUserCode
attribute and run the query on those, but I can't figure out how to express this in CQL.
For some of the assemblies, I can simply filter on the full name, but unfortunately some of our assemblies mix developer made and generated types. Unfortunately the IsGeneratedByCompiler
can't be used either in this case.
My query
WARN IF Count > 0 IN SELECT METHODS WHERE
NbLinesOfCode > 30 AND
!HasAttribute "System.Diagnostics.DebuggerNonUserCodeAttribute" AND
!NameIs "InitializeComponent()"
ORDER BY NbLinesOfCode DESC
Brian, thanks to Code Rule over LINQ Query (CQLinq) the source code of the code rule you are asking for is:
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 }
The CQLinq syntax also offer a way to define what is Just-My-Code. This feature is describe here. Basically you need to define the set JustMyCode through queries prefixed with notmycode. Then the rule you are asking for can be rewritten easily:
warnif count > 0
from m in JustMyCode.Methods where
m.NbLinesOfCode > 30
orderby m.NbLinesOfCode descending
select new { m, m.NbLinesOfCode }
The set JustMyCode defined once for all can be reused over any code rule. Additionaly you can look at the notmycode default query Discard generated and designer Methods from JustMyCode
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With