public RuleResult CheckMethod (MethodDefinition method) { // Check property getters/setters. In order to prevent the property from // being reported twice, setters are only checked if the property has no getter. PropertyDefinition property = method.IsProperty () ? method.GetPropertyByAccessor () : null; if (property != null) { // however do not exclude automatic properties (getter/setter marked a generated code) if ((method.IsSetter && property.GetMethod != null) || property.IsGeneratedCode ()) return RuleResult.DoesNotApply; if (!IsOkay (property.PropertyType, property.Name)) Runner.Report (property, Severity.Medium, Confidence.Normal); } else { // exclude generated code like webservices if (method.IsGeneratedCode ()) return RuleResult.DoesNotApply; // Check the method's parameters. if (method.HasParameters) CheckParameters (method); // Check the method's return type. if (!IsOkay (method.ReturnType, method.Name)) Runner.Report (method, Severity.Medium, Confidence.Normal); } return Runner.CurrentRuleResult; }
public RuleResult CheckMethod (MethodDefinition method) { if (!method.HasBody) return RuleResult.DoesNotApply; if (!OpCodeEngine.GetBitmask (method).Get (Code.Throw)) return RuleResult.Success; if (method.IsSetter && method.IsPublic) { PropertyDefinition property = method.GetPropertyByAccessor (); if (property.HasAttribute ("System.ComponentModel", "DescriptionAttribute")) return RuleResult.Success; } foreach (Instruction instruction in method.Body.Instructions) { if (instruction.OpCode.Code != Code.Throw) continue; if (!instruction.Previous.Is (Code.Newobj)) continue; MethodReference m = (instruction.Previous.Operand as MethodReference); if (m == null) continue; TypeReference type = m.DeclaringType; if (type.Inherits ("System", "Exception")) Runner.Report (method, instruction, Severity.Medium, Confidence.High); } return Runner.CurrentRuleResult; }