From 8431aa00391891754fc3595888cede4b7daab23b Mon Sep 17 00:00:00 2001 From: erikkallen Date: Thu, 14 Jun 2012 19:24:43 +0200 Subject: [PATCH] Fixed bugs with events: 1) Assignment of IsOverride to IsOverridable, and 2) AccessorOwner not being set for auto-events. --- .../TypeSystem/TypeSystemConvertVisitor.cs | 3 ++- .../TypeSystem/TypeSystemTests.TestCase.cs | 16 ++++++++++++ .../TypeSystem/TypeSystemTests.cs | 26 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs index d2a273dcc0..cefb703c7f 100644 --- a/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs +++ b/ICSharpCode.NRefactory.CSharp/TypeSystem/TypeSystemConvertVisitor.cs @@ -756,11 +756,12 @@ namespace ICSharpCode.NRefactory.CSharp.TypeSystem DefaultUnresolvedMethod CreateDefaultEventAccessor(IUnresolvedEvent ev, string name, IUnresolvedParameter valueParameter) { var a = new DefaultUnresolvedMethod(currentTypeDefinition, name); + a.AccessorOwner = ev; a.Region = ev.BodyRegion; a.BodyRegion = ev.BodyRegion; a.Accessibility = ev.Accessibility; a.IsAbstract = ev.IsAbstract; - a.IsOverride = ev.IsOverridable; + a.IsOverride = ev.IsOverride; a.IsSealed = ev.IsSealed; a.IsStatic = ev.IsStatic; a.IsSynthetic = ev.IsSynthetic; diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs index e5c9b3f502..2efddd385a 100644 --- a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs +++ b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.TestCase.cs @@ -275,4 +275,20 @@ namespace ICSharpCode.NRefactory.TypeSystem.TestCase int IInterfaceWithIndexers.this[string x] { get { return 0; } set {} } int IInterfaceWithIndexers.this[int x, int y] { get { return 0; } set {} } } + + public interface IHasEvent { + event EventHandler Event; + } + + public class ClassThatImplementsEvent : IHasEvent { + public event EventHandler Event; + } + + public class ClassThatImplementsEventWithCustomAccessors : IHasEvent { + public event EventHandler Event { add {} remove {} } + } + + public class ClassThatImplementsEventExplicitly : IHasEvent { + event EventHandler IHasEvent.Event { add {} remove {} } + } } diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs index b8589447b4..4ee5534237 100644 --- a/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs +++ b/ICSharpCode.NRefactory.Tests/TypeSystem/TypeSystemTests.cs @@ -961,5 +961,31 @@ namespace ICSharpCode.NRefactory.TypeSystem Assert.That(prop.Setter.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IInterfaceWithProperty.set_Prop" })); } + [Test] + public void EventAccessorsShouldBeReportedAsImplementingInterfaceAccessors() { + ITypeDefinition type = GetTypeDefinition(typeof(ClassThatImplementsEvent)); + var evt = type.Events.Single(p => p.Name == "Event"); + Assert.That(evt.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.Event" })); + Assert.That(evt.AddAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.add_Event" })); + Assert.That(evt.RemoveAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.remove_Event" })); + } + + [Test] + public void EventAccessorsShouldBeReportedAsImplementingInterfaceAccessorsWhenCustomAccessorMethodsAreUsed() { + ITypeDefinition type = GetTypeDefinition(typeof(ClassThatImplementsEventWithCustomAccessors)); + var evt = type.Events.Single(p => p.Name == "Event"); + Assert.That(evt.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.Event" })); + Assert.That(evt.AddAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.add_Event" })); + Assert.That(evt.RemoveAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.remove_Event" })); + } + + [Test] + public void ExplicitlyImplementedEventsShouldBeReportedAsBeingImplemented() { + ITypeDefinition type = GetTypeDefinition(typeof(ClassThatImplementsEventExplicitly)); + var evt = type.Events.Single(); + Assert.That(evt.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.Event" })); + Assert.That(evt.AddAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.add_Event" })); + Assert.That(evt.RemoveAccessor.ImplementedInterfaceMembers.Select(p => p.ReflectionName).ToList(), Is.EqualTo(new[] { "ICSharpCode.NRefactory.TypeSystem.TestCase.IHasEvent.remove_Event" })); + } } }