8 changed files with 304 additions and 64 deletions
@ -0,0 +1,79 @@
@@ -0,0 +1,79 @@
|
||||
//
|
||||
// CreateChangedEvent.cs
|
||||
//
|
||||
// Author:
|
||||
// Mike Krüger <mkrueger@xamarin.com>
|
||||
//
|
||||
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
using System; |
||||
using System.Linq; |
||||
using ICSharpCode.NRefactory.CSharp.Resolver; |
||||
using ICSharpCode.NRefactory.Semantics; |
||||
using ICSharpCode.NRefactory.TypeSystem; |
||||
using System.Threading; |
||||
using System.Collections.Generic; |
||||
|
||||
namespace ICSharpCode.NRefactory.CSharp.Refactoring |
||||
{ |
||||
[ContextAction("Create changed event for property", Description = "Creates a changed event for an property.")] |
||||
public class CreateChangedEvent : ICodeActionProvider |
||||
{ |
||||
public IEnumerable<CodeAction> GetActions(RefactoringContext context) |
||||
{ |
||||
var property = context.GetNode<PropertyDeclaration>(); |
||||
var field = RemoveBackingStoreAction.GetBackingField(context); |
||||
if (field == null) |
||||
yield break; |
||||
var resolvedType = ReflectionHelper.ParseReflectionName ("System.EventHandler").Resolve (context.Compilation); |
||||
if (resolvedType == null) |
||||
yield break; |
||||
var type = (TypeDeclaration)property.Parent; |
||||
|
||||
yield return new CodeAction(context.TranslateString("Create changed event"), script => { |
||||
var eventDeclaration = CreateChangedEventDeclaration (context, property); |
||||
var methodDeclaration = CreateEventInvocatorAction.CreateEventInvocator (context, type, eventDeclaration, eventDeclaration.Variables.First (), resolvedType.GetDelegateInvokeMethod (), false); |
||||
script.InsertBefore (property.Setter.Body.RBraceToken, new ExpressionStatement (new InvocationExpression ( |
||||
new IdentifierExpression (methodDeclaration.Name), |
||||
new MemberReferenceExpression (new TypeReferenceExpression (context.CreateShortType("System", "EventArgs")), "Empty") |
||||
))); |
||||
script.InsertWithCursor( |
||||
context.TranslateString("Create event invocator"), |
||||
Script.InsertPosition.After, |
||||
new AstNode[] { eventDeclaration, methodDeclaration } |
||||
); |
||||
}, property.NameToken); |
||||
} |
||||
|
||||
EventDeclaration CreateChangedEventDeclaration (RefactoringContext context, PropertyDeclaration propertyDeclaration) |
||||
{ |
||||
return new EventDeclaration { |
||||
Modifiers = propertyDeclaration.HasModifier (Modifiers.Static) ? Modifiers.Public | Modifiers.Static : Modifiers.Public, |
||||
ReturnType = context.CreateShortType("System", "EventHandler"), |
||||
Variables = { |
||||
new VariableInitializer { |
||||
Name = propertyDeclaration.Name + "Changed" |
||||
} |
||||
} |
||||
}; |
||||
} |
||||
} |
||||
} |
||||
|
@ -0,0 +1,144 @@
@@ -0,0 +1,144 @@
|
||||
//
|
||||
// CreateChangedEventTests.cs
|
||||
//
|
||||
// Author:
|
||||
// Mike Krüger <mkrueger@xamarin.com>
|
||||
//
|
||||
// Copyright (c) 2013 Xamarin Inc. (http://xamarin.com)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is
|
||||
// furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in
|
||||
// all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
using NUnit.Framework; |
||||
using ICSharpCode.NRefactory.CSharp.Refactoring; |
||||
|
||||
namespace ICSharpCode.NRefactory.CSharp.CodeActions |
||||
{ |
||||
[TestFixture] |
||||
public class CreateChangedEventTests : ContextActionTestBase |
||||
{ |
||||
[Test] |
||||
public void TestSimpleCase () |
||||
{ |
||||
Test<CreateChangedEvent> (@"class TestClass
|
||||
{ |
||||
string test; |
||||
public string $Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
} |
||||
} |
||||
}", @"class TestClass |
||||
{ |
||||
string test; |
||||
public event System.EventHandler TestChanged; |
||||
protected virtual void OnTestChanged (System.EventArgs e) |
||||
{ |
||||
var handler = TestChanged; |
||||
if (handler != null) |
||||
handler (this, e); |
||||
} |
||||
public string Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
OnTestChanged (System.EventArgs.Empty); |
||||
} |
||||
} |
||||
}");
|
||||
} |
||||
|
||||
[Test] |
||||
public void TestStaticClassCase () |
||||
{ |
||||
Test<CreateChangedEvent> (@"static class TestClass
|
||||
{ |
||||
static string test; |
||||
public static string $Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
} |
||||
} |
||||
}", @"static class TestClass |
||||
{ |
||||
static string test; |
||||
public static event System.EventHandler TestChanged; |
||||
static void OnTestChanged (System.EventArgs e) |
||||
{ |
||||
var handler = TestChanged; |
||||
if (handler != null) |
||||
handler (null, e); |
||||
} |
||||
public static string Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
OnTestChanged (System.EventArgs.Empty); |
||||
} |
||||
} |
||||
}");
|
||||
} |
||||
|
||||
[Test] |
||||
public void TestSealedCase () |
||||
{ |
||||
Test<CreateChangedEvent> (@"sealed class TestClass
|
||||
{ |
||||
string test; |
||||
public string $Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
} |
||||
} |
||||
}", @"sealed class TestClass |
||||
{ |
||||
string test; |
||||
public event System.EventHandler TestChanged; |
||||
void OnTestChanged (System.EventArgs e) |
||||
{ |
||||
var handler = TestChanged; |
||||
if (handler != null) |
||||
handler (this, e); |
||||
} |
||||
public string Test { |
||||
get { |
||||
return test; |
||||
} |
||||
set { |
||||
test = value; |
||||
OnTestChanged (System.EventArgs.Empty); |
||||
} |
||||
} |
||||
}");
|
||||
} |
||||
|
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue