diff options
author | jbevain <jbevain@gmail.com> | 2010-04-24 16:27:37 +0400 |
---|---|---|
committer | jbevain <jbevain@gmail.com> | 2010-04-24 16:27:37 +0400 |
commit | e1c9069b170f8f065617542d5ec73d250517763a (patch) | |
tree | efee4ec6858cd96f887ae1bc4b779e66bad85d07 /rocks | |
parent | 779e32298510ffb3138139b867bdb70c08e40896 (diff) |
implement GetBaseMethod
Diffstat (limited to 'rocks')
-rw-r--r-- | rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs | 38 | ||||
-rw-r--r-- | rocks/Test/Mono.Cecil.Rocks.Tests.csproj | 1 | ||||
-rw-r--r-- | rocks/Test/Mono.Cecil.Tests/MethodDefinitionRocksTests.cs | 53 |
3 files changed, 89 insertions, 3 deletions
diff --git a/rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs b/rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs index b4b6624..896c952 100644 --- a/rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs +++ b/rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs @@ -39,9 +39,18 @@ namespace Mono.Cecil.Rocks { if (self == null) throw new ArgumentNullException ("self"); if (!self.IsVirtual) - return null; + return self; + + var base_type = ResolveBaseType (self.DeclaringType); + while (base_type != null) { + var @base = GetMatchingMethod (base_type, self); + if (@base != null) + return @base; - throw new NotImplementedException (); + base_type = ResolveBaseType (base_type); + } + + return self; } public static MethodDefinition GetOriginalBaseMethod (this MethodDefinition self) @@ -49,7 +58,30 @@ namespace Mono.Cecil.Rocks { if (self == null) throw new ArgumentNullException ("self"); - throw new NotImplementedException (); + while (true) { + var @base = self.GetBaseMethod (); + if (@base == self) + return self; + + self = @base; + } + } + + static TypeDefinition ResolveBaseType (TypeDefinition type) + { + if (type == null) + return null; + + var base_type = type.BaseType; + if (base_type == null) + return null; + + return base_type.Resolve (); + } + + static MethodDefinition GetMatchingMethod (TypeDefinition type, MethodDefinition method) + { + return MetadataResolver.GetMethod (type.Methods, method); } } } diff --git a/rocks/Test/Mono.Cecil.Rocks.Tests.csproj b/rocks/Test/Mono.Cecil.Rocks.Tests.csproj index b35c480..07865b5 100644 --- a/rocks/Test/Mono.Cecil.Rocks.Tests.csproj +++ b/rocks/Test/Mono.Cecil.Rocks.Tests.csproj @@ -56,6 +56,7 @@ <ItemGroup> </ItemGroup> <ItemGroup> + <Compile Include="Mono.Cecil.Tests\MethodDefinitionRocksTests.cs" /> <Compile Include="Mono.Cecil.Tests\ModuleDefinitionRocksTests.cs" /> <Compile Include="Mono.Cecil.Tests\SecurityDeclarationRocksTests.cs" /> <Compile Include="Mono.Cecil.Tests\TypeDefinitionRocksTests.cs" /> diff --git a/rocks/Test/Mono.Cecil.Tests/MethodDefinitionRocksTests.cs b/rocks/Test/Mono.Cecil.Tests/MethodDefinitionRocksTests.cs new file mode 100644 index 0000000..2cfe014 --- /dev/null +++ b/rocks/Test/Mono.Cecil.Tests/MethodDefinitionRocksTests.cs @@ -0,0 +1,53 @@ +using System.Linq; + +using NUnit.Framework; + +using Mono.Cecil.Rocks; + +namespace Mono.Cecil.Tests { + + [TestFixture] + public class MethodDefinitionRocksTests : BaseTestFixture { + + abstract class Foo { + public abstract void DoFoo (); + } + + class Bar : Foo { + public override void DoFoo () + { + } + } + + class Baz : Bar { + public override void DoFoo () + { + } + } + + [Test] + public void GetBaseMethod () + { + var baz = typeof (Baz).ToDefinition (); + var baz_dofoo = baz.GetMethod ("DoFoo"); + + var @base = baz_dofoo.GetBaseMethod (); + Assert.AreEqual ("Bar", @base.DeclaringType.Name); + + @base = @base.GetBaseMethod (); + Assert.AreEqual ("Foo", @base.DeclaringType.Name); + + Assert.AreEqual (@base, @base.GetBaseMethod ()); + } + + [Test] + public void GetOriginalBaseMethod () + { + var baz = typeof (Baz).ToDefinition (); + var baz_dofoo = baz.GetMethod ("DoFoo"); + + var @base = baz_dofoo.GetOriginalBaseMethod (); + Assert.AreEqual ("Foo", @base.DeclaringType.Name); + } + } +} |