Salut Sebastien, This patch to UsePreferredTermsRule removes false positives when a term is part of a larger word (like "parent" vs "arent"). Also it improves rule's text and slightly refactor it to use CheckIdentifier for namespaces too.
Please review, --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Gendarme" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/gendarme?hl=en -~----------~----~----~----~------~----~------~--~---
From 493d408283fedf0c03791cc84e27a8f947694f66 Mon Sep 17 00:00:00 2001 From: Cedric Vivier <[email protected]> Date: Thu, 25 Dec 2008 19:06:40 +0800 Subject: [PATCH] WIP in 'UsePreferredTermsRule' branch. 2008-12-25 Cedric Vivier <[email protected]> * UsePreferredTermsRule.cs: Fix false positives when term is part of a larger word. Improve text. Use CheckIdentifier for namespaces too. --- gendarme/rules/Gendarme.Rules.Naming/ChangeLog | 5 +++ .../Test/UsePreferredTermsTest.cs | 13 ++++++-- .../Gendarme.Rules.Naming/UsePreferredTermsRule.cs | 35 +++++++++++--------- 3 files changed, 34 insertions(+), 19 deletions(-) diff --git a/gendarme/rules/Gendarme.Rules.Naming/ChangeLog b/gendarme/rules/Gendarme.Rules.Naming/ChangeLog index b9f09a1..e9c9f22 100644 --- a/gendarme/rules/Gendarme.Rules.Naming/ChangeLog +++ b/gendarme/rules/Gendarme.Rules.Naming/ChangeLog @@ -1,3 +1,8 @@ +2008-12-25 Cedric Vivier <[email protected]> + + * UsePreferredTermsRule.cs: Fix false positives when term is part of + a larger word. Improve text. Use CheckIdentifier for namespaces too. + 2008-12-24 Sebastien Pouliot <[email protected]> * DetectNonAlphaNumericsInTypeNamesRule.cs: Replace IndexOf("_") diff --git a/gendarme/rules/Gendarme.Rules.Naming/Test/UsePreferredTermsTest.cs b/gendarme/rules/Gendarme.Rules.Naming/Test/UsePreferredTermsTest.cs index 22041b8..76ba4ea 100644 --- a/gendarme/rules/Gendarme.Rules.Naming/Test/UsePreferredTermsTest.cs +++ b/gendarme/rules/Gendarme.Rules.Naming/Test/UsePreferredTermsTest.cs @@ -45,6 +45,8 @@ namespace Cancelled.ComPlus.Indices.ShouldntBe.Writeable { public bool WontAllowIt; + public bool arentBad; + public bool AccessWerentLogged { get { return true; } } @@ -78,6 +80,7 @@ namespace Test.Rules.Naming { public class UsePreferredTermsAssemblyTest : AssemblyRuleTestFixture<UsePreferredTermsRule> { AssemblyDefinition assembly; + bool parentMatches; [TestFixtureSetUp] public void FixtureSetup () @@ -116,14 +119,14 @@ namespace Test.Rules.Naming { { // 3 failures in the type name, 2 in fields (including one event) AssertRuleFailure<Cancelled.ComPlus.Indices.ShouldntBe.Writeable.CouldntLogInOrSignOn> (5); - // 3 failures in the type name, 1 in a field - AssertRuleFailure<Cancelled.ComPlus.Indices.ShouldntBe.Writeable.WouldntLogOutOrSignOff> (4); + // 3 failures in the type name, 2 in a field + AssertRuleFailure<Cancelled.ComPlus.Indices.ShouldntBe.Writeable.WouldntLogOutOrSignOff> (5); } [Test] public void Good () { - // good type name and good field name + // good type name and good fields names AssertRuleSuccess<UsePreferredTermsAssemblyTest> (); } } @@ -145,6 +148,10 @@ namespace Test.Rules.Naming { public void Good () { AssertRuleSuccess<UsePreferredTermsMethodTest> ("Bad"); + AssertRuleSuccess<UsePreferredTermsMethodTest> ("GetParentFoo"); + } + + private void GetParentFoo () { } } } diff --git a/gendarme/rules/Gendarme.Rules.Naming/UsePreferredTermsRule.cs b/gendarme/rules/Gendarme.Rules.Naming/UsePreferredTermsRule.cs index f37498e..26155b5 100644 --- a/gendarme/rules/Gendarme.Rules.Naming/UsePreferredTermsRule.cs +++ b/gendarme/rules/Gendarme.Rules.Naming/UsePreferredTermsRule.cs @@ -89,13 +89,13 @@ namespace Gendarme.Rules.Naming { /// </code> /// </example> - [Problem ("The identifier contains some obsolete terms.")] - [Solution ("For consistency replace any obsolete terms with the preferred ones.")] + [Problem ("The identifier contains non-recommended term(s).")] + [Solution ("For consistency replace any non-recommended term with the preferred one.")] [EngineDependency (typeof (NamespaceEngine))] [FxCopCompatibility ("Microsoft.Naming", "CA1726:UsePreferredTerms")] public class UsePreferredTermsRule : Rule, IAssemblyRule, ITypeRule, IMethodRule { - private const string Message = "Obsolete term '{0}' should be replaced with '{1}'."; + private const string Message = "Term '{0}' should be replaced with '{1}'."; // keys are obsolete terms, values are preferred ones // list is based on the FxCop naming rule (as the whole rule is inspired by it) @@ -127,15 +127,23 @@ namespace Gendarme.Rules.Naming { { "Writeable", "Writable" } }; - // common method checking any identifier + /// <summary> + /// Reports a defect when 'name' contains a non-recommended term. + /// </summary> + /// <param name="identifier">Metadata token for 'name' or null if it is a namespace.</param> + /// <param name="name">Name to check.</param> + /// <param name="severity">Severity for the defect to be reported (if any).</param> private void CheckIdentifier (IMetadataTokenProvider identifier, string name, Severity severity) { // scan for any obsolete terms foreach (KeyValuePair<string, string> pair in preferredTerms) { - if (name.IndexOf (pair.Key, StringComparison.OrdinalIgnoreCase) != -1) { - string s = String.Format (Message, pair.Key, pair.Value); - Runner.Report (identifier, severity, Confidence.High, s); - } + int index = name.IndexOf (pair.Key, StringComparison.OrdinalIgnoreCase); + if (index == -1) + continue; + if (index > 0 && char.IsLetter (name, index - 1) && char.IsLower (name, index)) + continue; //term is part of a larger word + string s = String.Format (Message, pair.Key, pair.Value); + Runner.Report (identifier ?? new NamespaceDefinition (name), severity, Confidence.High, s); } } @@ -147,14 +155,9 @@ namespace Gendarme.Rules.Naming { // check every namespaces inside the assembly using the NamespaceEngine // note: we don't reuse CheckIdentifier because we want to avoid // creating Namespace instance unless necessary - foreach (string ns in NamespaceEngine.NamespacesInside (assembly)) { - foreach (KeyValuePair<string, string> pair in preferredTerms) { - if (ns.IndexOf (pair.Key, StringComparison.OrdinalIgnoreCase) != -1) { - string s = String.Format (Message, pair.Key, pair.Value); - Runner.Report (new NamespaceDefinition (ns), Severity.Medium, Confidence.High, s); - } - } - } + foreach (string ns in NamespaceEngine.NamespacesInside (assembly)) + CheckIdentifier (null, ns, Severity.Medium); + return Runner.CurrentRuleResult; } -- 1.6.0.3

