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

Reply via email to