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;
+ }
+ }
+ }
+}