CodeAction CreateFromExpression(RefactoringContext context, Expression expression) { var resolveResult = context.Resolve(expression); if (resolveResult.IsError) return null; return new CodeAction(context.TranslateString("Extract method"), script => { string methodName = "NewMethod"; var method = new MethodDeclaration { ReturnType = context.CreateShortType(resolveResult.Type), Name = methodName, Body = new BlockStatement { new ReturnStatement(expression.Clone()) } }; if (!StaticVisitor.UsesNotStaticMember(context, expression)) method.Modifiers |= Modifiers.Static; var usedVariables = VariableLookupVisitor.Analyze(context, expression); var inExtractedRegion = new VariableUsageAnalyzation (context, usedVariables); usedVariables.Sort ((l, r) => l.Region.Begin.CompareTo (r.Region.Begin)); var target = new IdentifierExpression(methodName); var invocation = new InvocationExpression(target); foreach (var variable in usedVariables) { Expression argumentExpression = new IdentifierExpression(variable.Name); var mod = ParameterModifier.None; if (inExtractedRegion.GetStatus (variable) == VariableState.Changed) { mod = ParameterModifier.Ref; argumentExpression = new DirectionExpression(FieldDirection.Ref, argumentExpression); } method.Parameters.Add(new ParameterDeclaration(context.CreateShortType(variable.Type), variable.Name, mod)); invocation.Arguments.Add(argumentExpression); } script .InsertWithCursor(context.TranslateString("Extract method"), Script.InsertPosition.Before, method) .ContinueScript (delegate { script.Replace(expression, invocation); script.Link(target, method.NameToken); }); }, expression); }
public Argument Clone(CloneContext clonectx) { return(Clone(Expr.Clone(clonectx))); }
protected override void CloneTo(CloneContext clonectx, Expression target) { var t = (Await)target; t.expr = expr.Clone(clonectx); }
protected override void CloneTo(CloneContext clonectx, Expression t) { var target = (AsDelete)t; target.Expr = Expr.Clone(clonectx); }
protected override void CloneTo(CloneContext clonectx, Statement target) { var t = target as AsNonAssignStatementExpression; t.expr = expr.Clone(clonectx); }
protected override void CloneTo(CloneContext clonectx, Statement t) { Yield target = (Yield)t; target.expr = expr.Clone(clonectx); }
protected override void CloneTo (CloneContext clonectx, Expression t) { StackAlloc target = (StackAlloc) t; target.count = count.Clone (clonectx); target.t = t.Clone (clonectx); }
protected override void CloneTo(CloneContext clonectx, Statement t) { var target = (YieldReturnStatement <T>)t; target.expr = expr.Clone(clonectx); }