From 6a4ce50fea3e4ed4a25d8b950d0f146d6a6c3bd2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Thu, 7 Oct 2010 13:52:31 +0200 Subject: [PATCH] Implemented CecilLoader.ReadEvent --- .../ICSharpCode.NRefactory.csproj | 1 + .../TypeSystem/CecilLoader.cs | 25 ++++++- ICSharpCode.NRefactory/TypeSystem/IEvent.cs | 36 ++-------- .../TypeSystem/IProperty.cs | 3 - .../TypeSystem/Implementation/DefaultEvent.cs | 72 +++++++++++++++++++ 5 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs diff --git a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj index 6a46b98bfa..42b9189b96 100644 --- a/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj +++ b/ICSharpCode.NRefactory/ICSharpCode.NRefactory.csproj @@ -164,6 +164,7 @@ + diff --git a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs index 0cdeb1f315..55e1429c26 100644 --- a/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs +++ b/ICSharpCode.NRefactory/TypeSystem/CecilLoader.cs @@ -755,7 +755,30 @@ namespace ICSharpCode.NRefactory.TypeSystem #region Read Event public IEvent ReadEvent(EventDefinition ev, ITypeDefinition parentType) { - throw new NotImplementedException(); + if (ev == null) + throw new ArgumentNullException("ev"); + if (parentType == null) + throw new ArgumentNullException("parentType"); + + DefaultEvent e = new DefaultEvent(parentType, ev.Name); + TranslateModifiers(ev.AddMethod, e); + e.ReturnType = ReadTypeReference(ev.EventType, typeAttributes: ev, entity: e); + + e.CanAdd = ev.AddMethod != null && IsVisible(ev.AddMethod.Attributes); + e.CanRemove = ev.RemoveMethod != null && IsVisible(ev.RemoveMethod.Attributes); + e.CanInvoke = ev.InvokeMethod != null && IsVisible(ev.InvokeMethod.Attributes); + + if (e.CanAdd) + e.AddAccessibility = GetAccessibility(ev.AddMethod.Attributes); + if (e.CanRemove) + e.RemoveAccessibility = GetAccessibility(ev.RemoveMethod.Attributes); + if (e.CanInvoke) + e.InvokeAccessibility = GetAccessibility(ev.InvokeMethod.Attributes); + + if (ev.HasCustomAttributes) + AddAttributes(ev, e.Attributes); + + return e; } #endregion } diff --git a/ICSharpCode.NRefactory/TypeSystem/IEvent.cs b/ICSharpCode.NRefactory/TypeSystem/IEvent.cs index 8789461832..af37954a88 100644 --- a/ICSharpCode.NRefactory/TypeSystem/IEvent.cs +++ b/ICSharpCode.NRefactory/TypeSystem/IEvent.cs @@ -6,38 +6,14 @@ using System.Diagnostics.Contracts; namespace ICSharpCode.NRefactory.TypeSystem { - [ContractClass(typeof(IEventContract))] public interface IEvent : IMember { - /// - /// Gets the add method. - /// - IMethod AddMethod { get; } + bool CanAdd { get; } + bool CanRemove { get; } + bool CanInvoke { get; } - /// - /// Gets the remove method. - /// - IMethod RemoveMethod { get; } - - /// - /// Gets the raise method. - /// - IMethod RaiseMethod { get; } - } - - [ContractClassFor(typeof(IEvent))] - abstract class IEventContract : IMemberContract, IEvent - { - IMethod IEvent.AddMethod { - get { return null; } - } - - IMethod IEvent.RemoveMethod { - get { return null; } - } - - IMethod IEvent.RaiseMethod { - get { return null; } - } + Accessibility AddAccessibility { get; } + Accessibility RemoveAccessibility { get; } + Accessibility InvokeAccessibility { get; } } } diff --git a/ICSharpCode.NRefactory/TypeSystem/IProperty.cs b/ICSharpCode.NRefactory/TypeSystem/IProperty.cs index 096356e8b5..0d247243f4 100644 --- a/ICSharpCode.NRefactory/TypeSystem/IProperty.cs +++ b/ICSharpCode.NRefactory/TypeSystem/IProperty.cs @@ -16,9 +16,6 @@ namespace ICSharpCode.NRefactory.TypeSystem Accessibility GetterAccessibility { get; } Accessibility SetterAccessibility { get; } - //IMethod GetMethod { get; } - //IMethod SetMethod { get; } - bool IsIndexer { get; } } } diff --git a/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs new file mode 100644 index 0000000000..fdd591aa9e --- /dev/null +++ b/ICSharpCode.NRefactory/TypeSystem/Implementation/DefaultEvent.cs @@ -0,0 +1,72 @@ + +using System; + +namespace ICSharpCode.NRefactory.TypeSystem.Implementation +{ + /// + /// Default implementation of . + /// + public class DefaultEvent : AbstractMember, IEvent + { + Accessibility addAccessibility; + Accessibility removeAccessibility; + Accessibility invokeAccessibility; + + const ushort FlagCanAdd = 0x1000; + const ushort FlagCanRemove = 0x2000; + const ushort FlagCanInvoke = 0x4000; + + public DefaultEvent(ITypeDefinition declaringTypeDefinition, string name) + : base(declaringTypeDefinition, name, EntityType.Event) + { + } + + public bool CanAdd { + get { return flags[FlagCanAdd]; } + set { + CheckBeforeMutation(); + flags[FlagCanAdd] = value; + } + } + + public bool CanRemove { + get { return flags[FlagCanRemove]; } + set { + CheckBeforeMutation(); + flags[FlagCanRemove] = value; + } + } + + public bool CanInvoke { + get { return flags[FlagCanInvoke]; } + set { + CheckBeforeMutation(); + flags[FlagCanInvoke] = value; + } + } + + public Accessibility AddAccessibility { + get { return addAccessibility; } + set { + CheckBeforeMutation(); + addAccessibility = value; + } + } + + public Accessibility RemoveAccessibility { + get { return removeAccessibility; } + set { + CheckBeforeMutation(); + removeAccessibility = value; + } + } + + public Accessibility InvokeAccessibility { + get { return invokeAccessibility; } + set { + CheckBeforeMutation(); + invokeAccessibility = value; + } + } + } +}