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) {