diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
index 52227e2224..dac7e045bc 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/CSharpBinding.csproj
@@ -72,6 +72,7 @@
+
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
index c5497c86a4..db90e804e5 100644
--- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpCompletionDataFactory.cs
@@ -105,7 +105,7 @@ namespace CSharpBinding.Completion
ICompletionData ICompletionDataFactory.CreateEventCreationCompletionData(string varName, IType delegateType, IEvent evt, string parameterDefinition, IUnresolvedMember currentMember, IUnresolvedTypeDefinition currentType)
{
- return new CompletionData("TODO: event creation");
+ return new EventCreationCompletionData(varName, delegateType, evt, parameterDefinition, currentMember, currentType, contextAtCaret);
}
ICompletionData ICompletionDataFactory.CreateNewOverrideCompletionData(int declarationBegin, IUnresolvedTypeDefinition type, IMember m)
diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/EventCreationCompletionData.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/EventCreationCompletionData.cs
new file mode 100644
index 0000000000..6215293782
--- /dev/null
+++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/EventCreationCompletionData.cs
@@ -0,0 +1,76 @@
+// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
+// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
+//
+using System;
+using System.Linq;
+using System.Threading;
+using CSharpBinding.Refactoring;
+using ICSharpCode.NRefactory.CSharp;
+using ICSharpCode.NRefactory.CSharp.Refactoring;
+using ICSharpCode.NRefactory.CSharp.Resolver;
+using ICSharpCode.NRefactory.TypeSystem;
+using ICSharpCode.SharpDevelop.Editor.CodeCompletion;
+
+namespace CSharpBinding.Completion
+{
+ ///
+ /// Completion item that creates an event handler for an event.
+ ///
+ class EventCreationCompletionData : EntityCompletionData
+ {
+ IEvent eventDefinition;
+ IType delegateType;
+
+ public EventCreationCompletionData(string varName, IType delegateType, IEvent evt, string parameterList, IUnresolvedMember callingMember, IUnresolvedTypeDefinition declaringType, CSharpResolver contextAtCaret) : base(evt)
+ {
+ if (string.IsNullOrEmpty(varName)) {
+ this.DisplayText = "Create handler for " + (evt != null ? evt.Name : "");
+ }
+ else {
+ this.DisplayText = "Create handler for " + char.ToUpper(varName[0]) + varName.Substring(1) + (evt != null ? evt.Name : "");
+ }
+
+ this.DisplayText = "<" + this.DisplayText + ">";
+ this.eventDefinition = evt;
+ this.delegateType = delegateType;
+ }
+
+ public override void Complete(CompletionContext context)
+ {
+ var invokeSignature = delegateType.GetMethods(m => m.Name == "Invoke").Single();
+ var refactoringContext = SDRefactoringContext.Create(context.Editor, CancellationToken.None);
+ var builder = refactoringContext.CreateTypeSystemAstBuilder();
+ var handlerName = eventDefinition.Name;
+
+ var throwStatement = new ThrowStatement();
+ var decl = new MethodDeclaration {
+ ReturnType = refactoringContext.CreateShortType(invokeSignature.ReturnType),
+ Name = handlerName,
+ Body = new BlockStatement {
+ throwStatement
+ }
+ };
+
+ decl.Parameters.AddRange(invokeSignature.Parameters.Select(builder.ConvertParameter));
+
+ if (eventDefinition.IsStatic)
+ decl.Modifiers |= Modifiers.Static;
+
+ throwStatement.Expression = new ObjectCreateExpression(refactoringContext.CreateShortType("System", "NotImplementedException"));
+
+ // begin insertion
+ using (context.Editor.Document.OpenUndoGroup()) {
+ context.Editor.Document.Replace(context.StartOffset, context.Length, handlerName);
+ context.EndOffset = context.StartOffset + handlerName.Length;
+
+ using (var script = refactoringContext.StartScript()) {
+ script.InsertWithCursor(this.DisplayText, Script.InsertPosition.Before, decl)
+ // TODO : replace with Link, once that is implemented
+ .ContinueScript(() => script.Select(throwStatement));
+ }
+ }
+ }
+ }
+}
+
+
diff --git a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs
index e58caa6dcc..41e1e64cdc 100644
--- a/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs
+++ b/src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp/Refactoring/Script.cs
@@ -615,7 +615,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
}
}
- static class ExtMethods
+ public static class ExtMethods
{
public static void ContinueScript (this Task task, Action act)
{