static AnonymousMethodExpression GetAnonymousMethodExpression (RefactoringContext context, out ITypeDefinition delegateType) { delegateType = null; var anonymousMethodExpression = context.GetNode<AnonymousMethodExpression> (); if (anonymousMethodExpression == null || !anonymousMethodExpression.DelegateToken.Contains (context.Location.Line, context.Location.Column) || anonymousMethodExpression.HasParameterList) return null; AstType resolvedType = null; var parent = anonymousMethodExpression.Parent; if (parent is AssignmentExpression) { resolvedType = context.ResolveType (((AssignmentExpression)parent).Left); } else if (parent is VariableDeclarationStatement) { resolvedType = context.ResolveType (((VariableDeclarationStatement)parent).Type); } else if (parent is InvocationExpression) { // TODO: handle invocations } if (resolvedType == null) return null; delegateType = context.GetDefinition (resolvedType); if (delegateType == null || delegateType.ClassType != ClassType.Delegate) return null; return anonymousMethodExpression; }
public bool IsValid (RefactoringContext context) { var switchStatement = GetSwitchStatement (context); if (switchStatement == null) return false; var result = context.ResolveType (switchStatement.Expression); if (result == null) return false; var type = context.GetDefinition (result); return type != null && type.ClassType == ClassType.Enum; }
public void Run (RefactoringContext context) { VariableInitializer initializer; var eventDeclaration = GetEventDeclaration (context, out initializer); var type = context.GetDefinition (context.ResolveType (eventDeclaration.ReturnType)); if (type == null) return; var invokeMethod = type.Methods.Where (m => m.Name == "Invoke").FirstOrDefault (); if (invokeMethod == null) return; bool hasSenderParam = false; IEnumerable<IParameter> pars = invokeMethod.Parameters; if (invokeMethod.Parameters.Any ()) { var first = invokeMethod.Parameters [0]; if (first.Name == "sender" /*&& first.Type == "System.Object"*/) { hasSenderParam = true; pars = invokeMethod.Parameters.Skip (1); } } const string handlerName = "handler"; var arguments = new List<Expression> (); if (hasSenderParam) arguments.Add (new ThisReferenceExpression ()); foreach (var par in pars) arguments.Add (new IdentifierExpression (par.Name)); var methodDeclaration = new MethodDeclaration () { Name = "On" + initializer.Name, ReturnType = context.CreateShortType (eventDeclaration.ReturnType), Modifiers = ICSharpCode.NRefactory.CSharp.Modifiers.Protected | ICSharpCode.NRefactory.CSharp.Modifiers.Virtual, Body = new BlockStatement () { new VariableDeclarationStatement (context.CreateShortType (eventDeclaration.ReturnType), handlerName, new MemberReferenceExpression (new ThisReferenceExpression (), initializer.Name)), new IfElseStatement () { Condition = new BinaryOperatorExpression (new IdentifierExpression (handlerName), BinaryOperatorType.InEquality, new PrimitiveExpression (null)), TrueStatement = new ExpressionStatement (new InvocationExpression (new IdentifierExpression (handlerName), arguments)) } } }; foreach (var par in pars) { var typeName = context.CreateShortType (par.Type.Resolve (context.TypeResolveContext)); var decl = new ParameterDeclaration (typeName, par.Name); methodDeclaration.Parameters.Add (decl); } using (var script = context.StartScript ()) { script.InsertWithCursor ("Create event invocator", methodDeclaration, Script.InsertPosition.After); } }
public void Run (RefactoringContext context) { var switchStatement = GetSwitchStatement (context); var result = context.ResolveType (switchStatement.Expression); var type = context.GetDefinition (result); var newSwitch = (SwitchStatement)switchStatement.Clone (); var target = new TypeReferenceExpression (context.CreateShortType (result)); foreach (var field in type.Fields) { if (field.IsSynthetic || !field.IsConst) continue; newSwitch.SwitchSections.Add (new SwitchSection () { CaseLabels = { new CaseLabel (new MemberReferenceExpression (target.Clone (), field.Name)) }, Statements = { new BreakStatement () } }); } newSwitch.SwitchSections.Add (new SwitchSection () { CaseLabels = { new CaseLabel () }, Statements = { new ThrowStatement (new ObjectCreateExpression (context.CreateShortType ("System.ArgumentOutOfRangeException"))) } }); using (var script = context.StartScript ()) { script.Replace (switchStatement, newSwitch); } }