Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/rocks
diff options
context:
space:
mode:
authorjbevain <jbevain@gmail.com>2010-04-24 16:27:37 +0400
committerjbevain <jbevain@gmail.com>2010-04-24 16:27:37 +0400
commite1c9069b170f8f065617542d5ec73d250517763a (patch)
treeefee4ec6858cd96f887ae1bc4b779e66bad85d07 /rocks
parent779e32298510ffb3138139b867bdb70c08e40896 (diff)
implement GetBaseMethod
Diffstat (limited to 'rocks')
-rw-r--r--rocks/Mono.Cecil.Rocks/MethodDefinitionRocks.cs38
-rw-r--r--rocks/Test/Mono.Cecil.Rocks.Tests.csproj1
-rw-r--r--rocks/Test/Mono.Cecil.Tests/MethodDefinitionRocksTests.cs53
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);
+ }
+ }
+}