Pure methods should be tagged with PureAttribute
A pure method changes no instance or static field, simplifying code by limiting side-effects. This query lists pure methods not tagged with a PureAttribute. The attribute expresses in source code that a method is and should remain pure — an intention continuously checked by the rule Methods tagged with PureAttribute must be pure.
Not a rule by default: many methods would match, and fixing plus maintaining that may counter-balance the benefits.
Not a rule by default: many methods would match, and fixing plus maintaining that may counter-balance the benefits.
How to fix
Tag matched methods with NDepend.Attributes.PureAttribute (from NDepend.API.dll), System.Diagnostics.Contracts.PureAttribute (honored by the compiler only with Microsoft Code Contract enabled), or your own attribute (adapting this query).
CQLinq source
This rule is written in CQLinq, C# LINQ over the NDepend code model. It ships with every new NDepend project: you can read it, adapt it, or use it as a starting point for your own custom rules.
// <Name>Pure methods should be tagged with PureAttribute</Name>
// <Id>ND1912:PureMethodsShouldBeTaggedWithPureAttribute</Id>
// warnif count > 0 <-- not a code rule per default
from m in Application.Methods where
!m.IsGeneratedByCompiler &&
!m.HasAttribute ("NDepend.Attributes.PureAttribute".AllowNoMatch()) &&
!m.HasAttribute ("System.Diagnostics.Contracts.PureAttribute".AllowNoMatch()) &&
!m.ChangesObjectState && !m.ChangesTypeState &&
m.NbLinesOfCode > 0
select new {
m,
m.NbLinesOfCode,
Debt = 3.ToMinutes().ToDebt(),
Severity = Severity.Low
}
//<Expl>
// The *{0}* is pure which makes it easy to work with, especially
// in concurrent scenarios.
// Tag this method with *System.Diagnostics.Contracts.PureAttribute*.
// This way the intent to keep it pure is clearly
// expressed and regularly checked through the rule
// *Methods tagged with PureAttribute must be pure*.
//</Expl>
//<Desc>
// A pure method changes no instance or static field, simplifying code by
// **limiting side-effects**. This query lists pure methods not tagged with
// a **PureAttribute**. The attribute expresses in source code that a method
// is and should remain pure — an intention continuously checked by the rule
// *Methods tagged with PureAttribute must be pure*.
//
// Not a rule by default: many methods would match, and fixing plus
// maintaining that may *counter-balance* the benefits.
//</Desc>
//<HowToFix>
// Tag matched methods with *NDepend.Attributes.PureAttribute* (from
// *NDepend.API.dll*), *System.Diagnostics.Contracts.PureAttribute* (honored
// by the compiler only with Microsoft Code Contract enabled), or your own
// attribute (adapting this query).
//</HowToFix>
Open in the interactive Rules Explorer · All default rules
Immutability: all 15 items
- Fields should be marked as ReadOnly when possible ND1900
- Avoid non-readonly static fields ND1901
- Avoid static fields with a mutable field type ND1902
- Structures should be immutable ND1903
- Immutable struct should be declared as readonly ND1914
- Property Getters should be pure ND1904
- A field must not be assigned from outside its parent hierarchy types ND1905
- Don't assign a field from many methods ND1906
- Do not declare read only fields with mutable reference types ND1907
- Public read only array fields can be modified ND1908
- Types tagged with ImmutableAttribute must be immutable ND1909
- Types immutable should be tagged with ImmutableAttribute ND1910
- Methods tagged with PureAttribute must be pure ND1911
- Pure methods should be tagged with PureAttribute ND1912
- Record should be immutable ND1913