diff options
author | Sebastien Pouliot <sebastien.pouliot@gmail.com> | 2013-04-28 19:25:30 +0400 |
---|---|---|
committer | Sebastien Pouliot <sebastien.pouliot@gmail.com> | 2013-04-28 19:25:30 +0400 |
commit | 49f678725442440aac5620e0c7b2e79cbcb5c9e4 (patch) | |
tree | bf22eef568d898823e8c040ccb7a6ee6b6c7afdb | |
parent | 6c300e35f1c7c7ed9c9c8b7b5a0c8778fefd2cc0 (diff) | |
parent | 7eafc469ddcc5e1a41cbc6c30608858866a71e54 (diff) |
Merge pull request #23 from krijesta/typerocks
Typerocks IsNamed() errors
3 files changed, 60 insertions, 19 deletions
diff --git a/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs b/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs index e2e7eb4a..efdcc0f0 100644 --- a/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs +++ b/gendarme/framework/Gendarme.Framework.Rocks/TypeRocks.cs @@ -257,7 +257,7 @@ namespace Gendarme.Framework.Rocks { return false; // not enough information available // special case, check if we implement ourselves - if (type.IsInterface && Match (type, nameSpace, name)) + if (type.IsInterface && type.IsNamed (nameSpace, name)) return true; return Implements (type, nameSpace, name); @@ -269,7 +269,7 @@ namespace Gendarme.Framework.Rocks { // does the type implements it itself if (type.HasInterfaces) { foreach (TypeReference iface in type.Interfaces) { - if (Match (iface, nameSpace, iname)) + if (iface.IsNamed (nameSpace, iname)) return true; //if not, then maybe one of its parent interfaces does if (Implements (iface.Resolve (), nameSpace, iname)) @@ -282,23 +282,6 @@ namespace Gendarme.Framework.Rocks { return false; } - private static bool Match (TypeReference type, string nameSpace, string name) - { - int np = name.IndexOf ('/'); - if (np == -1) { - if (type.IsNamed (nameSpace, name)) - return true; - } else if (type.IsNested) { - string tname = type.Name; - TypeReference dt = type.DeclaringType; - if ((nameSpace == dt.Namespace) && - (String.CompareOrdinal (name, 0, dt.Name, 0, np) == 0) && - (String.CompareOrdinal (name, np + 1, tname, 0, tname.Length) == 0)) - return true; - } - return false; - } - /// <summary> /// Check if the type inherits from the specified type. Note that it is possible that /// we might not be able to know the complete inheritance chain since the assembly @@ -348,6 +331,15 @@ namespace Gendarme.Framework.Rocks { throw new ArgumentNullException ("name"); if (self == null) return false; + + if (self.IsNested) { + int spos = name.LastIndexOf ('/'); + if (spos == -1) + return false; + // GetFullName could be optimized away but it's a fairly uncommon case + return (nameSpace + "." + name == self.GetFullName ()); + } + return ((self.Namespace == nameSpace) && (self.Name == name)); } @@ -382,6 +374,8 @@ namespace Gendarme.Framework.Rocks { return false; string name = self.Name; + if (fullName.Length - dpos - 1 != name.Length) + return false; return (String.CompareOrdinal (name, 0, fullName, dpos + 1, fullName.Length - dpos - 1) == 0); } diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs index ed62b9c5..4c746fa2 100644 --- a/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs +++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/RocksTest.cs @@ -49,6 +49,9 @@ namespace Test.Framework.Rocks { public abstract void PublicMethod (); protected abstract void ProtectedMethod (); private void PrivateMethod () { } + + public abstract class NestedNestedPublicType { + } } protected abstract class NestedProtectedType { diff --git a/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs b/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs index 93d946d1..99366bee 100644 --- a/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs +++ b/gendarme/framework/Test/Gendarme.Framework.Rocks/TypeRocksTest.cs @@ -343,6 +343,50 @@ namespace Test.Framework.Rocks { } [Test] + public void IsNamed () + { + string name = "Test.Framework.Rocks.PublicType"; + TypeDefinition type = assembly.MainModule.GetType (name); + + Assert.IsTrue (type.IsNamed ( "Test.Framework.Rocks.PublicType")); + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.P"));//Missing Text + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicTypeExtraText")); + + Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType")); + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "P"));//Missing Text + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicTypeExtraText")); + } + + [Test] + public void IsNamedNestedType () + { + string name = "Test.Framework.Rocks.PublicType/NestedPublicType"; + TypeDefinition type = assembly.MainModule.GetType (name); + + Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicType")); + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicType/N"));//Missing Text + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicTypeExtaStuff")); + + Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicType")); + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicType/N"));//Missing Text + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicTypeExtraText")); + + Assert.IsFalse (type.IsNamed ("Test.Framework.Rocks", "NestedPublicType")); + Assert.IsFalse (type.IsNamed ("", "NestedPublicType")); + } + + [Test] + public void IsNamedDoubleNestedType () + { + string name = "Test.Framework.Rocks.PublicType/NestedPublicType/NestedNestedPublicType"; + TypeDefinition type = assembly.MainModule.GetType (name); + + Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks.PublicType/NestedPublicType/NestedNestedPublicType")); + + Assert.IsTrue (type.IsNamed ("Test.Framework.Rocks", "PublicType/NestedPublicType/NestedNestedPublicType")); + } + + [Test] public void IsVisible () { string name = "Test.Framework.Rocks.PublicType"; |